Ko ahau tetahi o nga kaihanga o te punaha whakahaere
Mena ka patohia e koe tetahi mea penei i te "OpenCV i runga i te papa STM32" ki roto i te miihini rapu, ka kitea e koe etahi tangata e pirangi ana ki te whakamahi i tenei whare pukapuka i runga i nga papa STM32 me etahi atu microcontrollers.
He maha nga ataata, ma te whakatau i te ingoa, me whakaatu nga mea e hiahiatia ana, engari ko te nuinga (i nga ataata katoa i kite ahau) i runga i te papa STM32, ko te ahua anake i riro mai i te kamera ka whakaatuhia te hua ki te mata, a ko te tukatuka whakaahua i mahia i runga rorohiko noa, i runga ranei i nga papa kaha ake (hei tauira, Raspberry Pi).
He aha te take uaua?
Ko te rongonui o nga patai rapu e whakamaramahia ana e te mea ko OpenCV te whare pukapuka tirohanga rorohiko tino rongonui, ko te tikanga he maha nga kaiwhakawhanake e mohio ana ki a ia, a, ko te kaha ki te whakahaere i te waehere kua rite ki te papamahi i runga i te microcontroller ka tino ngawari te mahi whanaketanga. Engari he aha te take kaore ano kia rongonui nga tohutao kua oti te hanga hei whakaoti i tenei raru?
Ko te raru o te whakamahi OpenCV i runga i nga kaakahu iti e pa ana ki nga waahanga e rua:
- Mena ka whakahiatohia e koe te whare pukapuka ahakoa he iti noa nga waahanga, kaore e uru ki roto i te mahara flash o taua STM32F7Discovery (ahakoa me te kore e whai whakaaro ki te OS) na te nui o te waehere (he maha nga megabytes o nga tohutohu)
- Ko te whare pukapuka ake kua tuhia ki te C++, ko te tikanga
- Me tautoko mo te wa whakahaere pai (he rereke, aha atu.)
- He iti te tautoko mo LibC/Posix, e kitea ana i roto i te OS mo nga punaha whakauru - me hiahia koe ki tetahi whare pukapuka paerewa me tetahi whare pukapuka tauira STL (vector, etc.)
Te kawe ki te Embox
Ka rite ki o mua, i mua i te kawe i nga kaupapa ki te punaha whakahaere, he pai ki te ngana ki te hanga kia rite ki ta nga kaihanga i whakaaro ai. I roto i to maatau, kaore he raruraru ki tenei - ka kitea te waehere puna i runga
Ko te rongo pai ko te OpenCV ka taea te hanga hei whare pukapuka pateko i waho o te pouaka, he maamaa ake te tauranga. Ka kohia e matou he whare pukapuka me te whirihora paerewa ka kite i te nui o te waahi ka pau. Ka kohia ia kōwae ki tētahi whare pukapuka motuhake.
> 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)
Ka taea e koe te kite mai i te rarangi whakamutunga, .bss me .data e kore e nui te waahi, engari ko te waehere he nui atu i te 70 MiB. He maamaa mena ka honoa tenei ki tetahi tono motuhake, ka iti ake te waehere.
Me ngana ki te maka i te maha o nga waahanga ka taea kia kohia he tauira iti (hei tauira, ka whakaputa noa i te putanga OpenCV), na reira ka titiro tatou cmake .. -LA
ka whakawetohia i roto i nga whiringa nga mea katoa ka huri.
-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 tetahi taha, kotahi noa tenei waahanga o te whare pukapuka, i tetahi atu taha, kaore he arotautanga whakahiato mo te rahi o te waehere (-Os
). ~3 He nui tonu te MiB o te waehere, engari he tumanako mo te angitu.
Rere i roto i te emulator
He maamaa ake te patuiro i runga i te emulator, na me matua mohio kei te mahi te whare pukapuka ki runga qemu. Ka rite ki te turanga emulated, i whiriwhiria e ahau Integrator / CP, no te mea tuatahi, he ARM ano, tuarua, kei te tautoko a Embox i nga whakaputanga whakairoiro mo tenei turanga.
Kei a Embox tetahi tikanga mo te hanga whare pukapuka o waho, ma te whakamahi ka taapirihia e matou te OpenCV hei kōwae (whakawhitihia nga whiringa katoa mo te hanga "iti" i roto i te ahua o nga whare pukapuka tuuturu), i muri i tera ka taapirihia e au he tono ngawari penei:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Ka whakaemihia e matou te punaha, ka whakahaere - ka whiwhi matou i te putanga e tumanakohia ana.
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 включены в сборку и т.п.>
Ko te mahi e whai ake nei ko te whakahaere i etahi tauira, he pai ake ko tetahi o nga paerewa e tukuna ana e nga kaihanga ake.
Me tuhi paku ano te tauira hei whakaatu i te ahua me te hua tika ki roto i te papaatanga anga. Me mahi ahau i tenei, na te mea. mahi imshow()
Ka taea e koe te tuhi whakaahua ma roto i nga hononga QT, GTK me te Matapihi, ko te tikanga, kaore e uru ki te whirihora mo STM32. Inaa, ka taea hoki te whakahaere a QT i runga i te STM32F7Discovery, engari ka korerohia tenei i tetahi atu tuhinga 🙂
Whai muri i te whakamaarama poto i roto i te whakatakotoranga e rongoa ana te hua o te kaitao mata, ka whiwhi tatou i tetahi ahua.
pikitia taketake
hua
Rere ana i runga i te STM32F7Discovery
I runga i te 32F746GDISCOVERY he maha nga waahanga mahara taputapu ka taea e tatou te whakamahi i tetahi huarahi, i tetahi atu
- 320KiB RAM
- 1MiB flash mo te ahua
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- mokamoka kāri microSD
Ka taea te whakamahi i te kaari SD ki te penapena whakaahua, engari i roto i te horopaki o te whakahaere i tetahi tauira iti, kaore tenei i te tino whai hua.
Ko te whakaaturanga he 480 × 272 taumira, ko te tikanga ko te whakamaharatanga framebuffer ka 522 paita i te hohonu o te 240 bits, i.e. he nui ake tenei i te rahi o te RAM, no reira ko te framebuffer me te puranga (e hiahiatia ana, tae atu ki te OpenCV, hei penapena raraunga mo nga whakaahua me nga hanganga awhina) ka noho ki SDRAM, nga mea katoa (te mahara mo nga puranga me etahi atu hiahia o te punaha. ) ka haere ki te RAM .
Mena ka tangohia e tatou te iti rawa o te whirihora mo STM32F7Discovery (peia katoatia te whatunga, nga whakahau katoa, hanga i nga taapu kia iti rawa, me etahi atu) ka taapiri atu i a OpenCV me etahi tauira ki reira, ka penei te mahara e whai ake nei:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Mo te hunga kaore i tino mohio ki nga waahanga e haere ana ki hea, ka whakamarama ahau: in .text
и .rodata
Ko nga tohutohu me nga taurite (he korero noa, he korero panui anake) kei roto .data
he rereke nga raraunga, .bss
he "nulled" taurangi, ahakoa, me whai waahi (ka "haere" tenei waahanga ki te RAM).
Ko te rongo pai ko tera .data
/.bss
me uru, engari me .text
Ko te raruraru he 1MiB anake te mahara mo te ahua. Ka taea te maka ki waho .text
te pikitia mai i te tauira me te panui, hei tauira, mai i te kaari SD ki te mahara i te tiimatanga, engari ko te fruits.png he 330KiB te taumaha, no reira kaore tenei e whakaoti i te raru: te nuinga .text
kei roto te waehere OpenCV.
I te nuinga, kotahi noa te mea e toe ana - te uta i tetahi waahanga o te waehere ki runga i te rama QSPI (kei a ia he aratau mahi motuhake mo te mapi mahara ki te pahi punaha, kia uru tika ai te tukatuka ki enei raraunga). I tenei keehi, ka puta he raru: tuatahi, kaore i te waatea te mahara o te puku kohiko QSPI i muri tonu i te whakaara ano o te taputapu (me wehe kee koe i te aratau mapi-mahara), tuarua, kaore e taea e koe te "whakawhiti" i tenei mahara. he bootloader mohio.
Ko te mutunga mai, i whakatauhia kia hono nga waehere katoa i roto i te QSPI, me te whakakorikori ki te utauta tuhi whaiaro ka whiwhi i te rua e hiahiatia ana ma te TFTP.
hua
Ko te whakaaro ki te kawe i tenei whare pukapuka ki a Embox i puta mai i te kotahi tau ki muri, engari he maha nga wa i hikitia ai na te maha o nga take. Ko tetahi o ratou ko te tautoko mo te libstdc++ me te whare pukapuka tauira paerewa. Ko te raruraru o te tautoko C++ i Embox kei tua atu i te waahanga o tenei tuhinga, na konei ka kii noa ahau i tutuki i a maatau tenei tautoko i roto i te moni tika mo tenei whare pukapuka kia mahi 🙂
I te mutunga, i hinga enei raruraru (he iti rawa mo te tauira OpenCV ki te mahi), ka rere te tauira. E 40 hekona te roa mo te poari ki te rapu rohe ma te whakamahi i te tātari Canny. Ko te tikanga, he roa rawa tenei (kei reira nga whakaaro me pehea te arotau i tenei take, ka taea te tuhi i tetahi tuhinga motuhake mo tenei mehemea ka angitu).
Heoi, ko te whainga takawaenga ko te hanga tauira e whakaatu ana i te tino tupono ki te whakahaere OpenCV i runga i te STM32, i tutuki tenei whainga, hooray!
tl;dr: nga tohutohu taahiraa
0: Tangohia nga puna Embox, penei:
git clone https://github.com/embox/embox && cd ./embox
1: Me timata ma te whakahiato i te bootloader ka "kohiko" he puku kohiko QSPI.
make confload-arm/stm32f7cube
Inaianei me whirihora e koe te whatunga, no te mea. Ka tukuna e matou te ahua ma te TFTP. Hei tautuhi i te poari me te manaaki i nga wahitau IP, me whakatika koe i te conf/rootfs/whatunga.
Tauira whirihoranga:
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
- te wahitau kaihautu mai i te waahi ka utaina te ahua, address
- te wahi noho o te poari.
I muri i tera, ka kohia e matou te bootloader:
make
2: Ko te utaina noa o te bootloader (pouri mo te punga) i runga i te poari - kaore he mea motuhake i konei, me mahi pera mo etahi atu tono mo STM32F7Discovery. Mena kaore koe e mohio ki te mahi, ka taea e koe te panui mo taua mea
3: Te whakahiato whakaahua me te whirihora mo OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Tango mai i nga waahanga ELF kia tuhia ki te QSPI ki 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
He tuhinga kei roto i te whaiaronga conf e mahi ana i tenei, ka taea e koe te whakahaere
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Ma te whakamahi i te tftp, tango qspi.bin.bin ki te puku kohiko QSPI. I runga i te kaihautu, ki te mahi i tenei, kape te qspi.bin ki te kōpaki pakiaka o te tūmau tftp (te nuinga o / srv / tftp / ranei / var / lib / tftpboot /; kei te waatea nga kohinga mo te tūmau e rite ana ki nga tohatoha rongonui, e kiia ana tftpd tftp-hpa ranei, i etahi wa me mahi koe systemctl start tftpd.service
ki te timata).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
I runga i te Embox (i.e. kei roto i te bootloader), me mahi e koe te whakahau e whai ake nei (e whakaaro ana matou kei te tūmau te wāhitau 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Me te whakahau goto
me "peke" koe ki te mahara QSPI. Ka rereke te waahi motuhake i runga i te hononga o te ahua, ka kite koe i tenei wahitau me te whakahau mem 0x90000000
(ka uru te wahitau timatanga ki te kupu 32-bit tuarua o te ahua); ka hiahia hoki koe ki te kara i te tāpae -s
, kei te 0x90000000 te wāhitau tāpae, hei tauira:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Whakarewa
embox> edges 20
me te pai ki te rapu taitapa 40-tuarua 🙂
Ki te he tetahi - tuhia he take ki roto
Source: will.com