Qt portálása STM32-re.

Qt portálása STM32-re.Jó napot! Mi a projektben Embox elindítottuk a Qt-t az STM32F7-Discovery-n, és szeretnénk beszélni róla. Korábban már írtunk arról, hogyan sikerült elindítani az OpenCV.

A Qt egy keresztplatformos keretrendszer, amely nemcsak grafikus komponenseket tartalmaz, hanem olyan dolgokat is, mint a QtNetwork, adatbázis-kezelő osztályok, a Qt for Automation (beleértve az IoT megvalósítást) és sok más egyéb. A Qt csapat fejlesztői előre látták a Qt használatát beágyazott rendszerekben, így a könyvtárak jól konfigurálhatóak. Azonban egészen nemrégig kevesen gondoltak a Qt mikrokontrollerre történő portolására, valószínűleg azért, mert ez a feladat bonyolultnak tűnik — a Qt nagy, a MCU pedig kicsi.

Másrészről, jelenleg léteznek multimédia-megvalósításra tervezett mikrokontrollerek, amelyek felülmúlják az első Pentiumokat. Körülbelül egy évvel ezelőtt a Qt blogján megjelent egy bejegyzés. A fejlesztők létrehozták a Qt portját az RTEMS operációs rendszerhez, és példákat futtattak widgetekkel több STM32F7-alapú deszkán. Ez felkeltette az érdeklődésünket. Észrevettük, és a fejlesztők is említik, hogy a Qt lassan működik az STM32F7-Discovery-n. Kíváncsiak voltunk, hogy sikerül-e elindítani a Qt-t az Embox alatt, nemcsak egy widgetet rajzolni, hanem animációt is futtatni.

Az Embox-ban már régen portolták a Qt 4.8-at, ezért úgy döntöttünk, hogy megpróbáljuk. Az alkalmazás a moveblocks példáját választottuk — rugós animáció példája.

Qt moveblocks a QEMU-nQt portálása STM32-re.

Először a Qt-t a lehető legkisebb szükséges komponenskészlettel konfiguráljuk az animáció támogatásához. Ehhez van egy opció, a “-qconfig minimal,small,medium …”. Ez csatlakoztat egy konfigurációs fájlt a Qt-ból, amely számos makrót tartalmaz — mit kapcsoljunk be / mit kapcsoljunk ki. Ezen opció után hozzáadunk további zászlókat a konfigurációhoz, ha további dolgokat szeretnénk kikapcsolni. Íme, egy példa a mi konfigurációnkra.

A Qt működéséhez szükséges egy operációs rendszerrel való kompatibilitási réteg hozzáadása. Az egyik megoldás a QPA (Qt Platform Abstraction) megvalósítása. Alapként a Qt-ban található fb_base plugint használtuk, amelyre a QPA Linux alatt épül. Ennek eredményeként egy kis emboxfb plugint hoztunk létre, amely a Qt számára az Embox framebufferét biztosítja, majd azon már külső segítség nélkül rajzol.

Így néz ki a plugin készítése

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 (fbFd setPhysicalSize(QSize(fbWidth, fbHeight));
    mScreens.append(mPrimaryScreen);

    this->printFbInfo();
}

Ez így fog kinézni a rajzolás újrarajzolása

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

    DPRINTF("QEmboxFbScreen::doRedrawn");

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

    rects = touched.rects();
    for (int i = 0; i drawImage(rects[i], *mScreenImage, rects[i]);
    }
    return touched;
}

A memória méret-optimalizáló fordító bekapcsolásával -Os a könyvtár képe 3,5 MB lett, ami természetesen nem fér bele az STM32F746 főmemóriájába. Ahogy már említettük egy másik cikkünkben az OpenCV-vel kapcsolatosan, ezen az áramkörön található:

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

Mivel az OpenCV már támogatja a kód végrehajtását a QSPI-ből, úgy döntöttünk, hogy először teljes mértékben betöltjük az Embox képet Qt-val a QSPI-be. És örömünkre, szinte azonnal elindult a QSPI-ből! De ahogy az OpenCV esetében is kiderült, túl lassan működött.

