OpenCV air STM32F7-Discovery

OpenCV air STM32F7-Discovery Tha mi am measg luchd-leasachaidh an t-siostam obrachaidh Bogsa a-steach, agus san artaigil seo bruidhnidh mi mu mar a fhuair mi air OpenCV a ruith air bòrd STM32746G.

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 github, tha an leabharlann air a thogail fo GNU/Linux leis an cmake àbhaisteach.

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. air an làrach agad. thagh mi lorgar crìochan canny.

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.

OpenCV air STM32F7-Discovery

dealbh tùsail

OpenCV air STM32F7-Discovery

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

  1. RAM 320 KB
  2. Flash 1MiB airson dealbh
  3. 8MiB SDRAM
  4. Flash 16MiB QSPI NAND
  5. 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).

OpenCV air STM32F7-Discovery

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 an seo.
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 ar n-ionad-tasgaidh, no chun liosta puist [post-d fo dhìon], no ann am beachd an seo.

Source: www.habr.com

Cuir beachd ann