{"id":37914,"date":"2019-10-31T22:20:31","date_gmt":"2019-10-31T19:20:31","guid":{"rendered":"https:\/\/prohoster.info\/blog\/opencv-na-stm32f7-discovery\/"},"modified":"2019-10-31T22:20:31","modified_gmt":"2019-10-31T19:20:31","slug":"opencv-na-stm32f7-discovery","status":"publish","type":"post","link":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","title":{"rendered":"OpenCV uz STM32F7-Discovery","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenCV uz STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a2248ee685ee210ce8f7781435dd1d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/> Es esmu viens no oper\u0113t\u0101jsist\u0113mas izstr\u0101d\u0101t\u0101jiem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, un \u0161aj\u0101 rakst\u0101 es past\u0101st\u012b\u0161u, k\u0101 man izdev\u0101s palaist OpenCV uz STM32746G plates.<\/p>\n<p><\/p>\n<p>Ievadot mekl\u0113t\u0101j\u0101 ko l\u012bdz\u012bgu \u00abOpenCV uz STM32 d\u0113\u013ca\u00bb, var atrast diezgan daudz cilv\u0113ku, kuri interes\u0113jas par \u0161\u012bs bibliot\u0113kas izmanto\u0161anu STM32 vai citu mikroprocesoru d\u0113\u013cos.<br \/>\nIr vair\u0101ki video, kas, sprie\u017eot p\u0113c nosaukuma, demonstr\u0113 to, kas nepiecie\u0161ams, ta\u010du parasti (visos redz\u0113tajos video) uz STM32 plates tika veikta tikai att\u0113la ieg\u016b\u0161ana no kameras un rezult\u0101ta r\u0101d\u012b\u0161ana ekr\u0101n\u0101, bet pa\u0161a att\u0113la apstr\u0101de notika vai nu uz parasta datora, vai uz jaud\u012bg\u0101k\u0101m plat\u0113m (piem\u0113ram, Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">K\u0101p\u0113c tas ir sare\u017e\u0123\u012bti?<\/h1>\n<p><\/p>\n<p>Mekl\u0113\u0161anas piepras\u012bjumu popularit\u0101ti izskaidro tas, ka OpenCV ir vispopul\u0101r\u0101k\u0101 datorsp\u0113ka bibliot\u0113ka, t\u0101d\u0113j\u0101di ar to ir iepazinu\u0161ies vair\u0101k izstr\u0101d\u0101t\u0101ju, k\u0101 ar\u012b iesp\u0113ja palaist gatavu kodu, kas paredz\u0113ts darbvirsm\u0101m, mikrokontrolier\u012b iev\u0113rojami atvieglo izstr\u0101des procesu. Bet k\u0101p\u0113c joproj\u0101m nav popul\u0101ru risin\u0101jumu receptes \u0161ai probl\u0113mai?<\/p>\n<p><\/p>\n<p>Probl\u0113ma, izmantojot OpenCV uz maz\u0101m pl\u0101tn\u0113m, ir saist\u012bta ar div\u0101m iez\u012bm\u0113m:<\/p>\n<p><\/p>\n<ul>\n<li>Ja bibliot\u0113ka tiek kompil\u0113ta pat ar minim\u0101lo modu\u013cu kopu, tai vienk\u0101r\u0161i nav vietas STM32F7Discovery zibatmi\u0146\u0101 (pat neskatoties uz oper\u0113t\u0101jsist\u0113mu) t\u0101 liel\u0101 koda d\u0113\u013c (vair\u0101ki megabaiti instrukciju)<\/li>\n<li>Pati bibliot\u0113ka ir uzrakst\u012bta C++, kas noz\u012bm\u0113\n<ul>\n<li>Nepiecie\u0161ama atbalsta C++ laik\u0101 (iz\u0146\u0113mumi utt.)<\/li>\n<li>Ierobe\u017eots LibC\/Posix atbalsts, kas parasti ir ieb\u016bv\u0113taj\u0101m oper\u0113t\u0101jsist\u0113m\u0101m \u2014 nepiecie\u0161ama standarta C++ bibliot\u0113ka un standarta veid\u0146u bibliot\u0113ka STL (vektori utt.)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">P\u0101rvieto\u0161ana uz Embox<\/h1>\n<p><\/p>\n<p>K\u0101 parasti, pirms jebkuru programmu p\u0101rvieto\u0161anas oper\u0113t\u0101jsist\u0113m\u0101 ir labi izm\u0113\u0123in\u0101t t\u0101s salik\u0161anu t\u0101d\u0101 veid\u0101, k\u0101 to dom\u0101ja izstr\u0101d\u0101t\u0101ji. M\u016bsu gad\u012bjum\u0101 ar to nav probl\u0113mu \u2014 avots var atrast <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHub<\/a><\/noindex>, bibliot\u0113ka tiek salikta GNU\/Linux parastaj\u0101 cmake.<\/p>\n<p><\/p>\n<p>No labaj\u0101m zi\u0146\u0101m \u2014 OpenCV no kastes var salikt statisk\u0101s bibliot\u0113kas veid\u0101, kas atvieglo p\u0101rvieto\u0161anu. Saliekam bibliot\u0113ku ar standarta konfigur\u0101ciju un skat\u0101mies, cik daudz vietas t\u0101s aiz\u0146em. Katrs modulis tiek salikts atsevi\u0161\u0137\u0101 bibliot\u0113k\u0101.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">&gt; izm\u0113rs lib\/*so --totals\n   teksts    dati     bss     dec     hex fails\n1945822   15431     960 1962213  1df0e5 lib\/libopencv_calib3d.so\n17081885     170312   25640 17277837    107a38d lib\/libopencv_core.so\n10928229     137640   20192 11086061     a928ed lib\/libopencv_dnn.so\n 842311   25680    1968  869959   d4647 lib\/libopencv_features2d.so\n 423660    8552     184  432396   6990c lib\/libopencv_flann.so\n8034733   54872    1416 8091021  7b758d lib\/libopencv_gapi.so\n  90741    3452     304   94497   17121 lib\/libopencv_highgui.so\n6338414   53152     968 6392534  618ad6 lib\/libopencv_imgcodecs.so\n21323564     155912  652056 22131532    151b34c lib\/libopencv_imgproc.so\n 724323   12176     376  736875   b3e6b lib\/libopencv_ml.so\n 429036    6864     464  436364   6a88c lib\/libopencv_objdetect.so\n6866973   50176    1064 6918213  699045 lib\/libopencv_photo.so\n 698531   13640     160  712331   ade8b lib\/libopencv_stitching.so\n 466295    6688     168  473151   7383f lib\/libopencv_video.so\n 315858    6972   11576  334406   51a46 lib\/libopencv_videoio.so\n76510375     721519  717496 77949390    4a569ce (TOTALS)<\/code><\/pre>\n<p><\/p>\n<p>K\u0101 redzams p\u0113d\u0113j\u0101 rind\u0101, .bss un .data neaiz\u0146em tik daudz vietas, ta\u010du koda ir vair\u0101k nek\u0101 70 MiB. Ir skaidrs, ka, ja to stingri sasaist\u0101m ar konkr\u0113tu lietojumprogrammu, koda b\u016bs maz\u0101k.<\/p>\n<p><\/p>\n<p>M\u0113\u0123in\u0101sim izmest p\u0113c iesp\u0113jas vair\u0101k modu\u013cu, lai izveidotu minim\u0101lu piem\u0113ru (kas, piem\u0113ram, vienk\u0101r\u0161i izvad\u012bs OpenCV versiju), t\u0101p\u0113c skat\u0101mies. <code>cmake .. -LA<\/code> un atsl\u0113dzam visus iesp\u0113jamos opcijas.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">        -DBUILD_opencv_java_bindings_generator=OFF \n        -DBUILD_opencv_stitching=OFF \n        -DWITH_PROTOBUF=OFF \n        -DWITH_PTHREADS_PF=OFF \n        -DWITH_QUIRC=OFF \n        -DWITH_TIFF=OFF \n        -DWITH_V4L=OFF \n        -DWITH_VTK=OFF \n        -DWITH_WEBP=OFF<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">&gt; izm\u0113rs lib\/libopencv_core.a --totals\n   teksts    dati     bss     dec     hex fails\n3317069   36425   17987 3371481  3371d9 (TOTALS)<\/code><\/pre>\n<p><\/p>\n<p>No vienas puses, tas ir tikai viens bibliot\u0113kas modulis, no otras puses, tas ir bez optimiz\u0101cijas kompilator\u0101 p\u0113c koda izm\u0113ra (<code>-Os<\/code>). ~3 MiB koda \u2014 tas joproj\u0101m ir diezgan daudz, bet jau dod cer\u012bbu uz pan\u0101kumiem.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">Palai\u0161ana emulator\u0101<\/h2>\n<p><\/p>\n<p>Emulator\u0101 atk\u013c\u016bdo\u0161ana ir daudz vienk\u0101r\u0161\u0101ka, t\u0101p\u0113c vispirms p\u0101rliecin\u0101mies, ka bibliot\u0113ka darbojas uz qemu. K\u0101 emulatoram izv\u0113l\u0113jos Integrator\/CP, jo, pirmk\u0101rt, tas ar\u012b ir ARM, un, otrk\u0101rt, Embox atbalsta grafikas izvad\u012b\u0161anu \u0161ai platformai.<\/p>\n<p><\/p>\n<p>Embox ir meh\u0101nisms, lai veidotu \u0101r\u0113j\u0101s bibliot\u0113kas, ar t\u0101 pal\u012bdz\u012bbu pievienojam OpenCV k\u0101 moduli (nododot visas t\u0101s pa\u0161as opcijas \u00abminim\u0101lai\u00bb kompil\u0101cijai statiskaj\u0101s bibliot\u0113k\u0101s), p\u0113c tam pievienojam visvienk\u0101r\u0161\u0101ko lietojumprogrammu, kas izskat\u0101s \u0161\u0101di:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">version.cpp:\n\n#include \n#include \n\nint main() {\n    printf(\"OpenCV: %s\", cv::getBuildInformation().c_str());\n\n    return 0;\n}<\/code><\/pre>\n<p><\/p>\n<p>Sagatavojam sist\u0113mu, palai\u017eam \u2014 ieg\u016bstam gaid\u012bto izvadi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox:\/$opencv_version                                                     \nOpenCV: \nVisp\u0101r\u0113j\u0101 konfigur\u0101cija OpenCV 4.0.1 =====================================\n  Versijas kontrole:               bd6927bdf-dirty\n\n  Platforma:\n    Laiks:                       2019-06-21T10:02:18Z\n    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    M\u0113r\u0137is:                      Visp\u0101r\u012bgs arm-unknown-none\n    CMake:                       3.14.5\n    CMake \u0123enerators:            Unix Makefiles\n    CMake veido\u0161anas r\u012bks:      \/usr\/bin\/make\n    Konfigur\u0101cija:               Debug\n\n  CPU\/HW funkcijas:\n    B\u0101zes l\u012bmenis:\n      piepras\u012bts:                 DETECT\n      izsl\u0113gts:                   VFPV3 NEON\n\n  C\/C++:\n    Veidots k\u0101 dinamiskas bibliot\u0113kas?:      N\u0112\n&lt; P\u0101r\u0113jie kompil\u0101cijas parametri -- ar k\u0101diem karogiem kompileja,\n  k\u0101di OpenCV modu\u013ci iek\u013cauti kompil\u0101cij\u0101 utt.&gt;<\/code><\/pre>\n<p><\/p>\n<p>N\u0101kamais solis \u2014 palaist k\u0101du piem\u0113ru, lab\u0101k k\u0101du standarta no tiem, ko pied\u0101v\u0101 pa\u0161i izstr\u0101d\u0101t\u0101ji <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">savas vietnes<\/a><\/noindex>. Es izv\u0113l\u0113jos <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">K\u0113nija robe\u017eu detektoru<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Piem\u0113ru n\u0101c\u0101s nedaudz p\u0101rrakst\u012bt, lai att\u0113lotu rezult\u0101ta bildi tie\u0161i fr\u0113ma bufer\u012b. To n\u0101c\u0101s izdar\u012bt, jo funkcija <code>imshow()<\/code> sp\u0113j att\u0113lot bildes caur QT, GTK un Windows interfeisiem, kuru, protams, konfigur\u0101cij\u0101 STM32 noteikti neb\u016bs. Paties\u012bb\u0101, QT ar\u012b var palaist uz STM32F7Discovery, bet par to jau b\u016bs run\u0101ts cit\u0101 rakst\u0101 \ud83d\ude42<\/p>\n<p><\/p>\n<p>P\u0113c \u012bsas noskaidro\u0161anas, k\u0101d\u0101 tie\u0161i form\u0101t\u0101 tiek glab\u0101ts detektora robe\u017eu darb\u012bbas rezult\u0101ts, ieg\u016bstam att\u0113lu.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV uz STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/127f90ad8008340d73feb6ece02e52b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ori\u0123in\u0101l\u0101 bilde<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV uz STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/da34b3ac2561ae9f223acc5c4fe2a597.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Rezult\u0101ts<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">Palaist uz STM32F7Discovery<\/h2>\n<p><\/p>\n<p>Uz 32F746GDISCOVERY ir vair\u0101ki aparat\u016bras atmi\u0146as segmenti, kurus m\u0113s varam kaut k\u0101 izmantot<\/p>\n<p><\/p>\n<ol>\n<li>320KiB operat\u012bv\u0101s atmi\u0146as<\/li>\n<li>1MiB zibsp\u0113jas atmi\u0146as att\u0113lam<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND zibatmi\u0146a<\/li>\n<li>Savienojums microSD kartei<\/li>\n<\/ol>\n<p><\/p>\n<p>SD karti var izmantot att\u0113lu uzglab\u0101\u0161anai, bet minim\u0101l\u0101 piem\u0113ra palai\u0161an\u0101 tas nav \u012bpa\u0161i noder\u012bgi.<br \/>\nDisplejam ir iz\u0161\u0137irtsp\u0113ja 480\u00d7272, un t\u0101d\u0113j\u0101di atmi\u0146a ramebuferim b\u016bs 522 240 baiti 32 bitu dzi\u013cum\u0101, t.i., tas ir vair\u0101k nek\u0101 operat\u012bv\u0101s atmi\u0146as izm\u0113rs, t\u0101p\u0113c ramebufers un kaudze (kas b\u016bs nepiecie\u0161ama ar\u012b OpenCV, lai uzglab\u0101tu att\u0113lu datus un pal\u012bgt\u012bklus) tiks novietoti SDRAM, viss p\u0101r\u0113jais (atmi\u0146a stekiem un citiem sist\u0113mas m\u0113r\u0137iem) non\u0101ks RAM.<\/p>\n<p><\/p>\n<p>Ja \u0146em simtprocent\u012bgu konfigur\u0101ciju STM32F7Discovery (izmetot visu t\u012bklu, visas komandas, padarot stekus p\u0113c iesp\u0113jas maz\u0101kus utt.) un pievienojam tur OpenCV ar piem\u0113riem, nepiecie\u0161am\u0101 atmi\u0146a b\u016bs sekojo\u0161a:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">   text    data     bss     dec     hex faila nosaukums\n2876890  459208  312736 3648834  37ad42 build\/base\/bin\/embox<\/code><\/pre>\n<p><\/p>\n<p>Lai preciz\u0113tu, kuras sada\u013cas kur iet, skaidro\u0161u: <code>.text<\/code> un <code>.rodata<\/code> atrodas instrukcijas un konstantes (vienk\u0101r\u0161oti sakot, readonly dati), <code>.data<\/code> atrodas main\u0101mie dati, <code>.bss<\/code> atrodas \u00abnulle\u00bb main\u012bgo viet\u0101, kuriem tom\u0113r nepiecie\u0161ama vieta (\u0161\u012b sada\u013ca \u00abnon\u0101ks\u00bb RAM).<\/p>\n<p><\/p>\n<p>Laba zi\u0146a ir t\u0101, ka <code>.data<\/code>\/<code>.bss<\/code> j\u0101ierodas, bet ar <code>.text<\/code> ir probl\u0113ma \u2014 att\u0113lam ir pieejama tikai 1MiB atmi\u0146a. Var izmest no <code>.text<\/code> piem\u0113ra att\u0113lu un las\u012bt to, piem\u0113ram, no SD kartes atmi\u0146\u0101 start\u0113jot, bet fruits.png svars ir aptuveni 330KiB, t\u0101p\u0113c tas probl\u0113mu atrisin\u0101s: liel\u0101k\u0101 da\u013ca <code>.text<\/code> sast\u0101v tie\u0161i no OpenCV koda.<\/p>\n<p><\/p>\n<p>Pamat\u0101 paliek tikai viens - iel\u0101d\u0113t da\u013cu koda QSPI-flash, kam ir \u012bpa\u0161s darba re\u017e\u012bms, lai kart\u0113tu atmi\u0146u uz sist\u0113mas autobusu, t\u0101d\u0113j\u0101di procesors var\u0113s tie\u0161i piek\u013c\u016bt \u0161iem datiem. \u0160aj\u0101 gad\u012bjum\u0101 rodas probl\u0113ma: pirmk\u0101rt, QSPI-flash atmi\u0146a nav pieejama t\u016bl\u012bt p\u0113c ier\u012bces restart\u0113\u0161anas (j\u0101veic atsevi\u0161\u0137a inicializ\u0101cija memory-mapped re\u017e\u012bmam), otrk\u0101rt, \u0161o atmi\u0146u nevar \u00abnore\u0123istr\u0113t\u00bb ar ierasto iel\u0101d\u0113t\u0101ju.<\/p>\n<p><\/p>\n<p>T\u0101p\u0113c tika nolemts sagrup\u0113t visu kodu QSPI un veikt t\u0101 uzrakst\u012b\u0161anu ar pa\u0161u rakst\u012btu iel\u0101d\u0113t\u0101ju, kur\u0161 sa\u0146ems nepiecie\u0161amos bin\u0101ros datus pa TFTP.<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Rezult\u0101ts<\/h1>\n<p><\/p>\n<p>Ideja port\u0113t \u0161o bibliot\u0113ku uz Embox rad\u0101s v\u0113l apm\u0113ram pirms gada, bet t\u0101 tika atk\u0101rtoti atlikta da\u017e\u0101du iemeslu d\u0113\u013c. Viens no tiem bija libstdc++ un standart\u0101 \u0161ablona bibliot\u0113kas atbalsts. Probl\u0113ma ar C++ atbalstu Embox iziet \u0101rpus \u0161\u012b raksta, t\u0101p\u0113c \u0161eit tikai teik\u0161u, ka mums izdev\u0101s sasniegt \u0161o atbalstu nepiecie\u0161amaj\u0101 apm\u0113r\u0101, lai \u0161\u012b bibliot\u0113ka darbotos \ud83d\ude42<\/p>\n<p><\/p>\n<p>Galu gal\u0101 \u0161\u012bs probl\u0113mas tika p\u0101rvar\u0113tas (vismaz pietiekam\u0101 l\u012bmen\u012b, lai OpenCV piem\u0113rs darbotos), un piem\u0113rs izpild\u012bj\u0101s. 40 ilgsto\u0161as sekundes plati mekl\u0113 robe\u017eas ar K\u0113nija filtr\u0101ciju. Tas, protams, ir par ilgu (ir idejas, k\u0101 to optimiz\u0113t, par ko var\u0113tu uzrakst\u012bt atsevi\u0161\u0137u rakstu, ja tas b\u016bs izdevies). <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV uz STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tom\u0113r starpposma m\u0113r\u0137is bija prototipa izveide, kas par\u0101d\u012btu princip\u0101lu iesp\u0113ju palaist OpenCV uz STM32, attiec\u012bgi \u0161is m\u0113r\u0137is tika sasniegts, hura!<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">tl;dr: soli pa solim instrukcija<\/h4>\n<p><\/p>\n<p>0: Lejupiel\u0101d\u0113jam Embox avota kodu, piem\u0113ram, \u0161\u0101di:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    git clone https:\/\/github.com\/embox\/embox &amp;&amp; cd .\/embox<\/code><\/pre>\n<p><\/p>\n<p>1: S\u0101ksim ar iel\u0101d\u0113t\u0101ja izveidi, kas \u00abnore\u0123istr\u0113s\u00bb QSPI-flash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>Tagad ir j\u0101iestata t\u012bkls, jo att\u0113lu iel\u0101d\u0113sim pa TFTP. Lai nor\u0101d\u012btu plates un hosta IP adreses, j\u0101p\u0101rveido fails conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Konfigur\u0101cijas piem\u0113rs:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">iface eth0 inet static\n    address 192.168.2.2\n    netmask 255.255.255.0\n    gateway 192.168.2.1\n    hwaddress aa:bb:cc:dd:ee:02<\/code><\/pre>\n<p><\/p>\n<p><code>gateway<\/code> \u2014 hosta adrese, no kuras tiks iel\u0101d\u0113ts att\u0113ls, <code>address<\/code> \u2014 plates adrese.<\/p>\n<p><\/p>\n<p>P\u0113c tam sast\u0101d\u0101m iel\u0101d\u0113t\u0101ju:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Standarta iel\u0101d\u0113t\u0101ja (atvainojiet par sp\u0113l\u0113m ar v\u0101rdiem) aug\u0161upiel\u0101de uz plates \u2014 \u0161eit nav nek\u0101 specifiska, \u0161is process j\u0101veic t\u0101pat k\u0101 jebkura cita lietojuma gad\u012bjum\u0101 STM32F7Discovery. Ja nesaprotat, k\u0101 to izdar\u012bt, varat izlas\u012bt par to <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">\u0161eit<\/a><\/noindex>.<br \/>\n3: Att\u0113la kompil\u0101cija ar konfigur\u0101ciju OpenCV.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-platform\/opencv\/stm32f7discovery\n    make<\/code><\/pre>\n<p><\/p>\n<p>4: Sekciju izvilk\u0161ana no ELF, kuras j\u0101ieraksta QSPI, fail\u0101 qspi.bin<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    arm-none-eabi-objcopy -O binary build\/base\/bin\/embox build\/base\/bin\/qspi.bin \n        --only-section=.text --only-section=.rodata \n        --only-section='.ARM.ex*' \n        --only-section=.data<\/code><\/pre>\n<p><\/p>\n<p>Kop\u0101 ar conf direktorij\u0101 ir skripts, kas to veic, t\u0101p\u0113c varat to palaist<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Nepiecie\u0161amais bin\u0101rais fails -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Ar tftp pal\u012bdz\u012bbu aug\u0161upiel\u0101d\u0113jam qspi.bin uz QSPI zibatmi\u0146u. Host\u0101 j\u0101kop\u0113 qspi.bin uz tftp-servera saknes mapi (parasti tas ir \/srv\/tftp\/ vai \/var\/lib\/tftpboot\/; attiec\u012bgie paketes ir pieejami liel\u0101kaj\u0101 da\u013c\u0101 popul\u0101ro izplat\u012b\u0161anas versiju, parasti to d\u0113v\u0113 par tftpd vai tftp-hpa, da\u017ereiz ir j\u0101veic <code>systemctl start tftpd.service<\/code> lai uzs\u0101ktu).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    # \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f tftpd\n    sudo cp build\/base\/bin\/qspi.bin \/srv\/tftp\n    # \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f tftp-hpa\n    sudo cp build\/base\/bin\/qspi.bin \/var\/lib\/tftpboot<\/code><\/pre>\n<p><\/p>\n<p>Embox\u0101 (t.i., iel\u0101d\u0113t\u0101j\u0101) \u0161\u0101da komanda j\u0101izpilda (pie\u0146emot, ka servera adrese ir 192.168.2.1):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; qspi_loader qspi.bin 192.168.2.1<\/code><\/pre>\n<p><\/p>\n<p>6: Ar komandu <code>goto<\/code> j\u0101\u00abl\u0113c\u00bb uz QSPI-atmi\u0146u. Konkr\u0113t\u0101 atra\u0161an\u0101s vieta var main\u012bties atkar\u012bb\u0101 no t\u0101, k\u0101 att\u0113ls tiek savilkts, \u0161o adresi var apskat\u012bt ar komandu <code>mem 0x90000000<\/code> (starta adrese ir otraj\u0101 32 bitu v\u0101rd\u0101 no att\u0113la); b\u016bs ar\u012b j\u0101iestata steka karogs <code>-s<\/code>, steka adrese atrodas adres\u0113 0x90000000, piem\u0113rs:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt;mem 0x90000000\n    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275\n                      \u2191           \u2191\n              t\u0101 ir adrese    t\u0101 ir  adrese \n                stekam        pirm\u0101s\n                           instrukcijas\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Karogs -i nepiecie\u0161ams, lai nepie\u013cautu p\u0101rtraukumus sist\u0113mas inicializ\u0101cijas laik\u0101\n\n    <S><\/code><\/pre>\n<p><\/p>\n<p>7: Uzs\u0101kam<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>un izbaud\u0101m 40 sekun\u017eu robe\u017eizg\u016b\u0161anas procesu \ud83d\ude42<\/p>\n<p><\/p>\n<p>Ja kaut kas noiet greizi \u2014 rakstiet jaut\u0101jumu m\u016bsu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">repozitorij\u0101<\/a><\/noindex>, vai embox-devel@googlegroups.com sarakst\u0113, vai \u0161eit koment\u0101ros.<\/p>\n<p>Avots: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/457724\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Embox, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c OpenCV \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 STM32746G. \u0415\u0441\u043b\u0438 \u0432\u0431\u0438\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 &#171;OpenCV on STM32 board&#187;, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0430\u0445 STM32 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445. \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u0435\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0441\u0443\u0434\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28450,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37914","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47OpenCV \u043d\u0430 STM32F7-Discovery | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:20:31+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:20:31+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47OpenCV uz STM32F7-Discovery | ProHoster","description":"Es esmu viens no oper\u0113t\u0101jsist\u0113mas izstr\u0101d\u0101t\u0101jiem","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47OpenCV \u043d\u0430 STM32F7-Discovery | ProHoster","og:description":"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b","og:url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:20:31+00:00","article:modified_time":"2019-10-31T19:20:31+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37914","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 19:45:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:18:22","updated":"2026-01-23 19:45:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}