Qt๋ฅผ STM32๋กœ ํฌํŒ…

Qt๋ฅผ STM32๋กœ ํฌํŒ…์ข‹์€ ์˜คํ›„์—์š” ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค ์— ๋ฐ•์Šค STM32F7-Discovery์—์„œ Qt๋ฅผ ์‹œ์ž‘ํ–ˆ๊ณ  ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ถœ์‹œ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. OpenCV.

Qt๋Š” ๊ทธ๋ž˜ํ”ฝ ๊ตฌ์„ฑ์š”์†Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์œ„ํ•œ ํด๋ž˜์Šค ์„ธํŠธ์ธ QtNetwork, ์ž๋™ํ™”์šฉ Qt(IoT ๊ตฌํ˜„ ํฌํ•จ) ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Qt ํŒ€์€ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—์„œ Qt๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•ด ์™”๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ์ด ์ƒ๋‹นํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ๊นŒ์ง€ Qt๋ฅผ ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋Ÿฌํ•œ ์ž‘์—…์ด ์–ด๋ ค์›Œ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Qt๋Š” ํฌ๊ณ  MCU๋Š” ์ž‘์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ํ˜„์žฌ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜๊ณ  ์ตœ์ดˆ์˜ ํŽœํ‹ฐ์—„๋ณด๋‹ค ์šฐ์ˆ˜ํ•œ ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ XNUMX๋…„ ์ „, Qt ๋ธ”๋กœ๊ทธ๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ. ๊ฐœ๋ฐœ์ž๋Š” RTEMS OS์šฉ Qt ํฌํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  stm32f7์„ ์‹คํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ณด๋“œ์—์„œ ์œ„์ ฏ์ด ํฌํ•จ๋œ ์˜ˆ์ œ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ๊ด€์‹ฌ์„ ๋Œ์—ˆ์Šต๋‹ˆ๋‹ค. STM32F7-Discovery์—์„œ Qt๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ด ๋ˆˆ์— ๋„์—ˆ๊ณ  ๊ฐœ๋ฐœ์ž ์Šค์Šค๋กœ๋„ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ผ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Embox์—์„œ Qt๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์œ„์ ฏ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์• ๋‹ˆ๋ฉ”์ด์…˜๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

Qt 4.8์ด ์˜ค๋žซ๋™์•ˆ Embox๋กœ ํฌํŒ…๋˜์–ด ์™”๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํƒ„๋ ฅ ์žˆ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์˜ˆ์ธ moveblocks ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

QEMU์˜ Qt moveblocksQt๋ฅผ STM32๋กœ ํฌํŒ…

์šฐ์„  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ง‘ํ•ฉ์œผ๋กœ Qt๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด โ€œ-qconfigminimal,small,medium...โ€์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. Qt์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŽ์€ ๋งคํฌ๋กœ(ํ™œ์„ฑํ™”ํ•  ํ•ญ๋ชฉ/๋น„ํ™œ์„ฑํ™”ํ•  ํ•ญ๋ชฉ)์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜ ๋’ค์— ๋‹ค๋ฅธ ๊ฒƒ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์— ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์šฐ๋ฆฌ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ.

Qt๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด OS ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ QPA(Qt Platform Abstraction)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Linux์šฉ QPA๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋ฐ˜์œผ๋กœ Qt์— ํฌํ•จ๋œ ๊ธฐ์„ฑ fb_base ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ Qt์— Embox์˜ ํ”„๋ ˆ์ž„๋ฒ„ํผ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์™ธ๋ถ€ ๋„์›€ ์—†์ด ๊ฑฐ๊ธฐ์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” emboxfb๋ผ๋Š” ์ž‘์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“œ๋Š” ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

