ΠŸΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Qt Π½Π° STM32

ΠŸΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Qt Π½Π° STM32Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь! ΠœΡ‹ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Embox запустили Qt Π½Π° STM32F7-Discovery ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΎΠ± этом Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ. Π Π°Π½Π΅Π΅, ΠΌΡ‹ ΡƒΠΆΠ΅ рассказывали ΠΊΠ°ΠΊ Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ OpenCV.

Qt β€” это кроссплатформСнный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ графичСскиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π½ΠΎ ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ ΠΊΠ°ΠΊ QtNetwork, Π½Π°Π±ΠΎΡ€ классов для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Qt for Automation (Π² Ρ‚ΠΎΠΌ числС, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ IoT) ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Qt Π·Π°Ρ€Π°Π½Π΅Π΅ прСдусмотрСли использованиС Qt Π²ΠΎ встроСнных систСмах, поэтому Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ довольно Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Однако Π΄ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΈΡ… ΠΏΠΎΡ€, ΠΌΠ°Π»ΠΎ ΠΊΡ‚ΠΎ задумывался ΠΎ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Qt Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹, вСроятно ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ такая Π·Π°Π΄Π°Ρ‡Π° выглядит слоТной β€” Qt большоС, MCU малСнькиС.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ° ΠΈ прСвосходящиС ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Pentium-Ρ‹. Около Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄ Π² Π±Π»ΠΎΠ³Π΅ Qt появился пост. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сдСлали ΠΏΠΎΡ€Ρ‚ Qt ΠΏΠΎΠ΄ ОБ RTEMS, ΠΈ запустили ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ»Π°Ρ‚Π°Ρ… ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ stm32f7. Нас это заинтСрСсовало. Π‘Ρ‹Π»ΠΎ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, ΠΈ сами Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΠ± этом ΠΏΠΈΡˆΡƒΡ‚, Ρ‡Ρ‚ΠΎ Qt Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ Π½Π° STM32F7-Discovery. Нам стало интСрСсно, смоТСм Π»ΠΈ ΠΌΡ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Qt ΠΏΠΎΠ΄ Embox, ΠΏΡ€ΠΈ этом Π½Π΅ просто Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, Π° Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ.

Π’ Embox ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Qt 4.8, поэтому Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½Π΅ΠΌ. Π’Ρ‹Π±Ρ€Π°Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ moveblocks β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€ пруТинистой Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

Qt moveblocks Π½Π° QEMUΠŸΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Qt Π½Π° STM32

Для Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Qt ΠΏΠΎ возмоТности с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Для этого сущСствуСт опция β€œ-qconfig minimal,small,medium …”. Она ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ· состава Qt c мноТСством макросов β€” Ρ‡Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ / Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ. ПослС этой ΠΎΠΏΡ†ΠΈΠΈ добавляСм Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ, Ссли Ρ…ΠΎΡ‚ΠΈΠΌ Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ нашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Qt Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ слой совмСстимости с ОБ. Один ΠΈΠ· способов β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ QPA (Qt Platform Abstraction). Π—Π° основу взяли ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ fb_base Π² составС Qt, Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ QPA для Линукс. Π’ ΠΈΡ‚ΠΎΠ³Π΅ получился нСбольшой ΠΏΠ»Π°Π³ΠΈΠ½ emboxfb, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Qt Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€ Embox’a, Π° дальшС ΠΎΠ½ΠΎ рисуСт Ρ‚ΡƒΠ΄Π° ΡƒΠΆΠ΅ Π±Π΅Π· постороннСй ΠΏΠΎΠΌΠΎΡ‰ΠΈ.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит созданиС ΠΏΠ»Π°Π³ΠΈΠ½Π°

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 Мб ROM
  • 320 Кб RAM
  • 8 Мб SDRAM
  • 16 Мб QSPI

