OpenCV Π½Π° STM32F7-Discovery

OpenCV Π½Π° STM32F7-Discovery Π― ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Embox, ΠΈ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΏΡ€ΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρƒ мСня ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ OpenCV Π½Π° ΠΏΠ»Π°Ρ‚Π΅ STM32746G.

Если Π²Π±ΠΈΡ‚ΡŒ Π² поисковик Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ «OpenCV on STM32 board», ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ довольно ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ интСрСсуСтся использованиСм этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° ΠΏΠ»Π°Ρ‚Π°Ρ… STM32 ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ….
Π•ΡΡ‚ΡŒ нСсколько Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, судя ΠΏΠΎ названию, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ (Π²ΠΎ всСх Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π²ΠΈΠ΄Π΅Π») Π½Π° ΠΏΠ»Π°Ρ‚Π΅ STM32 ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π° экран, Π° сама ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° изобраТСния дСлалась Π»ΠΈΠ±ΠΎ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π»ΠΈΠ±ΠΎ Π½Π° ΠΏΠ»Π°Ρ‚Π°Ρ… ΠΏΠΎΠΌΠΎΡ‰Π½Π΅Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Raspberry Pi).

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это слоТно?

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ поисковых запросов ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ OpenCV β€” самая популярная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, с Π½Π΅ΠΉ Π·Π½Π°ΠΊΠΎΠΌΠΎ большС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π΄Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ для дСсктопа ΠΊΠΎΠ΄ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ популярных Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹?

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° использования OpenCV Π½Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ… связана с двумя особСнностиями:

  • Если ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π΄Π°ΠΆΠ΅ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π²ΠΎ Ρ„Π»ΡΡˆ-ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‚ΠΎΠΉ ΠΆΠ΅ STM32F7Discovery ΠΎΠ½Π° просто Π½Π΅ Π²Π»Π΅Π·Π΅Ρ‚ (Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° ОБ) ΠΈΠ·-Π·Π° ΠΎΡ‡Π΅Π½ΡŒ большого ΠΊΠΎΠ΄Π° (нСсколько ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ инструкций)
  • Π‘Π°ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° написана Π½Π° C++, Π° Π·Π½Π°Ρ‡ΠΈΡ‚
    • НуТна ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° плюсового Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Ρ‚.ΠΏ.)
    • Мало ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ LibC/Posix, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΅ΡΡ‚ΡŒ Π² ОБ для встроСнных систСм β€” Π½ΡƒΠΆΠ½Π° стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° плюсов ΠΈ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° шаблонов STL (vector ΠΈ Ρ‚.Π΄.)

ΠŸΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Embox

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π΅Ρ‘ Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ это Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ. Π’ нашСм случаС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с этим Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ β€” исходники ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собираСтся ΠΏΠΎΠ΄ GNU/Linux ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ cmake-ΠΎΠΌ.

Из Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… новостСй β€” OpenCV ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‰Π΅. Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ со стандартным ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ ΠΈ смотрим, сколько мСста ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ собираСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

> 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)

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· послСднСй строки, .bss ΠΈ .data Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ мСста, Π·Π°Ρ‚ΠΎ ΠΊΠΎΠ΄Π° большС 70 ΠœΠΈΠ‘. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ссли это ΡΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Ρ‚ΡŒ статичСски с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΠ΄Π° станСт мСньшС.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ собрался ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, просто Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ OpenCV), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ смотрим cmake .. -LA ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π² опциях всё, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ.

        -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)

Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, это Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ компилятором ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΊΠΎΠ΄Π° (-Os). ~3 ΠœΠΈΠ‘ ΠΊΠΎΠ΄Π° β€” это всё Π΅Ρ‰Ρ‘ достаточно ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ ΡƒΠΆΠ΅ Π΄Π°Ρ‘Ρ‚ Π½Π°Π΄Π΅ΠΆΠ΄Ρƒ Π½Π° успСх.

Запуск Π² эмуляторС

