Abụ m otu n'ime ndị nrụpụta sistemụ arụmọrụ
Ọ bụrụ na ị pịnye ihe dị ka “OpenCV na bọọdụ STM32” n'ime igwe nchọta, ị nwere ike ịhụ ọtụtụ ndị nwere mmasị iji ọbá akwụkwọ a na bọọdụ STM32 ma ọ bụ microcontrollers ndị ọzọ.
Enwere vidiyo dị iche iche nke, na-ekpe ikpe site na aha, kwesịrị igosipụta ihe achọrọ, mana ọ na-abụkarị (na vidiyo niile m hụrụ) na bọọdụ STM32, naanị na-enweta onyonyo site na igwefoto wee gosipụta nsonaazụ na ihuenyo, yana A na-eme nhazi onyonyo n'onwe ya ma ọ bụ na kọmpụta oge niile, ma ọ bụ na bọọdụ dị ike karịa (dịka ọmụmaatụ, Raspberry Pi).
Gịnị mere nke a ji esi ike?
A na-akọwa ewu ewu nke ajụjụ ọchụchọ site n'eziokwu ahụ bụ na OpenCV bụ ọbá akwụkwọ ọhụụ kọmputa kachasị ewu ewu, nke pụtara na ọtụtụ ndị mmepe maara ya nke ọma, na ikike ịme koodu dị njikere na desktọpụ na microcontroller na-eme ka usoro mmepe ahụ dịkwuo mfe. Ma gịnị mere na-enwekwa ndị na-ewu ewu na-emere Ezi ntụziaka maka idozi nsogbu a?
Nsogbu dị na iji OpenCV na obere bọọdụ metụtara atụmatụ abụọ:
- Ọ bụrụ na ị na-achịkọta ọba akwụkwọ ahụ ọbụlagodi na obere modul, ọ gaghị adaba na ebe nchekwa flash nke otu STM32F7Discovery (ọbụlagodi na-eburu n'uche OS) n'ihi koodu buru ibu (ọtụtụ megabyte ntuziaka)
- Edere ọbá akwụkwọ n'onwe ya na C++, nke pụtara
- Anyị chọrọ nkwado maka oge ịgba ọsọ dị mma (wepu, wdg)
- Enwere obere nkwado maka LibC/Posix, nke a na-ahụkarị na OS maka sistemu agbakwunyere - ịchọrọ ọkọlọtọ gbakwunyere ọba akwụkwọ yana ọba akwụkwọ ndebiri STL ọkọlọtọ (vector, wdg)
Na-ebufe na igbe igbe
Dị ka ọ dị na mbụ, tupu ibuga mmemme ọ bụla na sistemụ arụmọrụ, ọ dị mma ịgbalị ịchịkọta ya n'ụdị nke ndị nrụpụta chọrọ ya. N'ọnọdụ anyị, enweghị nsogbu na nke a - enwere ike ịchọta koodu isi na
Ozi ọma ahụ bụ na enwere ike wulite OpenCV site na igbe dị ka ọbá akwụkwọ kwụ ọtọ, nke na-eme ka mbubata ngwa ngwa dị mfe. Anyị na-agbakọta ọbá akwụkwọ ahụ na nhazi ọkọlọtọ wee hụ ókè ohere ọ na-ewe. A na-achịkọta modul ọ bụla n'ọba akwụkwọ dị iche.
> 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)
Dịka ị nwere ike ịhụ site na ahịrị ikpeazụ, .bss na .data anaghị ewepụta ohere dị ukwuu, mana koodu ahụ karịrị 70 MiB. O doro anya na ọ bụrụ na nke a jikọtara ya na ngwa ngwa, a ga-enwe obere koodu.
Ka anyị gbalịa ịtụfu modul dị ka o kwere mee iji mepụta ntakịrị ihe atụ (nke, dịka ọmụmaatụ, ga-egosipụta ụdị OpenCV naanị), yabụ ka anyị lelee anya. cmake .. -LA
ma gbanyụọ na nhọrọ ihe ọ bụla nwere nkwarụ.
-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)
N'otu aka ahụ, nke a bụ naanị otu modul ọbá akwụkwọ, n'aka nke ọzọ, nke a bụ na-enweghị njikarịcha site n'aka onye na-achịkọta maka nha koodu (code).-Os
). ~ 3 MiB nke koodu ka dị ọtụtụ, mana ọ na-enyelarị olile anya maka ịga nke ọma.
Na-agba ọsọ na emulator
Ọ dị mfe ịmegharị na emulator, yabụ na mbụ anyị ga-ahụ na ọbá akwụkwọ na-arụ ọrụ na qemu. M họọrọ Integrator/CP dị ka ikpo okwu e ṅomiri, n'ihi na ... Nke mbụ, ọ bụkwa ARM, na nke abụọ, Embox na-akwado mmepụta eserese maka ikpo okwu a.
Embox nwere usoro iji wuo ọba akwụkwọ ndị dị n'èzí, site n'enyemaka ya, anyị na-agbakwunye OpenCV dị ka modul (na-agafe otu nhọrọ niile maka mgbakọ "obere" n'ụdị ọba akwụkwọ static), mgbe nke ahụ gasịrị, m na-agbakwunye ngwa dị mfe nke dị ka nke a:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Anyị na-agbakọta usoro ahụ, na-agba ya, ma nweta mmepụta a tụrụ anya ya.
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 включены в сборку и т.п.>
Nzọụkwụ ọzọ bụ ịgba ọsọ ụfọdụ atụ, ọkacha mma ụfọdụ ọkọlọtọ nke ndị mmepe n'onwe ha na-enye
Ekwesịrị ka edegharị ihe atụ ahụ ntakịrị iji gosipụta onyonyo nsonaazụ ozugbo n'ime ebe nchekwa. Ekwesịrị m ime nke a n'ihi na... ọrụ imshow()
nwere ike ise foto site na QT, GTK na Windows interfaces, nke, n'ezie, agaghị adị na nhazi maka STM32. N'ezie, QT nwekwara ike na-agba ọsọ na STM32F7Discovery, ma nke a ga-atụle n'isiokwu ọzọ :)
Mgbe anyị nyochachara nkenke kpọmkwem ụdị usoro nke ihe nchọta ihu na-echekwara, anyị na-enweta onyonyo.
Foto izizi
N'ihi
Na-agba ọsọ na STM32F7Discovery
32F746GDISCOVERY nwere ọtụtụ ngalaba ebe nchekwa ngwaike anyị nwere ike iji n'otu ụzọ ma ọ bụ ọzọ.
- 320 KiB RAM
- Ebe nchekwa 1MiB maka onyonyo
- 8MiB SDRAM
- 16MiB QSPI NAND flash mbanye
- Oghere kaadị MicroSD
Enwere ike iji kaadị SD na-echekwa onyonyo, mana n'ihe gbasara ịme obere ihe atụ nke a anaghị aba uru.
Ngosipụta ahụ nwere mkpebi nke 480x272, nke pụtara na ebe nchekwa maka framebuffer ga-abụ 522 bytes na omimi nke 240 bits, ya bụ. nke a dị ukwuu karịa nha RAM, ya mere framebuffer na ikpo (nke a ga-achọrọ, n'etiti ihe ndị ọzọ, maka OpenCV iji chekwaa data maka ihe oyiyi na ihe inyeaka) ga-adị na SDRAM, ihe ọ bụla ọzọ (ncheta maka stacks na usoro ndị ọzọ). mkpa) ga-aga RAM .
Ọ bụrụ na anyị ewere nhazi kacha nta maka STM32F7Discovery (tụpụ netwọkụ niile, iwu niile, mee ka ngwugwu dị obere ka enwere ike, wdg) wee tinye OpenCV na ihe atụ ebe ahụ, ebe nchekwa achọrọ ga-abụ ihe ndị a:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Maka ndị na-amaghị nke ọma na ngalaba na-aga ebe, ka m kọwaa: in .text
и .rodata
nwere ntuziaka na nkwubi okwu (na-ekwu okwu, naanị data na-agụ), na .data
enwere data nwere ike ịgbanwe .bss
enwere mgbanwe "zeroed", nke, ka o sina dị, chọrọ ohere (ngalaba a "ga-aga" na RAM).
Ozi ọma ahụ bụ .data
/.bss
kwesịrị dabara, ma na .text
Nsogbu a bụ na enwere naanị 1MiB nke ebe nchekwa maka onyonyo a. Enwere ike ịtụfu ya .text
onyonyo site na ihe atụ wee gụọ ya, dịka ọmụmaatụ, site na kaadị SD n'ime ebe nchekwa na mmalite, mana fruit.png dị ihe dịka 330KiB, yabụ nke a agaghị edozi nsogbu ahụ: ọtụtụ. .text
nwere koodu OpenCV kpọmkwem.
N'ozuzu, enwere naanị otu ihe fọdụrụ - itinye akụkụ nke koodu ahụ na draịvụ flash QSPI (o nwere ọnọdụ ọrụ pụrụ iche maka ebe nchekwa eserese na bọs sistemụ, ka onye nrụpụta wee nweta data a ozugbo). N'okwu a, nsogbu na-ebilite: nke mbụ, ebe nchekwa QSPI flash drive adịghị ozugbo ka ịmalitegharịa ngwaọrụ ahụ (ọnọdụ ebe nchekwa ga-amalite iche iche), na nke abụọ, ọ gaghị ekwe omume iji "flash" ebe nchekwa a. mbụ bootloader.
N'ihi nke a, e kpebiri ijikọ koodu niile na QSPI wee jiri bootloader dee onwe ya, nke ga-enweta ọnụọgụ abụọ achọrọ site na TFTP.
N'ihi
Echiche ibubata ọba akwụkwọ a na Embox pụtara ihe dị ka otu afọ gara aga, mana e yigharịrị ya ugboro ugboro n'ihi ihe dị iche iche. Otu n'ime ha bụ nkwado maka libstdc++ yana ọba akwụkwọ ndebiri ọkọlọtọ. Nsogbu nke nkwado C ++ na Embox karịrị nke isiokwu a, yabụ ebe a ka m ga-ekwu na anyị jisiri ike nweta nkwado a ruo n'ókè achọrọ ka ọbá akwụkwọ a rụọ ọrụ :)
N'ikpeazụ, a meriri nsogbu ndị a (opekata mpe maka ihe atụ OpenCV ka ọ rụọ ọrụ), ihe atụ ahụ gbakwara. Ọ na-ewe bọọdụ 40 ogologo sekọnd iji chọọ ókèala site na iji Canny filter. Nke a, n'ezie, dị ogologo (enwere echiche banyere otu esi ebuli okwu a, enwere ike dee isiokwu dị iche banyere nke a ma ọ bụrụ na ọ ga-aga nke ọma).
Agbanyeghị, ebumnuche etiti bụ imepụta prototype nke ga-egosi ohere dị mkpa nke ịgba ọsọ OpenCV na STM32, yabụ e mezuru ebumnuche a, ngwa ngwa!
tl;dr: ntuziaka nzọụkwụ site nzọụkwụ
0: Budata isi mmalite Embox, dịka ọmụmaatụ:
git clone https://github.com/embox/embox && cd ./embox
1: Ka anyị bido site n'ịchịkọta bootloader nke ga-ebufe draịva QSPI.
make confload-arm/stm32f7cube
Ugbu a ịkwesịrị ịhazi netwọkụ ahụ, n'ihi na ... Anyị ga-ebudata onyonyo a site na TFTP. Iji tọọ adreesị IP nke bọọdụ na onye ọbịa, ịkwesịrị idezi conf / mgbọrọgwụ / netwọkụ.
Ọmụmaatụ nhazi:
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
- adreesị nnabata site na ebe a ga-ebugo ihe onyonyo a, address
- adreesị osisi.
Mgbe nke ahụ gasịrị, anyị na-achịkọta bootloader:
make
2: Nbudata nke bootloader nkịtị (mgbaghara pun) na bọọdụ - ọ nweghị akọwapụtara ebe a, ịkwesịrị ịme ya dịka ngwa ọ bụla ọzọ maka STM32F7Discovery. Ọ bụrụ na ị maghị ka esi eme nke a, ị nwere ike ịgụ banyere ya
3: Na-achịkọta onyonyo na nhazi maka OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Wepụ akụkụ site na ELF nke achọrọ ka edegara QSPI n'ime 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
Enwere edemede na ndekọ conf na-eme nke a, yabụ ị nwere ike ịme ya
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Iji tftp, buo qspi.bin.bin na draịva QSPI. Na onye ọbịa, iji mee nke a, ịkwesịrị idetuo qspi.bin na nchekwa mgbọrọgwụ nke sava tftp (na-abụkarị / srv/tftp/ ma ọ bụ /var/lib/tftpboot/; ngwugwu maka ihe nkesa kwekọrọ dị na nkesa kachasị ewu ewu). , a na-akpọkarị tftpd ma ọ bụ tftp-hpa, mgbe ụfọdụ ị ga-eme ya systemctl start tftpd.service
ibido).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Na Embox (ya bụ na bootloader) ịkwesịrị ịme iwu na-esonụ (anyị chere na ihe nkesa ahụ nwere adreesị 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Iji iwu goto
ịkwesịrị 'ịwụlikwa' n'ime ebe nchekwa QSPI. Ebe a kapịrị ọnụ ga-adịgasị iche dabere n'otu esi ejikọta onyonyo a, ị nwere ike ịlele adreesị a na iwu mem 0x90000000
(adreesị mmalite dabara na okwu 32-bit nke abụọ nke onyonyo a); ị ga-achọkwa ịtọ ọkọlọtọ njupụta -s
, adreesị nchịkọta dị na 0x90000000, ọmụmaatụ:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Mwepụta
embox> edges 20
ma nwee ọ enjoyụ n'ọchịchọ 40 nke abụọ maka oke :)
Ọ bụrụ na ihe na-aga nke ọma, degara ya mbipụta
isi: www.habr.com