ื”ืขื‘ืจืช Qt ืœ-STM32

ื”ืขื‘ืจืช Qt ืœ-STM32ืื—ืจ ื”ืฆื”ืจื™ื™ื ื˜ื•ื‘ื™ื ืื ื—ื ื• ื‘ืคืจื•ื™ืงื˜ ืืžื‘ื•ืงืก ื”ืฉื™ืง Qt ื‘- STM32F7-Discovery ื•ืจื•ืฆื” ืœื“ื‘ืจ ืขืœ ื–ื”. ืงื•ื“ื ื›ื‘ืจ ืกื™ืคืจื ื• ืื™ืš ื”ืฆืœื—ื ื• ืœื”ืฉื™ืง OpenCV.

Qt ื”ื™ื ืžืกื’ืจืช ื—ื•ืฆืช ืคืœื˜ืคื•ืจืžื•ืช ื”ื›ื•ืœืœืช ืœื ืจืง ืจื›ื™ื‘ื™ื ื’ืจืคื™ื™ื, ืืœื ื’ื ื“ื‘ืจื™ื ื›ืžื• QtNetwork, ืกื˜ ืฉืœ ืžื—ืœืงื•ืช ืœืขื‘ื•ื“ื” ืขื ืžืกื“ื™ ื ืชื•ื ื™ื, Qt for Automation (ื›ื•ืœืœ ืœื”ื˜ืžืขืช IoT) ื•ืขื•ื“ ื”ืจื‘ื” ื™ื•ืชืจ. ืฆื•ื•ืช Qt ื”ื™ื” ืคืจื•ืืงื˜ื™ื‘ื™ ื‘ืฉื™ืžื•ืฉ ื‘-Qt ื‘ืžืขืจื›ื•ืช ืžืฉื•ื‘ืฆื•ืช, ื›ืš ืฉื”ืกืคืจื™ื•ืช ื ื™ืชื ื•ืช ืœื”ื’ื“ืจื”. ืขื ื–ืืช, ืขื“ ืœืื—ืจื•ื ื”, ืžืขื˜ื™ื ื—ืฉื‘ื• ืขืœ ื”ืขื‘ืจืช Qt ืœืžื™ืงืจื•-ื‘ืงืจื™ื, ื›ื ืจืื” ื‘ื’ืœืœ ืฉืžืฉื™ืžื” ื›ื–ื• ื ืจืื™ืช ืงืฉื” - Qt ื’ื“ื•ืœ, MCUs ืงื˜ื ื™ื.

ืžืฆื“ ืฉื ื™, ื›ืจื’ืข ื™ืฉ ืžื™ืงืจื•-ื‘ืงืจื™ื ื”ืžื™ื•ืขื“ื™ื ืœืขื‘ื•ื“ ืขื ืžื•ืœื˜ื™ืžื“ื™ื” ื•ืขื•ืœื™ื ืขืœ ืคื ื™ ื”ืคื ื˜ื™ื•ื ื”ืจืืฉื•ื ื™ื. ืœืคื ื™ ื›ืฉื ื” ื”ื•ืคื™ืข ื”ื‘ืœื•ื’ Qt ืœื”ืฆื™ื‘. ื”ืžืคืชื—ื™ื ืขืฉื• ื™ืฆื™ืื” ืฉืœ Qt ืขื‘ื•ืจ ืžืขืจื›ืช ื”ื”ืคืขืœื” RTEMS, ื•ื”ืฉื™ืงื• ื“ื•ื’ืžืื•ืช ืขื ื•ื•ื™ื“ื’'ื˜ื™ื ื‘ืžืกืคืจ ืœื•ื—ื•ืช ืฉืžืจื™ืฆื™ื stm32f7. ื–ื” ืขื ื™ื™ืŸ ืื•ืชื ื•. ื”ื™ื” ืžื•ืจื’ืฉ, ื•ื”ืžืคืชื—ื™ื ืขืฆืžื ื›ื•ืชื‘ื™ื ืขืœ ื›ืš, ืฉ-Qt ืื™ื˜ื™ ื‘-STM32F7-Discovery. ืชื”ื™ื ื• ืื ื ื•ื›ืœ ืœื”ืจื™ืฅ Qt ืชื—ืช Embox, ื•ืœื ืจืง ืœืฆื™ื™ืจ ื•ื•ื™ื“ื’'ื˜, ืืœื ืœื”ืจื™ืฅ ืื ื™ืžืฆื™ื”.

Qt 4.8 ื”ื•ืขื‘ืจ ืœ-Embox ื‘ืžืฉืš ื–ืžืŸ ืจื‘, ืื– ื”ื—ืœื˜ื ื• ืœื ืกื•ืช ืื•ืชื• ืขืœื™ื•. ื‘ื—ืจื ื• ื‘ืืคืœื™ืงืฆื™ื™ืช moveblocks - ื“ื•ื’ืžื” ืœืื ื™ืžืฆื™ื” ืงืคื™ืฆื™ืช.