Qt portálása STM32-re.

Ezért úgy döntöttünk, hogy először a képet a QSPI-be másoljuk, majd betöltjük az SDRAM-ba, és onnan hajtjuk végre. Az SDRAM-ból kicsit gyorsabb lett, de még mindig messze volt a QEMU-tól.

Qt portálása STM32-re.

Később az volt az ötlet, hogy engedjük meg a lebegőpontos számítást - hiszen a Qt néhány téglalap koordinátáját számolja az animációban. Kipróbáltuk, de itt nem észleltünk látható gyorsulást, bár a a Spotify döntéshozatali módszertanáról. Egyre több felhasználó preferálja a zenehallgatást mobilon a streaming szolgáltatásban, de a cégnél túlnyomórészt webprogramozók dolgoznak. A Spotify elemezte ezt a helyzetet, és úgy döntött, hogy több mobilfejlesztőt vesz fel, valamint átnevezi a webes szakembereket új irányba: Qt fejlesztői állították, hogy az FPU jelentős sebességnövekedést nyújt a "húzós animációk" során érintőképernyőn. Lehetséges, hogy a moveblocks esetében lényegesen kevesebb lebegőpontos számítást végeznek, és ez a konkrét példától függ.

A legjobbnak a framebuffer SDRAM-ból a belső memóriába történő átköltöztetése bizonyult. Ehhez a képernyő méretét 480×272 helyett 272×272-esre állítottuk. Ezen kívül a színmélységet is csökkentettük A8R8G8B8-ról R5G6B5-re, így a pixel mérete 4 bájról 2 bájra csökkent. A framebuffer mérete 272 * 272 * 2 = 147968 byte lett. Ez jelentős gyorsulást eredményezett, talán a legszembetűnőbbet, a animáció szinte simává vált.

Az utolsó optimalizálás az Embox kódjának RAM-ból, a Qt-nak pedig SDRAM-ból való végrehajtása volt. Ehhez először, mint általában, statikusan linkeltük az Emboxot a Qt-val, de a text, rodata, data és bss szegmenseket a QSPI-be helyeztük, hogy később átkonvertálhassuk SDRAM-ba.

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))

Az Embox ROM-ból való végrehajtásával szintén észlelhető gyorsulást értünk el. Végül az animáció eléggé sima lett:

Videó lejátszása

A cikk előkészítésekor és különböző Embox konfigurációk kipróbálásakor kiderült, hogy a Qt moveblocks remekül működik QSPI-ből az SDRAM framebufferrel, és a szűk keresztmetszet éppen a framebuffer mérete volt! Úgy tűnik, hogy a kezdeti "diavetítés" leküzdéséhez elegendő volt a framebuffer méretének banális csökkentése által elért 2-szeres gyorsulás. Ezt azonban a kód Embox különböző gyors memóriákba való áthelyezésével nem sikerült elérni (a gyorsulás nem 2, hanem körülbelül 1,5-szörös volt).

Hogyan próbálhatod ki magad

Ha rendelkezel STM32F7-Discovery-val, saját magad is elindíthatod a Qt-t az Embox alatt. Hogy ez hogyan lehetséges, azt a wiki.

Zárás

Végül sikerült elindítanunk a Qt-t! Úgy véljük, hogy a feladat nehézsége kissé túl van értékelve. Természetesen figyelembe kell venni a mikrokontrollerek sajátosságait és általában megérteni a számítástechnikai rendszerek architektúráját. Az optimalizációs eredmények arra utalnak, hogy a számítástechnikai rendszerek legszűkebb helye nem a processzor, hanem a memória.

Idén részt veszünk a fesztiválon TechTrain. Ott részletesebben bemutatjuk a Qt-t, az OpenCV-t mikrokontrollereken, és egyéb eredményeinket.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster