Tá mé ar cheann de na forbróirí córais oibriúcháin
Má chlóscríobhann tú rud éigin cosúil le “OpenCV ar bord STM32” in inneall cuardaigh, gheobhaidh tú go leor daoine ar spéis leo an leabharlann seo a úsáid ar chláir STM32 nó ar mhicririalaitheoirí eile.
Tá roinnt físeáin ann ar cheart, ag meas an teidil, a bhfuil ag teastáil a léiriú, ach de ghnáth (i ngach físeán a chonaic mé) ar an mbord STM32, gan ach íomhá a fháil ón gceamara agus an toradh a thaispeáint ar an scáileán, agus an rinneadh próiseáil íomhá féin ar ríomhaire rialta, nó ar chláir níos cumhachtaí (mar shampla, Raspberry Pi).
Cén fáth go bhfuil sé seo deacair?
Mínítear an tóir a bhí ar cheisteanna cuardaigh ag an bhfíric gurb é OpenCV an leabharlann fís ríomhaire is mó tóir, rud a chiallaíonn go bhfuil níos mó forbróirí eolach air, agus go simplíonn an cumas cód réidh le deasc a reáchtáil ar microcontroller an próiseas forbartha go mór. Ach cén fáth nach bhfuil aon oidis réamhdhéanta coitianta ann go fóill chun an fhadhb seo a réiteach?
Baineann an fhadhb le húsáid OpenCV ar chláir bheaga le dhá ghné:
- Má thiomsaíonn tú an leabharlann fiú le sraith íosta de mhodúil, ní bheidh sé oiriúnach go simplí i gcuimhne flash an STM32F7Discovery céanna (fiú gan cur san áireamh an OS) mar gheall ar an gcód an-mhór (roinnt meigibheart treoracha)
- Tá an leabharlann féin scríofa i C++, rud a chiallaíonn
- Teastaíonn tacaíocht uainn le haghaidh am rite dearfach (eisceachtaí, etc.)
- Is beag tacaíocht a thugtar do LibC/Posix, a fhaightear go hiondúil in OSanna do chórais leabaithe - teastaíonn leabharlann móide caighdeánach uait agus leabharlann teimpléad caighdeánach STL (veicteoir, etc.)
Á aistriú chuig Embox
Mar is gnách, sula ndéantar aon chláir a aistriú chuig an gcóras oibriúcháin, is smaoineamh maith é iarracht a dhéanamh é a thiomsú san fhoirm a raibh sé beartaithe ag na forbróirí é. Inár gcás, níl aon fadhbanna leis seo - is féidir an cód foinse a fháil ag
Is é an dea-scéal ná gur féidir OpenCV a thógáil amach as an mbosca mar leabharlann statach, rud a fhágann gur fusa é a iompar. Cuirimid an leabharlann le chéile leis an gcumraíocht chaighdeánach agus feicimid cé mhéad spáis a thógann sé. Cuirtear gach modúl le chéile i leabharlann ar leith.
> size lib/*so --totals
text data bss dec hex filename
1945822 15431 960 1962213 1df0e5 lib/libopencv_calib3d.so
17081885 170312 25640 17277837 107a38d lib/libopencv_core.so
10928229 137640 20192 11086061 a928ed lib/libopencv_dnn.so
842311 25680 1968 869959 d4647 lib/libopencv_features2d.so
423660 8552 184 432396 6990c lib/libopencv_flann.so
8034733 54872 1416 8091021 7b758d lib/libopencv_gapi.so
90741 3452 304 94497 17121 lib/libopencv_highgui.so
6338414 53152 968 6392534 618ad6 lib/libopencv_imgcodecs.so
21323564 155912 652056 22131532 151b34c lib/libopencv_imgproc.so
724323 12176 376 736875 b3e6b lib/libopencv_ml.so
429036 6864 464 436364 6a88c lib/libopencv_objdetect.so
6866973 50176 1064 6918213 699045 lib/libopencv_photo.so
698531 13640 160 712331 ade8b lib/libopencv_stitching.so
466295 6688 168 473151 7383f lib/libopencv_video.so
315858 6972 11576 334406 51a46 lib/libopencv_videoio.so
76510375 721519 717496 77949390 4a569ce (TOTALS)
Mar a fheiceann tú ón líne dheireanach, ní thógann .bss agus .data mórán spáis, ach tá an cód níos mó ná 70 MiB. Tá sé soiléir má tá sé seo nasctha go statach le feidhmchlár ar leith, beidh níos lú cód ann.
Déanaimis iarracht an oiread modúil agus is féidir a chaitheamh amach chun sampla íosta a chruthú (a thaispeánfaidh, mar shampla, an leagan OpenCV go simplí), mar sin déanaimis féachaint cmake .. -LA
agus gach rud atá faoi mhíchumas a dhíchumasú sna roghanna.
-DBUILD_opencv_java_bindings_generator=OFF
-DBUILD_opencv_stitching=OFF
-DWITH_PROTOBUF=OFF
-DWITH_PTHREADS_PF=OFF
-DWITH_QUIRC=OFF
-DWITH_TIFF=OFF
-DWITH_V4L=OFF
-DWITH_VTK=OFF
-DWITH_WEBP=OFF
<...>
> size lib/libopencv_core.a --totals
text data bss dec hex filename
3317069 36425 17987 3371481 3371d9 (TOTALS)
Ar thaobh amháin, níl anseo ach modúl leabharlainne amháin, ar an láimh eile, tá sé seo gan leas iomlán a bhaint as an tiomsaitheoir le haghaidh méid an chóid (-Os
). Tá ~3 MiB de chód go leor fós, ach tugann sé dóchas do rath cheana féin.
Ag rith i aithriseoir
Tá sé i bhfad níos éasca dífhabhtú a dhéanamh ar aithriseoir, mar sin ar dtús déanfaimid cinnte go n-oibríonn an leabharlann ar qemu. Roghnaigh mé Integrator/CP mar an ardán aithrise, toisc... ar an gcéad dul síos, is ARM é freisin, agus ar an dara dul síos, tacaíonn Embox le aschur grafaicí don ardán seo.
Tá meicníocht ag Embox chun leabharlanna seachtracha a thógáil, lena chabhair cuirimid OpenCV mar mhodúl (ag dul thar na roghanna céanna maidir le tionól “íosta” i bhfoirm leabharlanna statacha), agus ina dhiaidh sin cuirim feidhmchlár simplí leis a bhreathnaíonn mar seo:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Cuirimid an córas le chéile, reáchtáilimid é, agus faighimid an t-aschur ionchais.
root@embox:/#opencv_version
OpenCV:
General configuration for OpenCV 4.0.1 =====================================
Version control: bd6927bdf-dirty
Platform:
Timestamp: 2019-06-21T10:02:18Z
Host: Linux 5.1.7-arch1-1-ARCH x86_64
Target: Generic arm-unknown-none
CMake: 3.14.5
CMake generator: Unix Makefiles
CMake build tool: /usr/bin/make
Configuration: Debug
CPU/HW features:
Baseline:
requested: DETECT
disabled: VFPV3 NEON
C/C++:
Built as dynamic libs?: NO
< Дальше идут прочие параметры сборки -- с какими флагами компилировалось,
какие модули OpenCV включены в сборку и т.п.>
Is é an chéad chéim eile ná sampla éigin a rith, b'fhearr sampla caighdeánach éigin a thairgeann na forbróirí iad féin
B'éigean an sampla a athscríobh beagán chun íomhá an toraidh a thaispeáint go díreach isteach sa mhaolán fráma. Bhí orm é seo a dhéanamh mar... feidhm imshow()
Is féidir íomhánna a tharraingt trí chomhéadain QT, GTK agus Windows, nach mbeidh, ar ndóigh, sa chumraíocht le haghaidh STM32. Go deimhin, is féidir QT a reáchtáil ar an STM32F7Discovery freisin, ach pléifear é seo in alt eile :)
Tar éis dúinn a dhéanamh amach go hachomair cén fhormáid ina stóráiltear toradh an bhrathadóra chiumhais, faighimid íomhá.
Pictiúr bunaidh
Toradh
Ar siúl ar STM32F7Discovery
Tá roinnt codanna cuimhne crua-earraí ag an 32F746GDISCOVERY is féidir linn a úsáid ar bhealach amháin nó ar bhealach eile
- RAM 320KB
- Cuimhne flash 1MiB le haghaidh íomhá
- 8MiB SDRAM
- Tiomántán flash 16MiB QSPI NAND
- Sliotán cárta MicroSD
Is féidir cárta SD a úsáid chun íomhánna a stóráil, ach i gcomhthéacs sampla íosta a reáchtáil níl sé seo an-úsáideach.
Tá taifeach 480 × 272 ag an taispeáint, rud a chiallaíonn go mbeidh an chuimhne don mhaolán fráma 522 beart le doimhneacht 240 giotán, i.e. tá sé seo níos mó ná an méid RAM, mar sin beidh an framebuffer agus gcarn (a bheidh ag teastáil, i measc rudaí eile, do OpenCV chun sonraí a stóráil le haghaidh íomhánna agus struchtúir chúnta) a bheith suite i SDRAM, gach rud eile (cuimhne do stoic agus córais eile riachtanais) dul go RAM .
Má thógaimid an t-íosmhéid cumraíochta le haghaidh STM32F7Discovery (caith amach an líonra iomlán, gach ordú, déan stoic chomh beag agus is féidir, etc.) agus cuir OpenCV le samplaí ann, beidh an chuimhne riachtanach mar seo a leanas:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Dóibh siúd nach bhfuil an-eolach ar na hailt a théann i gcás, lig dom a mhíniú: i .text
и .rodata
ina bhfuil treoracha agus tairisigh (sonraí inléite amháin, go garbh), i .data
tá sonraí inathraithe i .bss
tá athróga “nialasacha” ann, a dteastaíonn spás uathu mar sin féin (rachaidh an chuid seo go RAM).
Is é an dea-scéal go .data
/.bss
chóir oiriúnach, ach le .text
Is í an fhadhb atá ann nach bhfuil ach 1MiB de chuimhne don íomhá. Is féidir é a chaitheamh amach .text
íomhá ón sampla agus é a léamh, mar shampla, ó chárta SD i gcuimhne ag am tosaithe, ach torthaí.png meáchan thart ar 330KiB, mar sin ní bheidh an fhadhb a réiteach: an chuid is mó .text
comhdhéanta go beacht de chód OpenCV.
Tríd is tríd, níl ach rud amháin fágtha - cuid den chód a luchtú ar thiomántán splanc QSPI (tá modh oibriúcháin speisialta aige chun cuimhne a mhapáil ar bhus an chórais, ionas gur féidir leis an bpróiseálaí rochtain a fháil ar na sonraí seo go díreach). Sa chás seo, tagann fadhb chun cinn: ar an gcéad dul síos, níl an chuimhne ar thiomántán QSPI flash ar fáil díreach tar éis an gléas a atosú (ní mór modh léarscáilithe cuimhne a thosú ar leithligh), agus ar an dara dul síos, tá sé dodhéanta an chuimhne seo a "splancadh" leis an tosaitheoir gnáth.
Mar thoradh air sin, socraíodh an cód go léir a nascadh le QSPI agus é a splancadh le tosaitheoir féinscríofa, a gheobhaidh an dénártha riachtanach trí TFTP.
Toradh
Tháinig an smaoineamh chun an leabharlann seo a phortáil chuig Embox thart ar bhliain ó shin, ach arís agus arís eile cuireadh siar é mar gheall ar chúiseanna éagsúla. Ar cheann acu tá tacaíocht do libstdc++ agus leabharlann teimpléad caighdeánach. Tá fadhb na tacaíochta C ++ in Embox taobh amuigh de scóip an ailt seo, mar sin ní déarfaidh mé ach gur éirigh linn an tacaíocht seo a bhaint amach chomh fada agus is gá don leabharlann seo a bheith ag obair :)
Faoi dheireadh, sáraíodh na fadhbanna seo (ar a laghad go leor chun go n-oibreodh sampla OpenCV), agus rith an sampla. Tógann sé 40 soicind fada ar an gclár teorainneacha a chuardach ag baint úsáide as an scagaire Canny. Tá sé seo, ar ndóigh, ró-fhada (tá breithniúcháin ar conas an t-ábhar seo a bharrfheabhsú; d’fhéadfaí alt ar leith a scríobh faoi seo má éiríonn leis).
Mar sin féin, ba é an sprioc idirmheánach ná fréamhshamhail a chruthú a thaispeánfadh an fhéidearthacht bhunúsach a bhaineann le OpenCV a reáchtáil ar an STM32, agus mar sin baineadh amach an sprioc seo, Hurray!
tl; dr: treoracha céim ar chéim
0: Íoslódáil foinsí Embox, mar shampla mar seo:
git clone https://github.com/embox/embox && cd ./embox
1: Let tús le chéile bootloader a flash an QSPI tiomáint flash.
make confload-arm/stm32f7cube
Anois ní mór duit an líonra a chumrú, toisc go... Déanfaimid an íomhá a íoslódáil trí TFTP. Chun seoltaí IP an bhoird agus an óstaigh a shocrú, ní mór duit an conf/rootfs/network a chur in eagar.
Sampla cumraíochta:
iface eth0 inet static
address 192.168.2.2
netmask 255.255.255.0
gateway 192.168.2.1
hwaddress aa:bb:cc:dd:ee:02
gateway
— seoladh óstaigh óna luchtófar an íomhá, address
— seoladh boird.
Ina dhiaidh sin cuirimid an bootloader le chéile:
make
2: Gnáthlódáil an bootloader (maith an punt) ar an gclár - aon rud ar leith anseo, ní mór duit é a dhéanamh cosúil le haon fheidhmchlár eile don STM32F7Discovery. Mura bhfuil a fhios agat conas é seo a dhéanamh, is féidir leat léamh faoi
3: Íomhá a thiomsú le cumraíocht do OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Ailt a bhaint as ELF ar gá iad a scríobh chuig QSPI go qspi.bin
arm-none-eabi-objcopy -O binary build/base/bin/embox build/base/bin/qspi.bin
--only-section=.text --only-section=.rodata
--only-section='.ARM.ex*'
--only-section=.data
Tá script san eolaire conf a dhéanann é seo, ionas gur féidir leat é a rith
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Ag baint úsáide as tftp, lódáil qspi.bin.bin ar thiomáint flash QSPI. Ar an ósta, chun é seo a dhéanamh, ní mór duit qspi.bin a chóipeáil chuig an bhfréamhfhillteán den fhreastalaí tftp (go hiondúil / srv/tftp/ nó /var/lib/tftpboot/; tá pacáistí don fhreastalaí comhfhreagrach ar fáil sna dáiltí is coitianta , ar a dtugtar de ghnáth tftpd nó tftp-hpa, uaireanta caithfidh tú a dhéanamh systemctl start tftpd.service
chun tús a chur).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Ar Embox (i.e. sa bootloader) ní mór duit an t-ordú seo a leanas a rith (glaoimid go bhfuil seoladh 192.168.2.1 ag an bhfreastalaí):
embox> qspi_loader qspi.bin 192.168.2.1
6: Ag baint úsáide as ordú goto
ní mór duit “léim” isteach i gcuimhne QSPI. Athróidh an suíomh sonrach ag brath ar an gcaoi a bhfuil an íomhá nasctha, is féidir leat an seoladh seo a fheiceáil leis an ordú mem 0x90000000
(oireann an seoladh tosaigh don dara focal 32-giotán den íomhá); beidh ort freisin an bhratach cruachta a shocrú -s
, tá an seoladh cruachta ag 0x90000000, mar shampla:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Seoladh
embox> edges 20
agus bain sult as an gcuardach 40 soicind le haghaidh teorainneacha :)
Má théann rud éigin mícheart, scríobh ceist chuig
Foinse: will.com