Qt moveblocks ืขืœ QEMUื”ืขื‘ืจืช Qt ืœ-STM32

ืžืœื›ืชื—ื™ืœื”, ืื ื• ืžื’ื“ื™ืจื™ื ืืช Qt, ืื ืืคืฉืจ, ืขื ืกื˜ ื”ืจื›ื™ื‘ื™ื ื”ืžื™ื ื™ืžืœื™ ื”ื ื“ืจืฉ ืœืชืžื™ื›ื” ื‘ืื ื™ืžืฆื™ื”. ื‘ืฉื‘ื™ืœ ื–ื” ื™ืฉ ืืคืฉืจื•ืช "-qconfig minimal,small, medium...". ื”ื•ื ืžื—ื‘ืจ ืงื•ื‘ืฅ ืชืฆื•ืจื” ืž-Qt ืขื ืคืงื•ื“ื•ืช ืžืืงืจื• ืจื‘ื•ืช - ืžื” ืœื”ืคืขื™ืœ / ืžื” ืœื‘ื˜ืœ. ืœืื—ืจ ืืคืฉืจื•ืช ื–ื•, ื ื•ืกื™ืฃ ื“ื’ืœื™ื ื ื•ืกืคื™ื ืœืชืฆื•ืจื” ืื ื‘ืจืฆื•ื ื ื• ืœื”ืฉื‘ื™ืช ืžืฉื”ื• ืื—ืจ. ื”ื ื” ื“ื•ื’ืžื” ืฉืœื ื• ืชึฐืฆื•ึผืจึธื”.

ื›ื“ื™ ืฉ-Qt ื™ืขื‘ื•ื“, ืขืœื™ืš ืœื”ื•ืกื™ืฃ ืฉื›ื‘ืช ืชืื™ืžื•ืช ืœืžืขืจื›ืช ื”ื”ืคืขืœื”. ื“ืจืš ืื—ืช ื”ื™ื ืœื™ื™ืฉื QPA (Qt Platform Abstraction). ืœืงื—ื ื• ื›ื‘ืกื™ืก ืืช ื”ืชื•ืกืฃ fb_base ื”ืžื•ื›ืŸ ื”ื›ืœื•ืœ ื‘-Qt, ืฉืขืœ ื‘ืกื™ืกื• ืขื•ื‘ื“ QPA ืขื‘ื•ืจ ืœื™ื ื•ืงืก. ื”ืชื•ืฆืื” ื”ื™ื ืชื•ืกืฃ ืงื˜ืŸ ื‘ืฉื emboxfb, ืฉืžืกืคืง ืœ-Qt ืืช ื”-framebuffer ืฉืœ Embox, ื•ืื– ื”ื•ื ืžืฆื™ื™ืจ ืœืฉื ืœืœื ื›ืœ ืขื–ืจื” ืžื‘ื—ื•ืฅ.

ื›ืš ื ืจืื™ืช ื™ืฆื™ืจืช ืชื•ืกืฃ

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.5 ืžื’ื”-ื‘ื™ื™ื˜, ืžื” ืฉื›ืžื•ื‘ืŸ ืœื ื ื›ื ืก ืœื–ื™ื›ืจื•ืŸ ื”ืจืืฉื™ ืฉืœ ื”-STM32F746. ื›ืคื™ ืฉื›ื‘ืจ ื›ืชื‘ื ื• ื‘ืžืืžืจ ืื—ืจ ืฉืœื ื• ืขืœ OpenCV, ืœืœื•ื— ื”ื–ื” ื™ืฉ:

  • 1 MB ROM
  • ื–ื™ื›ืจื•ืŸ RAM ืฉืœ 320 KB
  • 8 MB SDRAM
  • 16 MB QSPI

ืžื›ื™ื•ื•ืŸ ืฉื›ื‘ืจ ื ื•ืกืคื” ืœ-OpenCV ืชืžื™ื›ื” ื‘ื‘ื™ืฆื•ืข ืงื•ื“ ืž-QSPI, ื”ื—ืœื˜ื ื• ืœื”ืชื—ื™ืœ ื‘ื˜ืขื™ื ืช ื›ืœ ืชืžื•ื ืช ื”-Embox c Qt ืœืชื•ืš QSPI. ื•ื”ื™ื”, ื”ื›ืœ ื”ืชื—ื™ืœ ื›ืžืขื˜ ืžื™ื“ ืž-QSPI! ืื‘ืœ ื›ืžื• ื‘ืžืงืจื” ืฉืœ OpenCV, ื”ืชื‘ืจืจ ืฉื”ื•ื ืขื•ื‘ื“ ืœืื˜ ืžื“ื™.

