O aʻu o se tasi o atinaʻe o le faiga faʻaogaina
Afai e te taina se mea e pei o le "OpenCV on STM32 board" i totonu o se masini suʻesuʻe, e mafai ona e mauaina ni nai tagata e fiafia e faʻaoga lenei faletusi i luga o laupapa STM32 poʻo isi microcontrollers.
E tele vitio e, faʻamasino i le igoa, e tatau ona faʻaalia le mea e manaʻomia, ae masani lava (i vitio uma na ou vaʻaia) i luga o le laupapa STM32, naʻo le ata na maua mai le mea pueata ma faʻaalia le iʻuga i luga o le lau, ma o le faagasologa o ata lava ia na faia i luga o se komepiuta masani, poʻo luga o laupapa sili atu ona malosi (mo se faʻataʻitaʻiga, Raspberry Pi).
Aisea e faigata ai?
O le taʻutaʻua o suʻesuʻega o loʻo faʻamatalaina e le mea moni o OpenCV o le faletusi vaʻai komepiuta sili ona lauiloa, o lona uiga o le tele o atinaʻe e masani i ai, ma o le mafai ona faʻatautaia le komipiuta-ready code i luga o le microcontroller e faʻafaigofie tele le faʻagasologa o le atinaʻe. Ae aisea e le o iai lava ni fua masani ua saunia mo le foia o lenei faafitauli?
O le faʻafitauli o le faʻaaogaina o OpenCV i luga o laʻau laiti e fesoʻotaʻi ma ni vaega se lua:
- Afai e te tuʻufaʻatasia le faletusi e tusa lava pe itiiti se seti o modules, o le a le fetaui i le flash memory o le STM32F7Discovery tutusa (e tusa lava pe aunoa ma le amanaia o le OS) ona o se numera tele (tele megabytes o faatonuga)
- O le faletusi lava ia e tusia i le C++, o lona uiga
- Manaomia le lagolago mo le lelei o le ta'avale (tuunoa, ma isi)
- Laiti lagolago mo LibC/Posix, lea e masani ona maua i le OS mo faiga fa'apipi'i - e te mana'omia se faletusi fa'aopoopo fa'atasi ma se faletusi fa'ata'ita'i STL (vector, etc.)
Tu'u atu ile Embox
E pei ona masani ai, aʻo leʻi tuʻuina atu soʻo se polokalame i le faiga faʻaogaina, o se manatu lelei le taumafai e fausia i le tulaga na faʻamoemoeina e le au atinaʻe. I la matou tulaga, e leai ni faʻafitauli i lenei mea - o le source code e mafai ona maua i luga
O le tala fiafia o le OpenCV e mafai ona fausia e avea o se faletusi faʻamau i fafo o le atigipusa, lea e faigofie ai le faʻaogaina. Matou te aoina se faletusi o loʻo iai se faʻaoga masani ma vaʻai pe fia le avanoa latou te faʻaogaina. O vaega taitasi e aoina i se faletusi eseese.
> 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 pei ona mafai ona e vaʻaia mai le laina mulimuli, .bss ma .data e le tele avanoa, ae o le code e sili atu i le 70 MiB. E manino lava afai e fesoʻotaʻi faʻatasi lenei mea i se talosaga faʻapitoa, o le a faʻaitiitia le code.
Sei o tatou taumafai e lafo i fafo le tele o modules pe a mafai ina ia faʻapotopotoina se faʻataʻitaʻiga laʻititi (lea, mo se faʻataʻitaʻiga, o le a faʻaalia ai le OpenCV version), o lea matou te vaʻai ai. cmake .. -LA
ma tape i filifiliga mea uma e tape.
-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)
I le tasi itu, e naʻo le tasi le module o le faletusi, i le isi itu, e aunoa ma le faʻapipiʻiina o le faʻapipiʻiina mo le tele o le numera (-Os
). ~ 3 MiB o le code e fai lava si tele, ae ua uma ona maua le faʻamoemoe mo le manuia.
Tamomoe i le emulator
E sili atu ona faigofie le debug i luga o le emulator, ia muamua ia mautinoa o loʻo galue le faletusi i le qemu. I le avea ai o se faʻataʻitaʻiga faʻataʻitaʻiga, na ou filifilia le Integrator / CP, aua muamua, o le ARM foʻi, ma lona lua, Embox lagolago faʻataʻitaʻiga gaioiga mo lenei tulaga.
Embox o loʻo i ai se masini mo le fausiaina o faletusi i fafo, faʻaaogaina matou te faʻaopoopoina OpenCV o se module (tuʻuina uma filifiliga tutusa mo le "laʻititi" fausia i le tulaga o faletusi static), a maeʻa ona ou faʻaopoopoina se talosaga faigofie e pei o lenei:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Matou te faʻapipiʻiina le faiga, faʻatautaia - matou te maua le gaioiga faʻamoemoeina.
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 le isi laasaga o le faʻataʻitaʻiina lea o se faʻataʻitaʻiga, sili atu se tasi o tulaga masani na ofoina mai e le au atinaʻe lava latou.
O le faʻataʻitaʻiga e tatau ona toe tusia teisi e faʻaalia ai le ata ma le taunuuga saʻo i totonu o le faʻavaa paʻu. Sa tatau ona ou faia lenei mea, aua. galuega faatino imshow()
e mafai ona tusi ata e ala i le QT, GTK ma fesoʻotaʻiga Windows, lea, ioe, o le a mautinoa lava e le o iai i totonu o le config mo STM32. O le mea moni, QT e mafai foi ona taʻavale i luga ole STM32F7Discovery, ae o le a talanoaina i se isi tusiga 🙂
A maeʻa se faʻamalamalamaga puʻupuʻu pe o le a le faʻatulagaina o le faʻaiʻuga o le mataʻitusi o loʻo teuina, matou te maua se ata.
ata muamua
iʻuga
Tamomoe ile STM32F7Discovery
I luga ole 32F746GDISCOVERY e tele vaega o mea e manatua ai meafaigaluega e mafai ona tatou faʻaogaina i se tasi auala poʻo se isi.
- 320KiB RAM
- 1MiB moli mo ata
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- slot card microSD
E mafai ona faʻaogaina se kata SD e teu ai ata, ae i le tulaga o le faʻatinoina o se faʻataʻitaʻiga itiiti, e le aoga tele.
O le faʻaaliga o loʻo i ai se iugafono o le 480 × 272, o lona uiga o le framebuffer memory o le a 522 bytes i le loloto o le 240 bits, i.e. e sili atu nai lo le tele o le RAM, o lea o le framebuffer ma le faaputuga (lea o le a manaʻomia, e aofia ai mo OpenCV, e teu ai faʻamatalaga mo ata ma fausaga fesoasoani) o le a tuʻuina i le SDRAM, o isi mea uma (manatua mo faʻaputu ma isi mea manaʻomia. ) o le a alu i le RAM.
Afai tatou te ave le laʻititi laʻititi mo STM32F7Discovery (lafo i fafo le fesoʻotaʻiga atoa, faʻatonuga uma, faʻapipiʻi faʻapipiʻi laʻititi pe a mafai, ma isi) ma faʻaopoopo OpenCV faʻatasi ma faʻataʻitaʻiga iina, o le manaʻoga manaʻomia o le a faʻapea:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Mo i latou e le masani i vaega e alu i ai, o le a ou faʻamatalaina: i .text
и .rodata
o fa'atonuga ma fa'atonuga (pe'ā tautala, na'o fa'amatalaga faitau) o lo'o taoto i totonu .data
o faʻamatalaga e suia, .bss
o loʻo i ai "nulled" fesuiaiga, lea, e ui i lea, e manaʻomia se nofoaga (o lenei vaega o le a "alu" i le RAM).
O le tala fiafia lena .data
/.bss
e tatau ona fetaui, ae ma .text
o le faʻalavelave e naʻo le 1MiB o le manatua mo le ata. E mafai ona lafo i fafo .text
le ata mai le faʻataʻitaʻiga ma faitau i ai, mo se faʻataʻitaʻiga, mai le SD card i le mafaufau i le amataga, ae o fruits.png e tusa ma le 330KiB, o lea e le foia ai le faafitauli: tele .text
e aofia ai le OpenCV code.
I le lautele, e na o le tasi lava le mea o totoe - o le utaina o se vaega o le code i luga o le QSPI flash (o loʻo i ai se faiga faʻapitoa mo le faʻatulagaina o manatuaga i le pasi, ina ia mafai e le processor ona maua saʻo lenei faʻamatalaga). I lenei tulaga, e tulaʻi mai se faʻafitauli: muamua, o le manatua o le QSPI flash drive e le o maua i le taimi lava e toe faʻafouina ai le masini (e te manaʻomia le vavae ese o le faʻasologa o mafaufauga), ma lona lua, e le mafai ona e "momi" lenei manatua ma se bootloader masani.
O le iʻuga, na filifili e faʻafesoʻotaʻi uma le code i le QSPI, ma faʻapipiʻi i se bootloader tusia e le tagata lava ia o le a maua le binary manaʻomia e ala i le TFTP.
iʻuga
O le manatu e momoli lenei faletusi i Embox na aliali mai pe a ma le tausaga talu ai, ae na toe tolopoina ona o mafuaaga eseese. O se tasi oi latou o le lagolago mo libstdc ++ ma le faletusi faʻataʻitaʻi masani. O le faʻafitauli o le C ++ lagolago i Embox e sili atu i le lautele o lenei tusiga, o lea o le a naʻo loʻu fai atu na mafai ona matou ausia lenei lagolago i le aofaʻi saʻo mo lenei faletusi e galue ai 🙂
I le faaiuga, o nei faʻafitauli na faʻatoʻilaloina (a itiiti ifo e lava mo le OpenCV faʻataʻitaʻiga e galue), ma o le faʻataʻitaʻiga na tamoe. E manaʻomia le 40 sekone umi mo le laupapa e suʻe ai tuaoi e faʻaaoga ai le Canny filter. O lenei, ioe, e umi tele (o loʻo i ai iloiloga i le auala e faʻamalieina ai lenei mataupu, o le a mafai ona tusia se isi tala e uiga i lenei mea pe a manuia).
Ae ui i lea, o le sini autu o le fatuina lea o se faʻataʻitaʻiga o le a faʻaalia ai le avanoa taua e faʻatautaia ai OpenCV i luga ole STM32, i le faasologa, na ausia lenei sini, hooray!
tl;dr: laasaga ma lea laasaga faatonuga
0: La'u mai ai punaoa Embox, pei o lenei:
git clone https://github.com/embox/embox && cd ./embox
1: Tatou amata i le faʻapipiʻiina o se bootloader o le a "momi" se QSPI flash drive.
make confload-arm/stm32f7cube
Ole taimi nei e tatau ona e faʻatulagaina le fesoʻotaʻiga, aua. O le a matou lafoina le ata e ala i le TFTP. Ina ia seti le laupapa ma faʻafeiloaʻi tuatusi IP, e tatau ona e faʻasaʻo le conf/rootfs/network.
Fa'ata'ita'iga fa'atusa:
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
- tuatusi talimalo mai le mea o le a utaina ai le ata, address
- tuatusi o le laupapa.
A maeʻa lena, matou te aoina le bootloader:
make
2: O le faʻapipiʻiina masani o le bootloader (faʻanoanoa mo le pun) i luga o le laupapa - e leai se mea faʻapitoa iinei, e tatau ona e faia e pei o soʻo se isi talosaga mo STM32F7Discovery. Afai e te le iloa pe faapefea ona fai, e mafai ona e faitau i ai
3: Faʻapipiʻiina o se ata ma se faʻaoga mo OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Aveese mai vaega ELF e tusi i le QSPI i le 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
O loʻo i ai se faʻamatalaga i le conf directory e faia lenei mea, ina ia mafai ona e taʻavale
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Fa'aaogā le tftp, la'u mai le qspi.bin.bin ile QSPI flash drive. I luga o le talimalo, e fai lenei mea, kopi le qspi.bin i le pusa aʻa o le tftp server (e masani lava / srv / tftp / poʻo / var / lib / tftpboot /; afifi mo le server fetaui e maua i le tele o tufatufa lauiloa, e masani ona taʻua tftpd poʻo tftp-hpa, o nisi taimi e tatau ona e faia systemctl start tftpd.service
e amata).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
I luga o le Embox (e pei o le bootloader), e te manaʻomia le faʻatinoina o le poloaiga lenei (matou te manatu o le server o loʻo i ai le tuatusi 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Faatasi ai ma le poloaiga goto
e tatau ona e "oso" i le QSPI manatua. O le nofoaga patino o le a eseese e faʻatatau i le auala e fesoʻotaʻi ai le ata, e mafai ona e vaʻai i lenei tuatusi ma le poloaiga mem 0x90000000
(o le tuatusi amata e fetaui ma le upu lona lua 32-bit o le ata); e mana'omia fo'i le fu'a o le fa'aputuga -s
, o le tuatusi faʻapipiʻi o loʻo i le 0x90000000, faʻataʻitaʻiga:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Tatala
embox> edges 20
ma fiafia i le sailiga tuaoi 40-lua 🙂
Afai ei ai se mea ua faaletonu - tusi se mataupu i totonu
puna: www.habr.com