STM32F7-Discovery์˜ OpenCV

STM32F7-Discovery์˜ OpenCV ๋‚˜๋Š” ์šด์˜ ์ฒด์ œ ๊ฐœ๋ฐœ์ž ์ค‘ ํ•œ ๋ช…์ž…๋‹ˆ๋‹ค. ์— ๋ฐ•์Šค, ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” STM32746G ๋ณด๋“œ์—์„œ OpenCV๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

"STM32 ๋ณด๋“œ์˜ OpenCV"์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฒ€์ƒ‰ ์—”์ง„์— ์ž…๋ ฅํ•˜๋ฉด STM32 ๋ณด๋“œ ๋˜๋Š” ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ฝค โ€‹โ€‹๋งŽ์ด ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฆ„์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ์‹œ์—ฐํ•ด์•ผ ํ•˜๋Š” ๋™์˜์ƒ์ด ์—ฌ๋Ÿฟ ์žˆ๋Š”๋ฐ, ๋ณดํ†ต (์ œ๊ฐ€ ๋ณธ ๋ชจ๋“  ๋™์˜์ƒ์—์„œ) STM32 ๋ณด๋“œ์—์„œ๋Š” ์นด๋ฉ”๋ผ์—์„œ ์ด๋ฏธ์ง€๋งŒ ๋ฐ›์•„ ํ™”๋ฉด์— ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คฌ๊ณ , ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ž์ฒด๋Š” ์ผ๋ฐ˜ ์ปดํ“จํ„ฐ ๋˜๋Š” ๋” ๊ฐ•๋ ฅํ•œ ๋ณด๋“œ(์˜ˆ: Raspberry Pi)์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์™œ ์–ด๋ ค์šด๊ฐ€์š”?

๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์˜ ์ธ๊ธฐ๋Š” OpenCV๊ฐ€ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์ปดํ“จํ„ฐ ๋น„์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ์‚ฌ์‹ค๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ OpenCV์— ์ต์ˆ™ํ•˜๊ณ  ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ์Šคํฌํ†ฑ ์ค€๋น„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ธ๊ธฐ์žˆ๋Š” ๊ธฐ์„ฑํ’ˆ ๋ ˆ์‹œํ”ผ๊ฐ€ ์•„์ง์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ž‘์€ shawls์—์„œ OpenCV๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ์†Œํ•œ์˜ ๋ชจ๋“ˆ ์„ธํŠธ๋กœ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ๋งค์šฐ ํฐ ์ฝ”๋“œ(์ˆ˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋ช…๋ น)๋กœ ์ธํ•ด ๋™์ผํ•œ STM32F7Discovery(OS๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„)์˜ ํ”Œ๋ž˜์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋Š” C++๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํฌ์ง€ํ‹ฐ๋ธŒ ๋Ÿฐํƒ€์ž„ ์ง€์› ํ•„์š”(์˜ˆ์™ธ ๋“ฑ)
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์šฉ OS์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” LibC/Posix์— ๋Œ€ํ•œ ์ง€์›์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ํ”Œ๋Ÿฌ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ‘œ์ค€ STL ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฒกํ„ฐ ๋“ฑ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Embox๋กœ ํฌํŒ…

์—ฌ๋Š ๋•Œ์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋žจ์„ ์šด์˜ ์ฒด์ œ์— ํฌํŒ…ํ•˜๊ธฐ ์ „์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ํ˜•ํƒœ๋กœ ๋นŒ๋“œํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐํƒ€๋ฒ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ธ cmake๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GNU/Linux์—์„œ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์€ 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๋Š” ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š์ง€๋งŒ ์ฝ”๋“œ๋Š” 70MiB ์ด์ƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ž„์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ์˜ ์˜ˆ์ œ๊ฐ€ ์กฐ๋ฆฝ๋˜๋„๋ก ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๋ชจ๋“ˆ์„ ๋ฒ„๋ฆฌ๋„๋ก ๋…ธ๋ ฅํ•ฉ์‹œ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ๋‹จ์ˆœํžˆ 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). ~3MiB์˜ ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ๊ฝค ๋งŽ์ง€๋งŒ ์ด๋ฏธ ์„ฑ๊ณต์— ๋Œ€ํ•œ ํฌ๋ง์„ ์ค๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‹คํ–‰

์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋””๋ฒ„๊ทธํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ 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์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ธฐ์‚ฌ์—์„œ ๋…ผ์˜๋ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

์—์ง€ ๊ฒ€์ถœ๊ธฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋˜๋Š” ํ˜•์‹์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•œ ํ›„ ์ด๋ฏธ์ง€๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

STM32F7-Discovery์˜ OpenCV

์›๋ณธ ์‚ฌ์ง„

STM32F7-Discovery์˜ OpenCV

๊ฒฐ๊ณผ

STM32F7Discovery์—์„œ ์‹คํ–‰

32F746GDISCOVERY์—๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ•˜๋“œ์›จ์–ด ๋ฉ”๋ชจ๋ฆฌ ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. 320KiB RAM
  2. ์ด๋ฏธ์ง€์šฉ 1MiB ํ”Œ๋ž˜์‹œ
  3. 8MiB SDRAM
  4. 16MiB QSPI ๋‚ธ๋“œ ํ”Œ๋ž˜์‹œ
  5. microSD ์นด๋“œ ์Šฌ๋กฏ

