Tha mi am measg luchd-leasachaidh an t-siostam obrachaidh
Ma sgrìobhas tu rudeigin mar “OpenCV air bòrd STM32” ann an einnsean sgrùdaidh, gheibh thu grunn dhaoine aig a bheil ùidh ann a bhith a’ cleachdadh an leabharlann seo air bùird STM32 no microcontrollers eile.
Tha grunn bhideothan ann a bu chòir, a rèir an ainm, na tha a dhìth a nochdadh, ach mar as trice (anns a h-uile bhidio a chunnaic mi) air a ’bhòrd STM32, cha d’ fhuaireadh ach an ìomhaigh bhon chamara agus chaidh an toradh a thaisbeanadh air an sgrion, agus chaidh an giullachd ìomhaighean fhèin a dhèanamh an dàrna cuid air coimpiutair àbhaisteach, no air bùird nas cumhachdaiche (mar eisimpleir, Raspberry Pi).
Carson a tha e duilich?
Tha fèill mhòr air ceistean rannsachaidh air a mhìneachadh leis gur e OpenCV an leabharlann lèirsinn coimpiutair as mòr-chòrdte, a tha a’ ciallachadh gu bheil barrachd luchd-leasachaidh eòlach air, agus tha an comas còd deiseil deasg a ruith air microcontroller gu mòr a ’sìmpleachadh a’ phròiseas leasachaidh. Ach carson nach eil reasabaidhean deiseil ann fhathast airson fuasgladh fhaighinn air an duilgheadas seo?
Tha an duilgheadas le bhith a’ cleachdadh OpenCV air seàlagan beaga co-cheangailte ri dà fheart:
- Ma chuireas tu ri chèile an leabharlann eadhon le seata as lugha de mhodalan, cha bhith e dìreach a ’freagairt air cuimhne flash an aon STM32F7Discovery (eadhon gun a bhith a’ toirt aire don OS) air sgàth còd gu math mòr (grunn megabytes de stiùiridhean)
- Tha an leabharlann fhèin sgrìobhte ann an C ++, a tha a’ ciallachadh
- Feum air taic airson ùine ruith adhartach (eisgeachdan, msaa)
- Beagan taic do LibC/Posix, a lorgar mar as trice ann an OS airson siostaman freumhaichte - feumaidh tu leabharlann àbhaisteach plus agus leabharlann teamplaid STL àbhaisteach (vector, msaa.)
A’ gluasad gu Embox
Mar as àbhaist, mus tèid prògraman sam bith a ghluasad chun an t-siostaim-obrachaidh, is e deagh bheachd a th’ ann feuchainn ri a thogail anns an riochd anns an robh an luchd-leasachaidh an dùil. Anns a 'chùis againn, chan eil duilgheadas sam bith ann le seo - gheibhear an còd stòr air
Is e an deagh naidheachd gum faodar OpenCV a thogail mar leabharlann statach a-mach às a’ bhogsa, a tha ga dhèanamh nas fhasa gluasad. Cruinnichidh sinn leabharlann le config àbhaisteach agus chì sinn na tha de rùm ann. Tha gach modal air a chruinneachadh ann an leabharlann air leth.
> 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)
Mar a chì thu bhon loidhne mu dheireadh, chan eil .bss agus .data a 'gabhail mòran àite, ach tha an còd nas motha na 70 MiB. Tha e soilleir ma tha seo ceangailte gu statach ri tagradh sònraichte, gum fàs an còd nas lugha.
Feuchaidh sinn ri nas urrainn dhuinn de mhodalan a thilgeil a-mach gus an tèid beagan eisimpleir a chruinneachadh (a bheir, mar eisimpleir, dìreach an dreach OpenCV a-mach), agus mar sin bidh sinn a’ coimhead cmake .. -LA
agus cuir dheth anns na roghainnean a h-uile dad a thionndaidheas.
-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)
Air an aon làimh, chan e seo ach aon mhodal den leabharlann, air an làimh eile, tha seo às aonais optimization compiler airson meud còd (-Os
). ~ Tha 3 MiB de chòd fhathast gu math mòr, ach mar-thà a’ toirt dòchas airson soirbheachas.
Ruith ann an emulator
Tha e tòrr nas fhasa dì-bhugachadh air an emuladair, mar sin dèan cinnteach an-toiseach gu bheil an leabharlann ag obair air qemu. Mar àrd-ùrlar emulated, thagh mi Integrator / CP, oir an toiseach, tha e cuideachd ARM, agus san dàrna h-àite, tha Embox a’ toirt taic do thoraidhean grafaigs airson an àrd-ùrlar seo.
Tha uidheamachd aig Embox airson leabharlannan taobh a-muigh a thogail, le bhith ga chleachdadh cuiridh sinn OpenCV mar mhodal (a’ dol seachad air na h-aon roghainnean airson an togail “as lugha” ann an cruth leabharlannan statach), às deidh sin cuiridh mi tagradh sìmplidh ris a tha coltach ri seo:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Bidh sinn a 'cruinneachadh an t-siostam, ga ruith - gheibh sinn an toradh ris a bheil dùil.
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 включены в сборку и т.п.>
Is e an ath cheum eisimpleir a ruith, is dòcha aon den fheadhainn àbhaisteach a tha an luchd-leasachaidh a’ tabhann.
Dh'fheumadh an eisimpleir a bhith air ath-sgrìobhadh beagan gus an ìomhaigh a thaisbeanadh leis an toradh gu dìreach ann am bufair an fhrèam. Bha agam ri seo a dhèanamh, oir. gnìomh imshow()
is urrainn dhaibh dealbhan a tharraing tro eadar-aghaidh QT, GTK agus Windows, nach bi, gu dearbh, anns an rèiteachadh airson STM32. Gu dearbh, faodar QT a ruith cuideachd air STM32F7Discovery, ach thèid seo a dheasbad ann an artaigil eile 🙂
Às deidh soilleireachadh goirid anns an cruth a tha toradh an lorgaire iomall air a stòradh, gheibh sinn ìomhaigh.
dealbh tùsail
thoradh air
A’ ruith air STM32F7Discovery
Air 32F746GDISCOVERY tha grunn earrannan cuimhne bathar-cruaidh as urrainn dhuinn a chleachdadh aon dòigh no dòigh eile
- RAM 320 KB
- Flash 1MiB airson dealbh
- 8MiB SDRAM
- Flash 16MiB QSPI NAND
- slot cairt microSD
Faodar cairt SD a chleachdadh airson ìomhaighean a stòradh, ach ann an co-theacsa ruith eisimpleir bheag, chan eil seo glè fheumail.
Tha rùn de 480 × 272 aig an taisbeanadh, a tha a’ ciallachadh gum bi a’ chuimhne frèam bufair 522 bytes aig doimhneachd de 240 pìosan, i.e. tha seo nas motha na meud RAM, agus mar sin bidh am bufair frèam agus an tiùrr (a bhios a dhìth, a’ gabhail a-steach OpenCV, gus dàta a stòradh airson ìomhaighean agus structaran taice) suidhichte ann an SDRAM, a h-uile càil eile (cuimhne airson stacan agus feumalachdan siostaim eile). ) thèid e gu RAM.
Ma ghabhas sinn an rèiteachadh as lugha airson STM32F7Discovery (tilg a-mach an lìonra gu lèir, a h-uile àithne, dèan cruachan cho beag 's as urrainn, msaa) agus cuir OpenCV le eisimpleirean an sin, bidh an cuimhne a tha a dhìth mar a leanas:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Dhaibhsan nach eil gu math eòlach air dè na h-earrannan a thèid far a bheil, mìnichidh mi: ann an .text
и .rodata
tha stiùireadh agus seasmhachd (gu ìre mhòr a’ bruidhinn, dàta leughaidh a-mhàin) nan laighe a-steach .data
tha an dàta air atharrachadh, .bss
tha caochladairean "nulled", a tha, ge-tà, feumach air àite (bidh an earrann seo "a 'dol" gu RAM).
Is e an deagh naidheachd gu bheil .data
/.bss
bu chòir dha a bhith iomchaidh, ach le .text
is e an trioblaid nach eil ann ach 1MiB de chuimhne airson an ìomhaigh. Faodar a thilgeil a-mach .text
an dealbh bhon eisimpleir agus leugh e, mar eisimpleir, bhon chairt SD gu cuimhne aig toiseach tòiseachaidh, ach tha cuideam measan.png timcheall air 330KiB, mar sin cha bhith seo a ’fuasgladh na duilgheadas: a’ mhòr-chuid .text
air a dhèanamh suas de chòd OpenCV.
Gu h-iomlan, chan eil ach aon rud air fhàgail - a’ luchdachadh pàirt den chòd air flash QSPI (tha modh obrachaidh sònraichte aige airson cuimhne a mhapadh gu bus an t-siostaim, gus am faigh am pròiseasar cothrom air an dàta seo gu dìreach). Anns a 'chùis seo, tha duilgheadas ag èirigh: an toiseach, chan eil cuimhne dràibhidh QSPI ri fhaighinn sa bhad às deidh an inneal ath-thòiseachadh (feumaidh tu am modh mapa cuimhne a thòiseachadh air leth), agus san dàrna àite, chan urrainn dhut "flash" a' chuimhne seo le bootloader eòlach.
Mar thoradh air an sin, chaidh co-dhùnadh an còd gu lèir a cheangal ann an QSPI, agus a lasadh le luchdan fèin-sgrìobhte a gheibh am binary riatanach tro TFTP.
thoradh air
Nochd am beachd an leabharlann seo a phortadh gu Embox timcheall air bliadhna air ais, ach a-rithist is a-rithist chaidh a chuir dheth air sgàth diofar adhbharan. Is e aon dhiubh taic airson libstdc ++ agus an leabharlann teamplaid àbhaisteach. Tha an duilgheadas a thaobh taic C ++ ann an Embox taobh a-muigh farsaingeachd an artaigil seo, mar sin an seo cha bhith mi ag ràdh ach gun deach againn air an taic seo a choileanadh anns an t-suim cheart airson an leabharlann seo obrachadh 🙂
Mu dheireadh, chaidh faighinn seachad air na duilgheadasan sin (co-dhiù gu leòr airson an eisimpleir OpenCV a bhith ag obair), agus ruith an eisimpleir. Bheir e 40 diog fada airson a’ bhòrd crìochan a lorg a’ cleachdadh sìoltachan Canny. Tha seo, gu dearbh, ro fhada (tha beachdachadh air mar a nì thu an fheum as fheàrr den chùis seo, bidh e comasach artaigil air leth a sgrìobhadh mu dheidhinn seo gun fhios nach bi e soirbheachail).
Ach, b ’e an amas eadar-mheadhanach prototype a chruthachadh a sheallas an comas bunaiteach a bhith a’ ruith OpenCV air STM32, fa leth, chaidh an amas seo a choileanadh, hooray!
tl; dr: stiùireadh ceum air cheum
0: Luchdaich sìos stòran Embox, mar seo:
git clone https://github.com/embox/embox && cd ./embox
1: Feuch an tòisich sinn le bhith a’ cruinneachadh bootloader a bheir “flash” air draibhear flash QSPI.
make confload-arm/stm32f7cube
A-nis feumaidh tu an lìonra a rèiteachadh, oir. Cuiridh sinn suas an dealbh tro TFTP. Gus am bòrd agus na seòlaidhean IP aoigheachd a shuidheachadh, feumaidh tu an conf / rootfs / network a dheasachadh.
Eisimpleir rèiteachaidh:
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
- seòladh aoigheachd às an tèid an ìomhaigh a luchdachadh, address
- seòladh a 'bhùird.
Às deidh sin, cruinnichidh sinn an bootloader:
make
2: An luchdachadh àbhaisteach den bootloader (duilich airson an pun) air a’ bhòrd - chan eil dad sònraichte an seo, feumaidh tu a dhèanamh mar airson tagradh sam bith eile airson STM32F7Discovery. Mura h-eil fios agad ciamar a nì thu e, faodaidh tu leughadh mu dheidhinn
3: A’ cur ri chèile ìomhaigh le config airson OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Earrann bho earrannan ELF ri sgrìobhadh gu QSPI gu 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
Tha sgriobt anns an eòlaire conf a nì seo, gus an urrainn dhut a ruith
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: A’ cleachdadh tftp, luchdaich sìos qspi.bin.bin gu draibhear flash QSPI. Air an òstair, gus seo a dhèanamh, dèan lethbhreac de qspi.bin gu pasgan freumh an fhrithealaiche tftp (mar as trice / srv/tftp/ or /var/lib/tftpboot/; tha pasganan airson an fhrithealaiche co-fhreagarrach rim faighinn anns na sgaoilidhean as mòr-chòrdte, ris an canar mar as trice tftpd no tftp-hpa, uaireannan feumaidh tu a dhèanamh systemctl start tftpd.service
airson tòiseachadh).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Air Embox (ie san bootloader), feumaidh tu an àithne a leanas a chuir an gnìomh (tha sinn a’ gabhail ris gu bheil an seòladh 192.168.2.1 aig an fhrithealaiche):
embox> qspi_loader qspi.bin 192.168.2.1
6: Le àithne goto
feumaidh tu "leum" a-steach don chuimhne QSPI. Bidh an t-àite sònraichte ag atharrachadh a rèir mar a tha an ìomhaigh ceangailte, chì thu an seòladh seo leis an àithne mem 0x90000000
(tha an seòladh tòiseachaidh a 'freagairt air an dàrna facal 32-bit den ìomhaigh); feumaidh tu cuideachd an stac a chomharrachadh -s
, tha an seòladh stac aig 0x90000000, mar eisimpleir:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Cur air bhog
embox> edges 20
agus faigh tlachd às an sgrùdadh crìche 40-diog 🙂
Ma thèid rudeigin ceàrr - sgrìobh cùis a-steach
Source: www.habr.com