На эмуляторС ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, поэтому сначала убСдимся, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° qemu. Π’ качСствС эмулируСмой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ я Π²Ρ‹Π±Ρ€Π°Π» Integrator/CP, Ρ‚.ΠΊ. Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это Ρ‚ΠΎΠΆΠ΅ ARM, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Embox ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ для этой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Π’ Embox Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для сборки Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ добавляСм OpenCV ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (ΠΏΠ΅Ρ€Π΅Π΄Π°Π² всС Ρ‚Π΅ ΠΆΠ΅ ΠΎΠΏΡ†ΠΈΠΈ для «ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ» сборки Π² Π²ΠΈΠ΄Π΅ статичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ), послС этого добавляю ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выглядит Ρ‚Π°ΠΊ:

version.cpp:

#include <stdio.h>
#include <opencv2/core/utility.hpp>

int main() {
    printf("OpenCV: %s", cv::getBuildInformation().c_str());

    return 0;
}

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ систСму, запускаСм β€” ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄.

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 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² сборку ΠΈ Ρ‚.ΠΏ.>

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ стандартный ΠΈΠ· Ρ‚Π΅Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ сами Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρƒ сСбя Π½Π° сайтС. Π― Π²Ρ‹Π±Ρ€Π°Π» Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Π³Ρ€Π°Π½ΠΈΡ† Кэнни.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π²ΠΎ фрэйм-Π±ΡƒΡ„Ρ„Π΅Ρ€. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ, Ρ‚.ΠΊ. функция imshow() ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ изобраТСния Ρ‡Π΅Ρ€Π΅Π· интСрфСйсы QT, GTK ΠΈ Windows, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, само собой, Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ для STM32 Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. На самом Π΄Π΅Π»Π΅, QT Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° STM32F7Discovery, Π½ΠΎ ΠΎΠ± этом Π±ΡƒΠ΄Π΅Ρ‚ рассказано ΡƒΠΆΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ πŸ™‚

ПослС Π½Π΅Π΄ΠΎΠ»Π³ΠΎΠ³ΠΎ выяснСния, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ хранится Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Π³Ρ€Π°Π½ΠΈΡ†, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

OpenCV Π½Π° STM32F7-Discovery

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°

OpenCV Π½Π° STM32F7-Discovery

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Запуск Π½Π° STM32F7Discovery

На 32F746GDISCOVERY Π΅ΡΡ‚ΡŒ нСсколько Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

  1. 320KiB ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти
  2. 1MiB Ρ„Π»ΡΡˆ-памяти для ΠΎΠ±Ρ€Π°Π·Π°
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND-Ρ„Π»ΡΡˆΠΊΠ°
  5. Π Π°Π·ΡŠΡ‘ΠΌ для microSD-ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ

SD-ΠΊΠ°Ρ€Ρ‚Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для хранСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ Π² контСкстС запуска минимального ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
ДисплСй ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ 480×272, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Ρ„Π΅Ρ€ составит 522 240 Π±Π°ΠΉΡ‚ ΠΏΡ€ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Π΅ 32 Π±ΠΈΡ‚Π°, Ρ‚.Π΅. это большС, Ρ‡Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Ρ„Π΅Ρ€ ΠΈ ΠΊΡƒΡ‡Ρƒ (которая потрСбуСтся Π² Ρ‚ΠΎΠΌ числС для OpenCV, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… структур) Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Π² SDRAM, всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ (ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ стэки ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ систСмныС Π½ΡƒΠΆΠ΄Ρ‹) отправится Π² RAM.

Если Π²Π·ΡΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ для STM32F7Discovery (Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ всю ΡΠ΅Ρ‚ΡŒ, всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ стэки ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС ΠΈ Ρ‚.Π΄.) ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° OpenCV с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ, с Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

   text    data     bss     dec     hex filename
