ΠŸΡ€Π΅Π½Π°ΡΡΠ½Π΅ Π½Π° Qt към STM32

ΠŸΡ€Π΅Π½Π°ΡΡΠ½Π΅ Π½Π° Qt към STM32Π”ΠΎΠ±ΡŠΡ€ Π΄Π΅Π½ НиС смС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Embox стартира Qt Π½Π° STM32F7-Discovery ΠΈ Π±ΠΈ искал Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈ Π·Π° Ρ‚ΠΎΠ²Π°. По-Ρ€Π°Π½ΠΎ Π²Π΅Ρ‡Π΅ ΠΊΠ°Π·Π°Ρ…ΠΌΠ΅ ΠΊΠ°ΠΊ успяхмС Π΄Π° стартирамС OpenCV.

Qt Π΅ ΠΌΠ΅ΠΆΠ΄ΡƒΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π° Ρ€Π°ΠΌΠΊΠ°, която Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π½Π΅ само Π³Ρ€Π°Ρ„ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, Π½ΠΎ ΠΈ Π½Π΅Ρ‰Π° ΠΊΠ°Ρ‚ΠΎ QtNetwork, Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ класовС Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, Qt Π·Π° автоматизация (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ рСализация Π½Π° IoT) ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π΅ΠΊΠΈΠΏΠ° Π½Π° Qt са ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Qt във Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ систСми, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ са доста Π΄ΠΎΠ±Ρ€Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅ΠΌΠΈ. Доскоро ΠΎΠ±Π°Ρ‡Π΅ ΠΌΠ°Π»ΠΊΠΎ Ρ…ΠΎΡ€Π° мислСха Π·Π° прСнасянС Π½Π° Qt към ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈ, вСроятно Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π·Π°Π΄Π°Ρ‡Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Ρ€ΡƒΠ΄Π½Π° - Qt Π΅ голям, MCU са ΠΌΠ°Π»ΠΊΠΈ.

ΠžΡ‚ Π΄Ρ€ΡƒΠ³Π° страна, Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈ Π΄Π° работят с мултимСдия ΠΈ Π΄Π° Π½Π°Π΄ΠΌΠΈΠ½Π°Π²Π°Ρ‚ ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ Pentium. Появи сС Π² Π±Π»ΠΎΠ³Π° Π½Π° Qt ΠΏΡ€Π΅Π΄ΠΈ ΠΎΠΊΠΎΠ»ΠΎ Π³ΠΎΠ΄ΠΈΠ½Π° пост. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…Π° ΠΏΠΎΡ€Ρ‚ Π½Π° Qt ΠΏΠΎΠ΄ RTEMS OS ΠΈ пуснаха ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ с ΡƒΠΈΠ΄ΠΆΠ΅Ρ‚ΠΈ Π½Π° няколко ΠΏΠ»Π°Ρ‚ΠΊΠΈ, ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‰ΠΈ 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 Π·Π° Linux. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ малък плъгин emboxfb, ΠΊΠΎΠΉΡ‚ΠΎ прСдоставя Π½Π° Qt Ρ„Ρ€Π΅ΠΉΠΌΠ±ΡƒΡ„Π΅Ρ€Π° Π½Π° 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 MB, ΠΊΠΎΠ΅Ρ‚ΠΎ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π½Π΅ сС вписва Π² основната ΠΏΠ°ΠΌΠ΅Ρ‚ Π½Π° STM32F746. ΠšΠ°ΠΊΡ‚ΠΎ писахмС Π² Π½Π°ΡˆΠ°Ρ‚Π° Π΄Ρ€ΡƒΠ³Π° статия Π·Π° OpenCV, Ρ‚Π°Π·ΠΈ дъска ΠΈΠΌΠ°:

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

Въй ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π·Π° изпълнСниС Π½Π° ΠΊΠΎΠ΄ ΠΎΡ‚ QSPI Π²Π΅Ρ‡Π΅ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π·Π° OpenCV, Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ със Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° цялото ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Embox с 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 Π±Π°ΠΉΡ‚Π°. Π’ΠΎΠ²Π° Π΄Π°Π΄Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ускорСниС, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π°ΠΉ-Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌΠΎ, анимацията стана ΠΏΠΎΡ‡Ρ‚ΠΈ Π³Π»Π°Π΄ΠΊΠ°.

ΠŸΠΎΡΠ»Π΅Π΄Π½Π°Ρ‚Π° оптимизация бСшС ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° 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-ΠΊΡ€Π°Ρ‚Π½ΠΎ ускорСниС ΠΏΠΎΡ€Π°Π΄ΠΈ Π±Π°Π½Π°Π»Π½ΠΎΡ‚ΠΎ намаляванС Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° кадровия Π±ΡƒΡ„Π΅Ρ€. Но Π½Π΅ бСшС възмоТно Π΄Π° сС постигнС Ρ‚Π°ΠΊΡŠΠ² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‡Ρ€Π΅Π· ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ само Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Embox към Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π±ΡŠΡ€Π·ΠΈ ΠΏΠ°ΠΌΠ΅Ρ‚ΠΈ (ускорСниСто Π½Π΅ бСшС 2, Π° ΠΎΠΊΠΎΠ»ΠΎ 1.5 ΠΏΡŠΡ‚ΠΈ).

Как Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ сами

Ако ΠΈΠΌΠ°Ρ‚Π΅ STM32F7-Discovery, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ сами Π΄Π° стартиратС Qt ΠΏΠΎΠ΄ Embox. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ сС ΠΏΡ€Π°Π²ΠΈ Π½Π° нашия ΡƒΠΈΠΊΠΈ.

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

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° успяхмС Π΄Π° стартирамС Qt! БлоТността Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° спорСд нас Π΅ донякъдС ΠΏΡ€Π΅ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π°. ЕстСствСно, трябва Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ спСцификата Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°Ρ‚ΠΎ цяло Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° изчислитСлнитС систСми. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ оптимизацията сочат Π΄ΠΎΠ±Ρ€Π΅ извСстния Ρ„Π°ΠΊΡ‚, Ρ‡Π΅ тясното място Π² Π΅Π΄Π½Π° изчислитСлна систСма Π½Π΅ Π΅ ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚, Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°.

Π’Π°Π·ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π° Ρ‰Π΅ участвамС във фСстивала ВСхничСски Π²Π»Π°ΠΊ. Π’Π°ΠΌ Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Qt, OpenCV Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ наши постиТСния.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€