SD ์นด๋“œ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋งฅ๋ฝ์—์„œ ์ด๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋””์Šคํ”Œ๋ ˆ์ด์˜ ํ•ด์ƒ๋„๋Š” 480ร—272์ด๋ฉฐ, ์ด๋Š” ํ”„๋ ˆ์ž„ ๋ฒ„ํผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 522๋น„ํŠธ ๊นŠ์ด์—์„œ 240๋ฐ”์ดํŠธ๊ฐ€ ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RAM์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ ˆ์ž„ ๋ฒ„ํผ์™€ ํž™(OpenCV๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ฐ ๋ณด์กฐ ๊ตฌ์กฐ์šฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•จ)์€ SDRAM์— ์œ„์น˜ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ(์Šคํƒ์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ์‹œ์Šคํ…œ ์š”๊ตฌ ์‚ฌํ•ญ) ) RAM์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

STM32F7Discovery์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ตฌ์„ฑ(์ „์ฒด ๋„คํŠธ์›Œํฌ, ๋ชจ๋“  ๋ช…๋ น์„ ๋ฒ„๋ฆฌ๊ณ  ์Šคํƒ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ)์„ ์ทจํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ์˜ˆ์ œ์™€ ํ•จ๊ป˜ OpenCV๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์–ด๋Š ์„น์…˜์ด ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. .text ะธ .rodata ๋ช…๋ น ๋ฐ ์ƒ์ˆ˜(๋Œ€๋žต์ ์œผ๋กœ ๋งํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ)๋Š” ๋‹ค์Œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค. .data ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๋ณ€์ ์ด๋ฉฐ, .bss ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•œ "nulled"๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ์„น์…˜์€ RAM์œผ๋กœ "์ด๋™"ํ•ฉ๋‹ˆ๋‹ค).

์ข‹์€ ์†Œ์‹์€ .data/.bss ๋งž์•„์•ผ ํ•˜์ง€๋งŒ .text ๋ฌธ์ œ๋Š” ์ด๋ฏธ์ง€์šฉ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1MiB๋ฐ–์— ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Œ .text ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์ž‘ ์‹œ SD ์นด๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ˆ์ œ์˜ ๊ทธ๋ฆผ์„ ์ฝ์–ด์˜ค์ง€๋งŒ fruits.png์˜ ๋ฌด๊ฒŒ๋Š” ์•ฝ 330KiB์ด๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ .text OpenCV ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด๋กœ ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ QSPI ํ”Œ๋ž˜์‹œ์— ๋กœ๋“œํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค(ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ด ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹œ์Šคํ…œ ๋ฒ„์Šค์— ๋งคํ•‘ํ•˜๋Š” ํŠน์ˆ˜ ์ž‘์—… ๋ชจ๋“œ๊ฐ€ ์žˆ์Œ). ์ด ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฒซ์งธ, ์žฅ์น˜๋ฅผ ์žฌ๋ถ€ํŒ…ํ•œ ์งํ›„ QSPI ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ(๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๋ชจ๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ) ๋‘˜์งธ, ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด "ํ”Œ๋ž˜์‹œ"ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์นœ์ˆ™ํ•œ ๋ถ€ํŠธ๋กœ๋”.

๊ฒฐ๊ณผ์ ์œผ๋กœ QSPI์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  TFTP๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์ž์ฒด ์ž‘์„ฑ ๋กœ๋”๋กœ ํ”Œ๋ž˜์‹œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Embox๋กœ ํฌํŒ…ํ•˜๋ ค๋Š” ์•„์ด๋””์–ด๋Š” ์•ฝ XNUMX๋…„ ์ „์— ๋‚˜ํƒ€๋‚ฌ์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ณ„์†ํ•ด์„œ ์—ฐ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” libstdc++ ๋ฐ ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ง€์›์ž…๋‹ˆ๋‹ค. Embox์˜ C++ ์ง€์› ๋ฌธ์ œ๋Š” ์ด ๊ธฐ์‚ฌ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ์ ์ ˆํ•œ ์–‘์œผ๋กœ ์ด ์ง€์›์„ ๋‹ฌ์„ฑํ–ˆ๋‹ค๊ณ ๋งŒ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ™‚

๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๊ทน๋ณต๋˜์—ˆ๊ณ (์ตœ์†Œํ•œ OpenCV ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•จ) ์˜ˆ์ œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋“œ๊ฐ€ Canny ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ 40์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค (์ด ๋ฌธ์ œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์„ฑ๊ณตํ•  ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

STM32F7-Discovery์˜ OpenCV

๊ทธ๋Ÿฌ๋‚˜ ์ค‘๊ฐ„ ๋ชฉํ‘œ๋Š” ๊ฐ๊ฐ STM32์—์„œ OpenCV๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทผ๋ณธ์ ์ธ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์—ฌ์ค„ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๊ณ , ์ด ๋ชฉํ‘œ๋Š” ๋‹ฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์„ธ!

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: QSPI์— ์“ธ ELF ์„น์…˜์—์„œ 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์ดˆ์˜ ๊ฒฝ๊ณ„ ๊ฒ€์ƒ‰์„ ์ฆ๊ฒจ๋ณด์„ธ์š” ๐Ÿ™‚

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ ์ €์žฅ์†Œ, ๋˜๋Š” ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋กœ [์ด๋ฉ”์ผ ๋ณดํ˜ธ], ๋˜๋Š” ์—ฌ๊ธฐ ๋Œ“๊ธ€์—์„œ.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€