ื”ืขื‘ืจืช Qt ืœ-STM32

ืœื›ืŸ, ื”ื—ืœื˜ื ื• ืœืขืฉื•ืช ืืช ื–ื” ื›ืš - ืงื•ื“ื ื›ืœ ื ืขืชื™ืง ืืช ื”ืชืžื•ื ื” ืœ-QSPI, ื•ืื– ื ื˜ืขื ื™ื ืื•ืชื” ืœ-SDRAM ื•ื ื‘ืฆืข ืžืฉื. ืž-SDRAM ื–ื” ื ื”ื™ื” ืงืฆืช ื™ื•ืชืจ ืžื”ื™ืจ, ืื‘ืœ ืขื“ื™ื™ืŸ ืจื—ื•ืง ืž-QEMU.

ื”ืขื‘ืจืช Qt ืœ-STM32

ืœืื—ืจ ืžื›ืŸ, ื”ื™ื” ืจืขื™ื•ืŸ ืœื›ืœื•ืœ ื ืงื•ื“ื” ืฆืคื” - ืื—ืจื™ ื”ื›ืœ, Qt ืขื•ืฉื” ื›ืžื” ื—ื™ืฉื•ื‘ื™ื ืฉืœ ื”ืงื•ืื•ืจื“ื™ื ื˜ื•ืช ืฉืœ ืจื™ื‘ื•ืขื™ื ื‘ืื ื™ืžืฆื™ื”. ื ื™ืกื™ื ื•, ืื‘ืœ ื›ืืŸ ืœื ืงื™ื‘ืœื ื• ืฉื•ื ืชืื•ืฆื” ื ืจืื™ืช ืœืขื™ืŸ, ืื ื›ื™ ืคื ื™ืžื” ัั‚ะฐั‚ัŒะต ืžืคืชื—ื™ Qt ื˜ืขื ื• ื›ื™ FPU ื ื•ืชืŸ ืขืœื™ื™ื” ืžืฉืžืขื•ืชื™ืช ื‘ืžื”ื™ืจื•ืช ืขื‘ื•ืจ "ื’ืจื™ืจืช ืื ื™ืžืฆื™ื”" ืขืœ ืžืกืš ืžื’ืข. ื™ื™ืชื›ืŸ ืฉื™ืฉ ืคื—ื•ืช ื—ื™ืฉื•ื‘ื™ ื ืงื•ื“ื” ืฆืคื” ื‘-moveblocks ื‘ืื•ืคืŸ ืžืฉืžืขื•ืชื™, ื•ื–ื” ืชืœื•ื™ ื‘ื“ื•ื’ืžื” ื”ืกืคืฆื™ืคื™ืช.

ื”ืจืขื™ื•ืŸ ื”ื™ืขื™ืœ ื‘ื™ื•ืชืจ ื”ื™ื” ืœื”ืขื‘ื™ืจ ืืช ื”-framebuffer ืž-SDRAM ืœื–ื™ื›ืจื•ืŸ ืคื ื™ืžื™. ืœืฉื ื›ืš, ืขืฉื™ื ื• ืืช ืžื™ื“ื•ืช ื”ืžืกืš ืœื 480x272, ืืœื 272x272. ื”ื•ืจื“ื ื• ื’ื ืืช ืขื•ืžืง ื”ืฆื‘ืข ืž-A8R8G8B8 ืœ-R5G6B5, ื•ื‘ื›ืš ื”ืงื˜ื™ื ื• ืืช ื’ื•ื“ืœื• ืฉืœ ืคื™ืงืกืœ ืื—ื“ ืž-4 ืœ-2 ื‘ืชื™ื. ื’ื•ื“ืœ ื”-framebuffer ื”ืžืชืงื‘ืœ ื”ื•ื 272*272*2 = 147968 ื‘ืชื™ื. ื–ื” ื ืชืŸ ื”ืืฆื” ืžืฉืžืขื•ืชื™ืช, ืื•ืœื™ ื”ื›ื™ ื‘ื•ืœื˜ืช, ื”ืื ื™ืžืฆื™ื” ื”ืคื›ื” ื›ืžืขื˜ ื—ืœืงื”.

ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื”ืื—ืจื•ื ื” ื”ื™ื™ืชื” ืœื”ืคืขื™ืœ ืืช ืงื•ื“ ื”-Embox ืž-RAM ื•ืงื•ื“ Qt ืž-SDRAM. ืœืฉื ื›ืš, ืื ื• ืงื•ื“ื, ื›ืจื’ื™ืœ, ืžืงืฉืจื™ื ืืช 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))