QEmboxFbIntegration::QEmboxFbIntegration()
    : fontDb(new QGenericUnixFontDatabase())
{
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    const char *fbPath = "/dev/fb0";

    fbFd = open(fbPath, O_RDWR);
    if (fbPath < 0) {
        qFatal("QEmboxFbIntegration: Error open framebuffer %s", fbPath);
    }
    if (ioctl(fbFd, FBIOGET_FSCREENINFO, &finfo) == -1) {
        qFatal("QEmboxFbIntegration: Error ioctl framebuffer %s", fbPath);
    }
    if (ioctl(fbFd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
        qFatal("QEmboxFbIntegration: Error ioctl framebuffer %s", fbPath);
    }
    fbWidth        = vinfo.xres;
    fbHeight       = vinfo.yres;
    fbBytesPerLine = finfo.line_length;
    fbSize         = fbBytesPerLine * fbHeight;
    fbFormat       = vinfo.fmt;
    fbData = (uint8_t *)mmap(0, fbSize, PROT_READ | PROT_WRITE,
                             MAP_SHARED, fbFd, 0);
    if (fbData == MAP_FAILED) {
        qFatal("QEmboxFbIntegration: Error mmap framebuffer %s", fbPath);
    }
    if (!fbData || !fbSize) {
        qFatal("QEmboxFbIntegration: Wrong framebuffer: base = %p,"
               "size=%d", fbData, fbSize);
    }

    mPrimaryScreen = new QEmboxFbScreen(fbData, fbWidth,
                                        fbHeight, fbBytesPerLine,
                                        emboxFbFormatToQImageFormat(fbFormat));

    mPrimaryScreen->setPhysicalSize(QSize(fbWidth, fbHeight));
    mScreens.append(mPrimaryScreen);

    this->printFbInfo();
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

QRegion QEmboxFbScreen::doRedraw()
{
    QVector<QRect> rects;
    QRegion touched = QFbScreen::doRedraw();

    DPRINTF("QEmboxFbScreen::doRedrawn");

    if (!compositePainter) {
        compositePainter = new QPainter(mFbScreenImage);
    }

    rects = touched.rects();
    for (int i = 0; i < rects.size(); i++) {
        compositePainter->drawImage(rects[i], *mScreenImage, rects[i]);
    }
    return touched;
}

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ -Os์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€๊ฐ€ 3.5MB๋กœ ํŒ๋ช…๋˜์—ˆ์œผ๋ฉฐ ์ด๋Š” ๋ฌผ๋ก  STM32F746์˜ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OpenCV์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ์—์„œ ์ด๋ฏธ ์ผ๋“ฏ์ด ์ด ๋ณด๋“œ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • 1MB ROM
  • 320KB RAM
  • 8MB SDRAM
  • 16MB QSPI

QSPI์—์„œ ์ฝ”๋“œ ์‹คํ–‰์— ๋Œ€ํ•œ ์ง€์›์ด ์ด๋ฏธ OpenCV์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฏ€๋กœ ์ „์ฒด Embox c Qt ์ด๋ฏธ์ง€๋ฅผ QSPI์— ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์„ธ, ๋ชจ๋“  ๊ฒƒ์ด QSPI์—์„œ ๊ฑฐ์˜ ์ฆ‰์‹œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ OpenCV์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋„ˆ๋ฌด ๋Š๋ฆฌ๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

Qt๋ฅผ STM32๋กœ ํฌํŒ…

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ด๋ฏธ์ง€๋ฅผ QSPI์— ๋ณต์‚ฌํ•œ ๋‹ค์Œ SDRAM์— ๋กœ๋“œํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. SDRAM์—์„œ๋Š” ์กฐ๊ธˆ ๋” ๋นจ๋ผ์กŒ์ง€๋งŒ ์—ฌ์ „ํžˆ QEMU์—์„œ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์Šต๋‹ˆ๋‹ค.

Qt๋ฅผ STM32๋กœ ํฌํŒ…

๋‹ค์Œ์œผ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ํฌํ•จ์‹œํ‚ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ Qt๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ์‚ฌ๊ฐํ˜• ์ขŒํ‘œ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๋ˆˆ์— ๋„๋Š” ๊ฐ€์†๋„๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ Qt ๊ฐœ๋ฐœ์ž๋“ค์€ FPU๊ฐ€ ํ„ฐ์น˜์Šคํฌ๋ฆฐ์˜ "์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“œ๋ž˜๊ทธ" ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. moveblocks์—์„œ๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ณ„์‚ฐ์ด ํ›จ์”ฌ ์ ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ํŠน์ • ์˜ˆ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์•„์ด๋””์–ด๋Š” ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ SDRAM์—์„œ ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ™”๋ฉด ํฌ๊ธฐ๋ฅผ 480x272๊ฐ€ ์•„๋‹Œ 272x272๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒ‰ ๋†๋„๋ฅผ A8R8G8B8์—์„œ R5G6B5๋กœ ๋‚ฎ์ถ”์–ด ํ•œ ํ”ฝ์…€์˜ ํฌ๊ธฐ๋ฅผ 4๋ฐ”์ดํŠธ์—์„œ 2๋ฐ”์ดํŠธ๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ ํฌ๊ธฐ๋Š” 272 * 272 * 2 = 147968๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ƒ๋‹นํ•œ ๊ฐ€์†์ด ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ ์•„๋งˆ๋„ ๊ฐ€์žฅ ๋ˆˆ์— ๋„๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ฑฐ์˜ ๋งค๋„๋Ÿฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์ตœ์ ํ™”๋Š” RAM์—์„œ Embox ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  SDRAM์—์„œ Qt ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋จผ์ € ํ‰์†Œ์™€ ๊ฐ™์ด Embox๋ฅผ Qt์™€ ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ…์ŠคํŠธ, rodata, ๋ฐ์ดํ„ฐ ๋ฐ bss ์„ธ๊ทธ๋จผํŠธ๋ฅผ QSPI์— ๋ฐฐ์น˜ํ•œ ๋‹ค์Œ ์ด๋ฅผ SDRAM์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

section (qt_text, SDRAM, QSPI)
phdr	(qt_text, PT_LOAD, FLAGS(5))

section (qt_rodata, SDRAM, QSPI)
phdr	(qt_rodata, PT_LOAD, FLAGS(5))

section (qt_data, SDRAM, QSPI)
phdr	(qt_data, PT_LOAD, FLAGS(6))

section (qt_bss, SDRAM, QSPI)
phdr	(qt_bss, PT_LOAD, FLAGS(6))

ROM์—์„œ Embox ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋„ ๋ˆˆ์— ๋„๋Š” ๊ฐ€์†์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋งค์šฐ ๋งค๋„๋Ÿฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰์— ๊ธฐ์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๋‹ค์–‘ํ•œ Embox ๊ตฌ์„ฑ์„ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ Qt moveblocks๋Š” SDRAM์˜ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” QSPI์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ์ •ํ™•ํžˆ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ผ๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค! ๋ถ„๋ช…ํžˆ ์ดˆ๊ธฐ "์Šฌ๋ผ์ด๋“œ์‡ผ"๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋ ˆ์ž„ ๋ฒ„ํผ ํฌ๊ธฐ์˜ ์ง„๋ถ€ํ•œ ๊ฐ์†Œ๋กœ ์ธํ•ด 2๋ฐฐ ๊ฐ€์†์ด๋ฉด ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Embox ์ฝ”๋“œ๋งŒ์„ ๋‹ค์–‘ํ•œ ๊ณ ์† ๋ฉ”๋ชจ๋ฆฌ์— ์ „์†กํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค(๊ฐ€์†๋ฅ ์€ 2๋ฐฐ๊ฐ€ ์•„๋‹ˆ๊ณ  1.5๋ฐฐ ์ •๋„์˜€์Šต๋‹ˆ๋‹ค).

์ง์ ‘ ์‹œ๋„ํ•ด ๋ณด๋Š” ๋ฐฉ๋ฒ•

STM32F7-Discovery๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Embox์—์„œ Qt๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€๋Š” ๋‹น์‚ฌ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ‚ค.

๊ฒฐ๋ก 

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

์˜ฌํ•ด ์šฐ๋ฆฌ๋Š” ์ถ•์ œ์— ์ฐธ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค TechTrain. ์—ฌ๊ธฐ์„œ๋Š” ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ์˜ Qt, OpenCV ๋ฐ ๊ธฐํƒ€ ์„ฑ๊ณผ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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