Π’Π°ΠΊ ΠΊΠ°ΠΊ для OpenCV ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° исполнСния ΠΊΠΎΠ΄Π° ΠΈΠ· QSPI, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π· Embox c Qt Π² QSPI Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. И ΡƒΡ€Π°, всС ΠΏΠΎΡ‡Ρ‚ΠΈ сразу ΠΆΠ΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»ΠΎΡΡŒ ΠΈΠ· QSPI! Но ΠΊΠ°ΠΊ ΠΈ Π² случаС с OpenCV оказалось, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ слишком ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

ΠŸΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Qt Π½Π° STM32

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ β€” сначала ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π· Π² QSPI, Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π² SDRAM ΠΈ выполняСмся ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Из SDRAM стало Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ быстрСй, Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ QEMU.

ΠŸΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Qt Π½Π° STM32

Π”Π°Π»Π΅Π΅ Π±Ρ‹Π»Π° идСя Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ β€” вСдь Qt Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вычислСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² Π² Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ, Π½ΠΎ здСсь Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΠ³ΠΎ ускорСния, хотя Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Qt ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ FPU Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ прирост Π² скорости для β€œdragging animation” Π½Π° touchscreen’e. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² moveblocks сущСствСнно мСньшС вычислСний с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈ это зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Π‘Π°ΠΌΡ‹ΠΌ ΠΆΠ΅ эффСктивным оказалась идСя пСрСнСсти Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€ ΠΈΠ· SDRAM Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Для этого ΠΌΡ‹ сдСлали Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ экрана Π½Π΅ 480×272, Π° 272×272. Π•Ρ‰Π΅ ΠΏΠΎΠ½ΠΈΠ·ΠΈΠ»ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ Ρ†Π²Π΅Ρ‚Π° с A8R8G8B8 Π΄ΠΎ R5G6B5, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сократив Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ пиксСля с 4 Π΄ΠΎ 2 Π±Π°ΠΉΡ‚. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€Π° 272 * 272 * 2 = 147968 Π±Π°ΠΉΡ‚. Π­Ρ‚ΠΎ Π΄Π°Π»ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ускорСниС, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самоС Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ΅, анимация стала ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΠ»Π°Π²Π½ΠΎΠΉ.

ПослСднСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ стало Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Embox ΠΈΠ· RAM, Π° Qt ΠΈΠ· SDRAM. Для этого ΠΌΡ‹ сначала ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π»ΠΈΠ½ΠΊΡƒΠ΅ΠΌ статичСски Embox вмСстС с Qt, Π½ΠΎ сСгмСнты text, rodata, data ΠΈ 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’a, Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Qt moveblocks Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΈΠ· QSPI с Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€ΠΎΠΌ Π² SDRAM, Π° ΡƒΠ·ΠΊΠΈΠΌ мСстом Π±Ρ‹Π» ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€Π°! По-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ β€œΡΠ»Π°ΠΉΠ΄ΡˆΠΎΡƒβ€ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ ускорСния Π² 2 Ρ€Π°Π·Π° Π·Π° счСт банального ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€Π°. А Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° пСрСносом Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь ΠΊΠΎΠ΄Π° Embox Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ быстрыС памяти Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ (ускорСниС ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΎΡΡŒ Π½Π΅ Π² 2, Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 1.5 Ρ€Π°Π·Π°).

Как ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ самому

Если Ρƒ Вас имССтся STM32F7-Discovery, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Qt ΠΏΠΎΠ΄ Embox сами. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ это дСлаСтся ΠΌΠΎΠΆΠ½ΠΎ Π½Π° нашСм Π²ΠΈΠΊΠΈ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Qt! Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ, Π½Π° наш взгляд, нСсколько ΠΏΡ€Π΅ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π°. ЕстСствСнно Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ спСцифику ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° извСстный Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ самоС ΡƒΠ·ΠΊΠΎΠ΅ мСсто Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмС, это Π½Π΅ процСссор, Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π’ этом Π³ΠΎΠ΄Ρƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° фСстивалС TechTrain. Π’Π°ΠΌ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ расскаТСм ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Qt, OpenCV Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ наши достиТСния.

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