ืขืœ ื™ื“ื™ ื”ืคืขืœืช ืงื•ื“ ื”-Embox ืž-ROM, ืงื™ื‘ืœื ื• ื’ื ื”ืืฆื” ื ื™ื›ืจืช. ื›ืชื•ืฆืื” ืžื›ืš, ื”ืื ื™ืžืฆื™ื” ื™ืฆืื” ื—ืœืงื” ืœืžื“ื™:


ืžืžืฉ ื‘ืกื•ืฃ, ืชื•ืš ื›ื“ื™ ื”ื›ื ืช ื”ื›ืชื‘ื” ื•ื ื™ืกื™ื•ืŸ ืชืฆื•ืจื•ืช ืฉื•ื ื•ืช ืฉืœ Embox, ื”ืชื‘ืจืจ ืฉ-Qt moveblocks ืขื•ื‘ื“ ืžืฆื•ื™ืŸ ืž-QSPI ืขื framebuffer ื‘-SDRAM, ื•ืฆื•ื•ืืจ ื”ื‘ืงื‘ื•ืง ื”ื™ื” ื‘ื“ื™ื•ืง ื‘ื’ื•ื“ืœ ืฉืœ ื”-framebuffer! ื›ื›ืœ ื”ื ืจืื”, ื›ื“ื™ ืœื”ืชื’ื‘ืจ ืขืœ "ืžืฆื’ืช ื”ืฉืงื•ืคื™ื•ืช" ื”ืจืืฉื•ื ื™ืช, ื”ืกืคื™ืงื” ืชืื•ืฆื” ืคื™ 2 ืขืงื‘ ื”ืงื˜ื ื” ื‘ื ืืœื™ืช ื‘ื’ื•ื“ืœ ื”-framebuffer. ืื‘ืœ ืœื ื ื™ืชืŸ ื”ื™ื” ืœื”ื’ื™ืข ืœืชื•ืฆืื” ื›ื–ื• ืขืœ ื™ื“ื™ ื”ืขื‘ืจืช ืงื•ื“ ื”-Embox ื‘ืœื‘ื“ ืœื–ื›ืจื•ื ื•ืช ืžื”ื™ืจื™ื ืฉื•ื ื™ื (ื”ื”ืืฆื” ืœื ื”ื™ื™ืชื” ืคื™ 2, ืืœื ื‘ืขืจืš ืคื™ 1.5).

ืื™ืš ืœื ืกื•ืช ืืช ื–ื” ื‘ืขืฆืžืš

ืื ื™ืฉ ืœืš STM32F7-Discovery, ืืชื” ื™ื›ื•ืœ ืœื”ืจื™ืฅ Qt ืชื—ืช Embox ื‘ืขืฆืžืš. ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ืื™ืš ื–ื” ื ืขืฉื” ืืฆืœื ื• ื•ื™ืงื™.

ืžืกืงื ื”

ื›ืชื•ืฆืื” ืžื›ืš, ื”ืฆืœื—ื ื• ืœื”ืฉื™ืง ืืช Qt! ืžื•ืจื›ื‘ื•ืช ื”ืžืฉื™ืžื”, ืœื“ืขืชื ื•, ืžื•ื’ื–ืžืช ื‘ืžืงืฆืช. ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ืืชื” ืฆืจื™ืš ืœืงื—ืช ื‘ื—ืฉื‘ื•ืŸ ืืช ื”ืคืจื˜ื™ื ื”ืกืคืฆื™ืคื™ื™ื ืฉืœ ืžื™ืงืจื•-ื‘ืงืจื™ื ื•ื‘ืื•ืคืŸ ื›ืœืœื™ ืœื”ื‘ื™ืŸ ืืช ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉืœ ืžืขืจื›ื•ืช ืžื—ืฉื‘. ืชื•ืฆืื•ืช ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืžืฆื‘ื™ืขื•ืช ืขืœ ื”ืขื•ื‘ื“ื” ื”ื™ื“ื•ืขื” ืฉืฆื•ื•ืืจ ื”ื‘ืงื‘ื•ืง ื‘ืžืขืจื›ืช ืžื—ืฉื•ื‘ ืื™ื ื• ื”ืžืขื‘ื“, ืืœื ื”ื–ื™ื›ืจื•ืŸ.

ื”ืฉื ื” ื ืฉืชืชืฃ ื‘ืคืกื˜ื™ื‘ืœ TechTrain. ืฉื ื ืกืคืจ ืœื›ื ื‘ื™ืชืจ ืคื™ืจื•ื˜ ื•ื ืจืื” ืืช Qt, OpenCV ืขืœ ืžื™ืงืจื•-ื‘ืงืจื™ื ื•ืฉืืจ ื”ื”ื™ืฉื’ื™ื ืฉืœื ื•.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”