2876890  459208  312736 3648834  37ad42 build/base/bin/embox

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π·Π½Π°ΠΊΠΎΠΌ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ сСкции ΠΊΡƒΠ΄Π° складываСтся, поясню: Π² .text ΠΈ .rodata Π»Π΅ΠΆΠ°Ρ‚ интструкции ΠΈ константы (Π³Ρ€ΡƒΠ±ΠΎ говоря, readonly-Π΄Π°Π½Π½Ρ‹Π΅), Π² .data Π»Π΅ΠΆΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ измСняСмыС, Π² .bss Π»Π΅ΠΆΠΈΡ‚ «Π·Π°Π½ΡƒΠ»Ρ‘Π½Π½Ρ‹Π΅» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½ΡƒΠΆΠ½ΠΎ мСсто (эта сСкция «ΠΎΡ‚правится» Π² RAM).

Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ .data/.bss Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ, Π° Π²ΠΎΡ‚ с .text Π±Π΅Π΄Π° β€” ΠΏΠΎΠ΄ ΠΎΠ±Ρ€Π°Π· Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1MiB памяти. МоТно Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΈΠ· .text ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‘, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с SD-ΠΊΠ°Ρ€Ρ‚Ρ‹ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈ запускС, Π½ΠΎ fruits.png вСсит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 330KiB, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ это Π½Π΅ Ρ€Π΅ΡˆΠΈΡ‚: большая Ρ‡Π°ΡΡ‚ΡŒ .text состоит ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· ΠΊΠΎΠ΄Π° OpenCV.

По Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ счёту, остаётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ β€” Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° части ΠΊΠΎΠ΄Π° Π½Π° QSPI-Ρ„Π»ΡΡˆΠΊΡƒ (Ρƒ Π½Π΅Ρ‘ Π΅ΡΡ‚ΡŒ спСц. Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ для мэпирования памяти Π½Π° ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΡˆΠΈΠ½Ρƒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ процСссор смоТСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ этим Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ). ΠŸΡ€ΠΈ этом Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠ°ΠΌΡΡ‚ΡŒ QSPI-Ρ„Π»ΡΡˆΠΊΠΈ нСдоступна сразу послС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ устройства (Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ memory-mapped-Ρ€Π΅ΠΆΠΈΠΌ), Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, нСльзя «ΠΏΡ€ΠΎΡˆΠΈΡ‚ΡŒ» эту ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄ Π² QSPI, Π° ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ самописным Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ ΠΏΠΎ TFTP.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

ИдСя ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Embox появилось Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π³ΠΎΠ΄ Π½Π°Π·Π°Π΄, Π½ΠΎ Ρ€Π°Π· Π·Π° Ρ€Π°Π·ΠΎΠΌ это ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΎΡΡŒ ΠΈΠ·-Π·Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½. Одна ΠΈΠ· Π½ΠΈΡ… β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° libstdc++ ΠΈ standart template library. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ C++ Π² Embox Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ, поэтому здСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ скаТу, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ ΠΎΠ±ΡŠΡ‘ΠΌΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ πŸ™‚

Π’ ΠΈΡ‚ΠΎΠ³Π΅ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Ρ‹Π»ΠΈ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π½Ρ‹ (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² достаточной стСпСни для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° OpenCV), ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ запустился. 40 Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСкунд Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρƒ ΠΏΠ»Π°Ρ‚Ρ‹ поиск Π³Ρ€Π°Π½ΠΈΡ† Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ Кэнни. Π­Ρ‚ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, слишком Π΄ΠΎΠ»Π³ΠΎ (Π΅ΡΡ‚ΡŒ сообраТСния, ΠΊΠ°ΠΊ это Π΄Π΅Π»ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ± этом ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π² случаС успСха).

OpenCV Π½Π° STM32F7-Discovery

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ Π±Ρ‹Π»ΠΎ созданиС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска OpenCV Π½Π° STM32, соотвСтствСнно, эта Ρ†Π΅Π»ΡŒ Π±Ρ‹Π»Π° достигнута, ΡƒΡ€Π°!

tl;dr: пошаговая инструкция

