ʻO wau kekahi o nā mea hoʻomohala o ka ʻōnaehana hana
Inā ʻoe e paʻi i kekahi mea e like me "OpenCV ma ka papa STM32" i loko o kahi ʻenekini huli, hiki iā ʻoe ke loaʻa i kekahi poʻe hoihoi e hoʻohana i kēia waihona ma nā papa STM32 a i ʻole nā microcontrollers ʻē aʻe.
He nui nā wikiō, e hoʻoholo ana i ka inoa, e hōʻike i ka mea e pono ai, akā maʻamau (i nā wikiō āpau aʻu i ʻike ai) ma ka papa STM32, loaʻa wale ke kiʻi mai ke kāmela a hōʻike ʻia ka hopena ma ka pale, a ua hana ʻia ka hoʻoili kiʻi iā ia iho ma ke kamepiula maʻamau, a i ʻole ma nā papa ikaika (e laʻa, Raspberry Pi).
No ke aha he paʻakikī?
Ua wehewehe ʻia ka kaulana o nā nīnau hulina ma ka ʻoiaʻiʻo ʻo OpenCV ka waihona ʻike kamepiula kaulana loa, ʻo ia hoʻi, ʻoi aku ka nui o nā mea hoʻomohala i kamaʻāina iā ia, a ʻo ka hiki ke holo i ka papa kuhikuhi papakaukau ma kahi microcontroller e maʻalahi loa i ke kaʻina hana. Akā, no ke aha i loaʻa ʻole nā mea hoʻomaʻamaʻa kaulana i hoʻomākaukau ʻia no ka hoʻoponopono ʻana i kēia pilikia?
ʻO ka pilikia o ka hoʻohana ʻana iā OpenCV ma nā shawl liʻiliʻi e pili ana i ʻelua mau hiʻohiʻona:
- Inā ʻoe e hōʻuluʻulu i ka waihona me ka liʻiliʻi liʻiliʻi o nā modules, ʻaʻole ia e komo i ka hoʻomanaʻo flash o ka STM32F7Discovery (ʻoiai me ka ʻole o ka noʻonoʻo ʻana i ka OS) ma muli o kahi code nui loa (he mau megabytes o nā kuhikuhi).
- Ua kākau ʻia ka waihona ma C ++, ʻo ia hoʻi
- Pono ke kākoʻo no ka manawa holo maikaʻi (koe, etc.)
- Kākoʻo liʻiliʻi no LibC/Posix, ka mea maʻamau i loaʻa i ka OS no nā ʻōnaehana hoʻopili - pono ʻoe i kahi waihona waihona maʻamau a me kahi waihona waihona STL maʻamau (vector, etc.)
Ka lawe ʻana i ka Embox
E like me ka mea maʻamau, ma mua o ka lawe ʻana i nā polokalamu i ka ʻōnaehana hana, he mea maikaʻi e hoʻāʻo e kūkulu iā ia ma ke ʻano i manaʻo ʻia e nā mea hoʻomohala. I kā mākou hihia, ʻaʻohe pilikia me kēia - hiki ke loaʻa ke kumu kumu ma
ʻO ka nūhou maikaʻi, hiki ke kūkulu ʻia ʻo OpenCV ma ke ʻano he hale waihona puke ma waho o ka pahu, kahi e maʻalahi ai ka lawe ʻana. E hōʻiliʻili mākou i kahi waihona me kahi hoʻonohonoho maʻamau a ʻike i ka nui o nā wahi a lākou e lawe ai. ʻOhi ʻia kēlā me kēia module i loko o kahi waihona ʻokoʻa.
> 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)
E like me kāu e ʻike ai mai ka laina hope loa, ʻaʻole lawe nui ka .bss a me .data, akā ʻoi aku ka code ma mua o 70 MiB. Ua maopopo inā pili kēia i kahi noi kikoʻī, e emi ana ke code.
E hoʻāʻo mākou e hoʻolei i nā modula he nui i hiki ke hōʻuluʻulu ʻia kahi hiʻohiʻona liʻiliʻi (ʻo ia, no ka laʻana, e hoʻopuka wale i ka OpenCV version), no laila ke nānā nei mākou cmake .. -LA
a hoʻopau i nā koho i nā mea a pau e pio.
-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)
Ma ka ʻaoʻao hoʻokahi, hoʻokahi wale nō module o ka waihona, ma ka ʻaoʻao ʻē aʻe, ʻaʻole kēia me ka hoʻonui ʻana i ka compiler no ka nui code (-Os
). ~ 3 MiB o ke code he nui loa, akā hāʻawi mua i ka manaolana no ka kūleʻa.
Holo i ka emulator
ʻOi aku ka maʻalahi o ka debug ma ka emulator, no laila e ʻike mua i ka hana ʻana o ka waihona ma qemu. Ma ke ʻano he kahua i hoʻohālikelike ʻia, ua koho wau iā Integrator / CP, no ka mea ʻO ka mea mua, ʻo ia nō ka ARM, a ʻo ka lua, kākoʻo ʻo Embox i nā kiʻi kiʻi no kēia kahua.
Loaʻa iā Embox kahi hana no ke kūkulu ʻana i nā hale waihona puke o waho, me ka hoʻohana ʻana iā ia e hoʻohui mākou iā OpenCV ma ke ʻano he module (e hāʻawi ana i nā koho like ʻole no ka hale "liʻiliʻi" ma ke ʻano o nā hale waihona puke), a laila hoʻohui wau i kahi noi maʻalahi e like me kēia:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Hoʻohui mākou i ka ʻōnaehana, holo - loaʻa iā mākou ka hopena i manaʻo ʻia.
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 включены в сборку и т.п.>
ʻO ka hana aʻe e holo i kekahi laʻana, ʻoi aku ka maikaʻi o kekahi o nā mea maʻamau i hāʻawi ʻia e nā mea hoʻomohala ponoʻī.
Pono e kākau hou ʻia ka laʻana no ka hōʻike ʻana i ke kiʻi me ka hopena pololei i loko o ka pahu pahu. Pono wau e hana i kēia, no ka mea. hana imshow()
Hiki iā ia ke kaha kiʻi ma o ka QT, GTK a me Windows interfaces, ʻoiaʻiʻo, ʻaʻole ia i loko o ka config no STM32. ʻOiaʻiʻo, hiki ke holo ʻia ka QT ma STM32F7Discovery, akā e kūkākūkā ʻia kēia ma kekahi ʻatikala 🙂
Ma hope o ka wehewehe pōkole ʻana i ke ʻano i mālama ʻia ka hopena o ka ʻike maka, loaʻa iā mākou kahi kiʻi.
kiʻi kumu
hopena
E holo ana ma STM32F7Discovery
Ma ka 32F746GDISCOVERY he nui nā ʻāpana hoʻomanaʻo hardware hiki iā mākou ke hoʻohana i kekahi ala a i ʻole.
- 320KiB RAM
- 1MiB flash no ke kiʻi
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- slot kāleka microSD
Hiki ke hoʻohana ʻia kahi kāleka SD e mālama i nā kiʻi, akā i ke ʻano o ka holo ʻana i kahi hiʻohiʻona liʻiliʻi, ʻaʻole pono kēia.
ʻO ka hōʻike he 480 × 272 hoʻonā, ʻo ia hoʻi, ʻo ka hoʻomanaʻo framebuffer he 522 bytes ma kahi hohonu o 240 bits, ʻo ia hoʻi. ʻOi aku kēia ma mua o ka nui o ka RAM, no laila ʻo ka framebuffer a me ka puʻu (e koi ʻia, me OpenCV, e mālama i ka ʻikepili no nā kiʻi a me nā hale kōkua) e loaʻa i SDRAM, nā mea āpau (hoʻomanaʻo no nā stacks a me nā pono ʻē aʻe. ) e hele i ka RAM.
Inā lawe mākou i ka hoʻonohonoho liʻiliʻi loa no STM32F7Discovery (hoʻolei i ka pūnaewele holoʻokoʻa, nā kauoha āpau, e hana i nā pūʻulu liʻiliʻi e like me ka hiki, a me nā mea ʻē aʻe) a hoʻohui iā OpenCV me nā hiʻohiʻona ma laila, ʻo ka hoʻomanaʻo pono e like me kēia:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
No ka poe i kamaaina ole i na pauku hea, e wehewehe au: in .text
и .rodata
ʻO nā ʻōlelo aʻo a me nā mea mau (ma ka ʻōlelo ʻana, ka ʻikepili heluhelu wale nō) aia i loko .data
hiki ke loli ka ʻikepili, .bss
aia nā ʻano "nulled", akā naʻe, pono kahi wahi (e "hele" kēia ʻāpana i RAM).
ʻO ka nūhou maikaʻi kēlā .data
/.bss
kupono, aka me .text
ʻO ka pilikia he 1MiB wale nō ka hoʻomanaʻo no ke kiʻi. Hiki ke kiola ʻia i waho .text
ke kiʻi mai ka laʻana a heluhelu ia, no ka laʻana, mai ke kāleka SD i ka hoʻomanaʻo i ka hoʻomaka ʻana, akā ke kaupaona ʻo fruits.png ma kahi o 330KiB, no laila ʻaʻole kēia e hoʻonā i ka pilikia: ka hapa nui .text
aia i ka OpenCV code.
Ma ka nui, hoʻokahi wale nō mea i koe - e hoʻouka ana i kahi ʻāpana o ke code ma kahi flash QSPI (he ʻano hana kūikawā no ka hoʻomanaʻo ʻana i ka hoʻomanaʻo ʻana i ke kaʻa ʻōnaehana, i hiki i ka mea hana ke komo pololei i kēia ʻikepili). I kēia hihia, kū mai kahi pilikia: ʻo ka mea mua, ʻaʻole i loaʻa ka hoʻomanaʻo o kahi flash drive QSPI ma hope koke o ka hoʻomaka ʻana o ka hāmeʻa (pono ʻoe e hoʻokaʻawale i ke ʻano hoʻomanaʻo-mapped mode), a ʻo ka lua, ʻaʻole hiki iā ʻoe ke "flash" i kēia hoʻomanaʻo me he bootloader kamaʻāina.
ʻO ka hopena, ua hoʻoholo ʻia e hoʻopili i nā code a pau ma QSPI, a uila iā ia me kahi loader kākau ponoʻī e loaʻa i ka binary pono ma o TFTP.
hopena
Ua ʻike ʻia ka manaʻo e lawe i kēia waihona iā Embox ma kahi o hoʻokahi makahiki i hala, akā ua hoʻopanee pinepine ʻia ma muli o nā kumu like ʻole. ʻO kekahi o lākou ke kākoʻo no libstdc ++ a me ka waihona waihona maʻamau. ʻO ka pilikia o ke kākoʻo C ++ ma Embox ma waho aʻe o ke ʻano o kēia ʻatikala, no laila e ʻōlelo wale wau ua hoʻokō mākou i kēia kākoʻo i ka nui kūpono no kēia waihona e hana 🙂
I ka hopena, ua lanakila kēia mau pilikia (ma ka liʻiliʻi loa no ka hana OpenCV e hana), a holo ka laʻana. He 40 kekona lōʻihi no ka ʻimi ʻana o ka papa i nā palena me ka kānana Canny. ʻO kēia, ʻoiaʻiʻo, lōʻihi loa (aia nā noʻonoʻo e pili ana i ka hoʻomaikaʻi ʻana i kēia mea, hiki ke kākau i kahi ʻatikala ʻokoʻa e pili ana i kēia inā e kūleʻa).
Eia naʻe, ʻo ka pahuhopu waena ka hana ʻana i kahi prototype e hōʻike ana i ka hiki ke holo i ka OpenCV ma STM32, kēlā me kēia, ua hoʻokō ʻia kēia pahuhopu, hooray!
tl;dr: nā ʻōlelo kuhikuhi i kēlā me kēia pae
0: Hoʻoiho i nā kumu Embox, e like me kēia:
git clone https://github.com/embox/embox && cd ./embox
1: E hoʻomaka kākou ma ka hoʻohui ʻana i kahi bootloader e "flash" a QSPI flash drive.
make confload-arm/stm32f7cube
I kēia manawa pono ʻoe e hoʻonohonoho i ka pūnaewele, no ka mea. E hoʻouka mākou i ke kiʻi ma o TFTP. No ka hoʻonohonoho ʻana i ka papa a me ka hoʻokipa IP, pono ʻoe e hoʻoponopono i ka conf/rootfs/network.
Laʻana hoʻonohonoho:
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
- ka helu hoʻokipa mai kahi e hoʻouka ʻia ai ke kiʻi, address
- helu wahi o ka papa.
Ma hope o kēlā, hōʻiliʻili mākou i ka bootloader:
make
2: ʻO ka hoʻouka maʻamau o ka bootloader (e kala mai no ka pun) ma ka papa - ʻaʻohe mea kikoʻī ma aneʻi, pono ʻoe e hana e like me nā noi ʻē aʻe no STM32F7Discovery. Inā ʻaʻole ʻoe maopopo pehea e hana ai, hiki iā ʻoe ke heluhelu e pili ana
3: Hoʻopili i kahi kiʻi me kahi config no OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Wehe mai nā ʻāpana ELF e kākau ʻia i QSPI i 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
Aia kahi palapala ma ka papa kuhikuhi conf e hana i kēia, no laila hiki iā ʻoe ke holo
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Me ka hoʻohana ʻana i ka tftp, hoʻoiho i ka qspi.bin.bin i kahi pahu uila QSPI. Ma ka mea hoʻokipa, e hana i kēia, kope qspi.bin i ka waihona kumu o ka server tftp (maʻamau / srv/tftp/ a i ʻole /var/lib/tftpboot/; loaʻa nā pūʻolo no ka server pili i nā māhele kaulana loa, i kapa pinepine ʻia. tftpd a i ʻole tftp-hpa, i kekahi manawa pono ʻoe e hana systemctl start tftpd.service
e hoʻomaka).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Ma ka Embox (ʻo ia hoʻi i ka bootloader), pono ʻoe e hoʻokō i kēia kauoha (manaʻo mākou aia ka server i ka helu 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Me ke kauoha goto
pono ʻoe e "lele" i ka hoʻomanaʻo QSPI. E ʻokoʻa ka wahi kikoʻī ma muli o ka pili ʻana o ke kiʻi, hiki iā ʻoe ke ʻike i kēia helu me ke kauoha mem 0x90000000
(ua pili ka helu hoʻomaka i ka huaʻōlelo 32-bit ʻelua o ke kiʻi); e pono no hoi oe e hae i ka ahu -s
, aia ka helu helu ma 0x90000000, laʻana:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Hoʻomaka
embox> edges 20
a hauʻoli i ka huli palena 40-kekona 🙂
Inā hewa kekahi mea - e kākau i kahi pilikia ma
Source: www.habr.com