Mwen se youn nan devlopè sistèm operasyon an
Si ou tape yon bagay tankou "OpenCV sou tablo STM32" nan yon motè rechèch, ou ka jwenn anpil moun ki enterese nan sèvi ak bibliyotèk sa a sou tablo STM32 oswa lòt mikrokontwolè.
Gen plizyè videyo ki, jije pa non an, ta dwe demontre sa ki nesesè, men anjeneral (nan tout videyo yo ke mwen te wè) sou tablo a STM32, se sèlman imaj la te resevwa nan men kamera a ak rezilta a te parèt sou ekran an, ak pwosesis imaj la tèt li te fè swa sou yon òdinatè regilye, oswa sou tablo ki pi pwisan (pa egzanp, Franbwaz Pi).
Poukisa li difisil?
Popilarite rechèch rechèch yo eksplike pa lefèt ke OpenCV se bibliyotèk vizyon òdinatè ki pi popilè, ki vle di ke plis devlopè yo abitye ak li, ak kapasite nan kouri kòd Desktop-pare sou yon mikrokontroleur anpil senplifye pwosesis devlopman an. Men, poukisa toujou pa gen resèt popilè pare pou rezoud pwoblèm sa a?
Pwoblèm nan lè l sèvi avèk OpenCV sou ti chal gen rapò ak de karakteristik:
- Si ou konpile bibliyotèk la menm ak yon seri minim modil, li tou senpleman pa pral anfòm nan memwa flash nan menm STM32F7Discovery (menm san yo pa pran an kont eksplwatasyon an) akòz yon kòd trè gwo (plizyè megabyte nan enstriksyon)
- Bibliyotèk la li menm ekri nan C++, ki vle di
- Bezwen sipò pou yon tan pozitif (eksepsyon, elatriye)
- Ti sipò pou LibC/Posix, ki anjeneral yo jwenn nan OS pou sistèm entegre - ou bezwen yon bibliyotèk estanda plis ak yon bibliyotèk modèl STL estanda (vektè, elatriye)
Pòt nan Embbox
Kòm dabitid, anvan ou pote nenpòt pwogram nan sistèm operasyon an, li se yon bon lide pou eseye bati li nan fòm nan ki devlopè yo te gen entansyon li. Nan ka nou an, pa gen okenn pwoblèm ak sa a - ou ka jwenn kòd sous la sou
Bon nouvèl la se ke OpenCV ka bati kòm yon bibliyotèk estatik soti nan bwat la, ki fè pòtaj pi fasil. Nou kolekte yon bibliyotèk ak yon konfigirasyon estanda epi wè konbyen espas yo pran. Chak modil kolekte nan yon bibliyotèk separe.
> 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)
Kòm ou ka wè nan dènye liy lan, .bss ak .data pa pran anpil espas, men kòd la se plis pase 70 MiB. Li klè ke si sa a se statikman lye nan yon aplikasyon espesifik, kòd la ap vin pi piti.
Ann eseye jete anpil modil ke posib pou yon egzanp minim reyini (ki, pou egzanp, pral tou senpleman soti vèsyon an OpenCV), kidonk nou gade. cmake .. -LA
epi fèmen nan opsyon yo tout bagay ki etenn.
-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)
Sou yon bò, sa a se sèlman yon modil nan bibliyotèk la, nan lòt men an, sa a se san yo pa optimize du pou gwosè kòd (-Os
). ~3 MiB nan kòd se toujou byen anpil, men deja bay espwa pou siksè.
Kouri nan Emulation la
Li pi fasil pou debogaj sou Emulation a, kidonk premye asire w ke bibliyotèk la ap travay sou qemu. Kòm yon platfòm imite, mwen te chwazi Integrator / CP, paske premyèman, li se tou ARM, ak dezyèmman, Embbox sipòte pwodiksyon grafik pou platfòm sa a.
Embox gen yon mekanis pou bati bibliyotèk ekstèn, lè l sèvi avèk li nou ajoute OpenCV kòm yon modil (pase tout opsyon yo menm pou bati "minimòm" nan fòm nan bibliyotèk estatik), apre sa mwen ajoute yon aplikasyon senp ki sanble sa a:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Nou rasanble sistèm nan, kouri li - nou jwenn pwodiksyon an espere.
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 включены в сборку и т.п.>
Pwochen etap la se kouri kèk egzanp, de preferans youn nan estanda yo ofri pa devlopè yo tèt yo.
Egzanp la te dwe yon ti kras reekri pou montre imaj la ak rezilta a dirèkteman nan tanpon ankadreman an. Mwen te oblije fè sa, paske. fonksyon imshow()
ka trase imaj atravè entèfas QT, GTK ak Windows, ki, nan kou, definitivman pa pral nan konfigirasyon an pou STM32. An reyalite, QT ka kouri tou sou STM32F7Discovery, men sa a pral diskite nan yon lòt atik 🙂
Apre yon klarifikasyon kout nan ki fòma rezilta detektè kwen an estoke, nou jwenn yon imaj.
foto orijinal la
Rezilta
Kouri sou STM32F7Discovery
Sou 32F746GDISCOVERY gen plizyè seksyon memwa pyès ki nan konpitè ke nou ka itilize yon fason oswa yon lòt
- 320 KiB RAM
- 1MiB flash pou imaj
- 8 MiB SDRAM
- 16MiB QSPI NAND Flash
- emplacement kat microSD
Yon kat SD ka itilize nan magazen imaj, men nan yon kontèks kouri yon egzanp minim, sa a pa trè itil.
Ekspozisyon an gen yon rezolisyon 480 × 272, ki vle di ke memwa framebuffer la pral 522 bytes nan yon pwofondè 240 bits, i.e. sa a se pi plis pase gwosè a nan RAM, kidonk framebuffer la ak pil wòch la (ki pral oblije, ki gen ladan pou OpenCV, nan magazen done pou imaj ak estrikti oksilyè) yo pral lokalize nan SDRAM, tout lòt bagay (memwa pou pil ak lòt bezwen sistèm). ) pral ale nan RAM .
Si nou pran konfigirasyon minimòm lan pou STM32F7Discovery (jete tout rezo a, tout kòmandman yo, fè pil pi piti ke posib, elatriye) epi ajoute OpenCV ak egzanp la, memwa ki nesesè yo pral jan sa a:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Pou moun ki pa trè abitye ak ki seksyon ale kote, mwen pral eksplike: nan .text
и .rodata
enstriksyon ak konstan (apeprè pale, done lekti sèlman) kouche nan .data
done yo chanje, .bss
gen "anile" varyab, ki, poutan, bezwen yon plas (seksyon sa a pral "ale" nan RAM).
Bon nouvèl la se sa .data
/.bss
ta dwe anfòm, men ak .text
pwoblèm nan se ke gen sèlman 1MiB nan memwa pou imaj la. Èske yo ka jete deyò .text
foto a nan egzanp lan epi li li, pou egzanp, soti nan kat SD la nan memwa nan demaraj, men fruits.png peze sou 330KiB, kidonk sa a pa pral rezoud pwoblèm nan: pi fò. .text
konsiste de kòd OpenCV.
An jeneral, gen yon sèl bagay ki rete - chaje yon pati nan kòd la sou yon flash QSPI (li gen yon mòd operasyon espesyal pou kat memwa nan bis sistèm lan, pou ke processeur a ka jwenn aksè nan done sa yo dirèkteman). Nan ka sa a, yon pwoblèm rive: premyèman, memwa a nan yon kondwi flash QSPI pa disponib imedyatman apre aparèy la rdemare (ou bezwen separeman inisyalize mòd nan memwa-map), epi dezyèmman, ou pa ka "flash" memwa sa a ak yon bootloader abitye.
Kòm yon rezilta, li te deside konekte tout kòd la nan QSPI, ak flash li ak yon loader pwòp tèt ou-ekri ki pral resevwa binè ki nesesè yo atravè TFTP.
Rezilta
Lide pou pòtab bibliyotèk sa a nan Embox te parèt anviwon yon ane de sa, men li te ranvwaye ankò pou plizyè rezon. Youn nan yo se sipò pou libstdc++ ak bibliyotèk modèl estanda a. Pwoblèm sipò C++ nan Embbox depase limit atik sa a, kidonk isit la mwen pral sèlman di ke nou te rive jwenn sipò sa a nan bon kantite lajan pou bibliyotèk sa a travay 🙂
Nan fen a, pwoblèm sa yo te simonte (omwen ase pou egzanp OpenCV la travay), ak egzanp lan kouri. Li pran 40 segonn long pou tablo a chèche limit lè l sèvi avèk filtè Canny la. Sa a, nan kou, se twò lontan (gen konsiderasyon sou kòman yo optimize pwoblèm sa a, li pral posib yo ekri yon atik separe sou sa a nan ka ta gen siksè).
Sepandan, objektif entèmedyè a se te kreye yon pwototip ki pral montre posiblite fondamantal nan kouri OpenCV sou STM32, respektivman, objektif sa a te reyalize, hoora!
tl; dr: etap pa etap enstriksyon yo
0: Telechaje sous Embbox, tankou sa a:
git clone https://github.com/embox/embox && cd ./embox
1: Ann kòmanse pa rasanble yon bootloader ki pral "flash" yon kondwi flash QSPI.
make confload-arm/stm32f7cube
Koulye a, ou bezwen configured rezo a, paske. Nou pral telechaje imaj la atravè TFTP. Pou mete tablo a ak adrès IP lame, ou bezwen edite konf/rootfs/rezo a.
Egzanp konfigirasyon:
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
- adrès lame kote imaj la pral chaje, address
- adrès tablo a.
Apre sa, nou kolekte bootloader la:
make
2: abityèl chaje bootloader a (rekize pou Pun la) sou tablo a - pa gen anyen espesifik isit la, ou bezwen fè li tankou pou nenpòt lòt aplikasyon pou STM32F7Discovery. Si ou pa konnen ki jan fè li, ou ka li sou li
3: Konpile yon imaj ak yon konfigirasyon pou OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Ekstrè nan seksyon ELF yo dwe ekri nan QSPI nan 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
Gen yon script nan anyè a konf ki fè sa, kidonk, ou ka kouri li
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Sèvi ak tftp, telechaje qspi.bin.bin nan yon kondwi flash QSPI. Sou lame a, pou w fè sa, kopye qspi.bin nan katab rasin sèvè tftp la (anjeneral /srv/tftp/ oswa /var/lib/tftpboot/; pakè pou sèvè korespondan an disponib nan distribisyon ki pi popilè yo, anjeneral yo rele. tftpd oswa tftp-hpa, pafwa ou dwe fè systemctl start tftpd.service
Komanse).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Sou Embbox (sa vle di nan bootloader la), ou bezwen egzekite lòd sa a (nou sipoze ke sèvè a gen adrès 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Avèk lòd goto
ou bezwen "sote" nan memwa QSPI. Kote espesifik la pral varye selon ki jan imaj la lye, ou ka wè adrès sa a ak lòd la mem 0x90000000
(adrès kòmansman an adapte nan dezyèm mo 32-bit nan imaj la); w ap bezwen tou drapo pil la -s
, adrès pil la se nan 0x90000000, egzanp:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Lanse
embox> edges 20
epi jwi rechèch fwontyè 40 segonn 🙂
Si yon bagay ale mal - ekri yon pwoblèm nan
Sous: www.habr.com