0: ΠšΠ°Ρ‡Π°Π΅ΠΌ исходники Embox, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ:

    git clone https://github.com/embox/embox && cd ./embox

1: Начнём со сборки Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ «ΠΏΡ€ΠΎΡˆΡŒΡ‘Ρ‚» QSPI-Ρ„Π»ΡΡˆΠΊΡƒ.

    make confload-arm/stm32f7cube

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ΅Ρ‚ΡŒ, Ρ‚.ΠΊ. Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎ TFTP. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ IP-адрСса ΠΏΠ»Π°Ρ‚Ρ‹ ΠΈ хоста, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» conf/rootfs/network.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

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 β€” адрСс хоста, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Π·, address β€” адрСс ΠΏΠ»Π°Ρ‚Ρ‹.

ПослС этого собираСм Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ:

    make

2: ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° (проститС Π·Π° ΠΊΠ°Π»Π°ΠΌΠ±ΡƒΡ€) Π½Π° ΠΏΠ»Π°Ρ‚Ρƒ β€” здСсь Π½ΠΈΡ‡Π΅Π³ΠΎ спСцифичного, Π½ΡƒΠΆΠ½ΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ для любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ прилоТСния для STM32F7Discovery. Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ это дСлаСтся, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ± этом Ρ‚ΡƒΡ‚.
3: ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΎΠ±Ρ€Π°Π·Π° с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ для OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ELF сСкций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² QSPI, Π² 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

Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ conf Π»Π΅ΠΆΠΈΡ‚ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ это Π΄Π΅Π»Π°Π΅Ρ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ

    ./conf/qspi_objcopy.sh # НуТный Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ -- build/base/bin/qspi.bin

5: Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ tftp Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ qspi.bin.bin Π½Π° QSPI-Ρ„Π»ΡΡˆΠΊΡƒ. На хостС для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ qspi.bin Π² ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ tftp-сСрвСра (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это /srv/tftp/ ΠΈΠ»ΠΈ /var/lib/tftpboot/; ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сСрвСра Π΅ΡΡ‚ΡŒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ популярных дистрибутивов, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ называСтся tftpd ΠΈΠ»ΠΈ tftp-hpa, ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ systemctl start tftpd.service для старта).

    # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для tftpd
    sudo cp build/base/bin/qspi.bin /srv/tftp
    # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для tftp-hpa
    sudo cp build/base/bin/qspi.bin /var/lib/tftpboot

На Embox-Π΅ (Ρ‚.Π΅. Π² Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ΅) Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ сСрвСра адрСс 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ goto Π½ΡƒΠΆΠ½ΠΎ «ΠΏΡ€Ρ‹Π³Π½ΡƒΡ‚ΡŒ» Π² QSPI-ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ локация Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π· слинкуСтся, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ этот адрСс ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ mem 0x90000000 (адрСс старта укладываСтся Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ слово ΠΎΠ±Ρ€Π°Π·Π°); Ρ‚Π°ΠΊΠΆΠ΅ потрСбуСтся Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ стэк Ρ„Π»Π°Π³ΠΎΠΌ -s, адрСс стэка Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎ адрСсу 0x90000000, ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

    embox>mem 0x90000000
    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275
                      ↑           ↑
              это адрСс    это  адрСс 
                стэка        ΠΏΠ΅Ρ€Π²ΠΎΠΉ
                           инструкции

    embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡƒΠΆΠ΅Π½ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ прСрывания Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы

    < Начиная ΠΎΡ‚ΡΡŽΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°, Π° ΠΎΠ±Ρ€Π°Π·Π° с OpenCV >

7: ЗапускаСм

    embox> edges 20

ΠΈ наслаТдаСмся 40-сСкундным поиском Π³Ρ€Π°Π½ΠΈΡ† πŸ™‚

Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ β€” ΠΏΠΈΡˆΠΈΡ‚Π΅ issue Π² нашСм Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, ΠΈΠ»ΠΈ Π² рассылку [email protected], ΠΈΠ»ΠΈ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ здСсь.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