Qt portimine STM32-le

Qt portimine STM32-leTere pÀevast! Meie projektis Embox kÀivitasime Qt STM32F7-Discovery'l ja tahaksime sellest rÀÀkida. Varasemalt oleme juba rÀÀkinud, kuidas me suutsime kÀivitada OpenCV.

Qt on platvormidevaheline raamistik, mis sisaldab mitte ainult graafilisi komponente, vaid ka selliseid asju nagu QtNetwork, klassikomplekt andmebaasidega töötamiseks, Qt for Automation (sealhulgas IoT rakendamiseks) ja palju muud. Qt-arendajad on eelnevalt arvestanud Qt kasutamist sisseehitatud sĂŒsteemides, seetĂ”ttu on raamatukogud ĂŒsna hĂ€sti konfigureeritavad. Kuid seni on vĂ€he inimesi mĂ”elnud Qt portimisele mikrokontrolleritele, tĂ”enĂ€oliselt seetĂ”ttu, et see ĂŒlesanne tundub keeruline — Qt on suur, MCU-d on vĂ€ikesed.

Teiselt poolt, praeguseks on olemas mikrokontrollerid, mis on mĂ”eldud multimeedia töötlemiseks ja ĂŒletavad esimesi Pentiume. Umbes aasta tagasi ilmus Qt blogisse postitus. Arendajad tegid Qt porti RTEMS operatsioonisĂŒsteemile ja kĂ€ivitasid nĂ€idendid widget’idega mitmel STM32F7 alusel. See on meid huvitanud. Oli mĂ€rgatav, ja ka arendajad ise kirjutavad sellest, et Qt aeglustub STM32F7-Discovery'l. Huvitav oli, kas suudame Qt kĂ€ivitada Embox'is, mitte lihtsalt widget'it joonistada, vaid ka animatsiooni kĂ€ivitada.

Embox'is on juba ammu portitud Qt 4.8, seega otsustasime seda proovida. Valisime rakenduse moveblocks — nĂ€ide vedrust animatsioonist.

Qt moveblocks QEMU-lQt portimine STM32-le

Esialgu konfigureerime Qt vĂ”imalikult vĂ€hese komponentide kogumiga, mis on vajalik animatsiooni toetamiseks. Selleks on olemas valik “-qconfig minimal,small,medium 
”. See ĂŒhendab konfiguratsioonifaili Qt hulgast paljude makrodega — mida sisse lĂŒlitada / mida vĂ€lja lĂŒlitada. PĂ€rast seda valikut lisame konfiguratsiooni muid lippe, kui soovime veel midagi lisaks vĂ€ljalĂŒlitada. Siin on nĂ€ide meie konfiguratsioonist.

Et Qt töötaks, on vaja lisada OS-i ĂŒhilduvuskihte. Üks viis on rakendada QPA (Qt Platform Abstraction). VĂ”tsime aluseks juba valmis plugina fb_base, millel pĂ”hineb QPA Linuxile. Tulemuseks sai vĂ€ike plugin emboxfb, mis annab Qt-le Embox'i raamifaili, ja edasi joonistab see juba ilma lisatoetuse vajaduseta.

Nii nÀeb vÀlja plugina loomine

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();
}

Nii siis nÀeb vÀlja uuendamine

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;
}

KokkuvÔttes, kui kompilatsiooni optimeerimise vÔimaluse kasutamine on mÀlu suuruse jaoks -Os, sai raamatukogu pilt suuruseks 3.5 MB, mis ei mahtunud STM32F746 pÔhimuutujasse. Kuidas me juba mainisime meie teises artiklis OpenCV kohta, on selles plaadis olemas:

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

Kuna OpenCV jaoks oli juba lisatud tugi QSPI's koodi tÀitmiseks, otsustasime alustada sellest, et laadisime Emboxi pildi koos Qt-ga tÀielikult QSPI'sse. Ja hoor, kÔik peaaegu kohe kÀivitati QSPI's! Kuid nagu OpenCV puhul, selgus, et see töötas liiga aeglaselt.

Qt portimine STM32-le

SeetÔttu otsustasime teha nii - kÔigepealt kopeerime pildi QSPI-sse, siis laadime selle SDRAM-i ja töötame sealt. SDRAM-is on veidi kiiremini, kuid see on endiselt kaugel QEMU-st.

Qt portimine STM32-le

Edasi oli idee lisada ujuvpunkt - kuna Qt teeb mĂ”ningaid arvutusi ruutude koordinaatide osas animatsioonis. Proovisime, kuid siin ei saanud me nĂ€htavat kiirendust, kuigi Qt arendajad vĂ€itsid, et FPU toob „liigutamise animatsioonis” puutetundlikul ekraanil mĂ€rkimisvÀÀrse kiirusetĂ”usu. VĂ”imalik, et liikuvates plokkides on ujuva punktiga arvutusi oluliselt vĂ€hem ja see sĂ”ltub konkreetsest nĂ€itest. artiklis Nii et mingil mÀÀral oli saavutamisel nurgakiviks. Kaks inimest ĂŒritas vĂ€lja selgitada, kus meie hoone nĂ€eb vĂ€lja, kuid me ei jĂ”udnud lepinguni samal ajal.

KĂ”ige tĂ”husam idee osutus olema raamifaili liigutamine SDRAM-ist sisemĂ€lu. Selleks muutsime ekraani mÔÔdud 480×272-lt 272×272-le. Veel vĂ€hendasime vĂ€rvide sĂŒgavust A8R8G8B8-lt R5G6B5-le, vĂ€hendades seega ĂŒhe pikseli suurust 4-lt 2 baidini. Saime raamifaili suuruse 272 * 272 * 2 = 147968 baidi. See andis mĂ€rgatava kiirusel tĂŒĂŒbi, tĂ”enĂ€oliselt kĂ”ige mĂ€rgatavama, animatsioon muutus peaaegu sujuvaks.

Viimane optimeerimine oli Emboxi koodi tÀitmine RAM-ist ja Qt SDRAM-ist. Selleks sidusime esmalt nagu tavaliselt Emboxi koos Qt-iga staatiliselt, kuid paigutasime jÀlgimis-, rodata-, data- ja bss-segmendid QSPI-sse, et hiljem kopeerida need SDRAM-i.

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

Emboxi koodi tĂ€itmine ROM-ist andis samuti mĂ€rgatava kiirusel tĂŒĂŒbi. LĂ”puks jĂ€i animatsioon piisavalt sujuv:

MĂ€ngi videot

Juba lĂ”pupoole, artiklit ette valmistades ja erinevaid Embox’i konfiguratsioone proovides, selgus, et Qt moveblocks töötab suurepĂ€raselt ka QSPI-st raamifailiga SDRAM-is, ja kitsaskohaks oli just raamifaili suurus! Tundub, et algse 'slaidshow' ĂŒletamiseks piisab kahekorra kiirusest tavalise raamifaili suuruse vĂ€hendamise kaudu. Ainult Emboxi koodi liigutamine erinevatesse kiiretesse mĂ€ludesse ei andnud sellist tulemust (kiirus tĂ”usis mitte 2, vaid umbes 1.5 korda).

Kuidas ise proovida

Kui Teil on STM32F7-Discovery, saate ise Qt-d Emboxi all kÀivitada. Kuidas see toimub, saate lugeda meie wiki.

KokkuvÔte

LĂ”puks Ă”nnestus meil Qt kĂ€ivitada! Probleemi keerukus on meie arvates veidi liialdatud. Loomulikult tuleb arvesse vĂ”tta mikrokontrollerite eripĂ€ra ja ĂŒleĂŒldiselt mĂ”ista arvutisĂŒsteemide arhitektuuri. Optimeerimise tulemused tĂ”estavad tuntud fakti, et arvutisĂŒsteemi kĂ”ige kitsam koht pole mitte protsessor, vaid mĂ€lu.

Sel aastal osaleme festivalil TechTrain. Seal rÀÀgime ja nÀitame podroobneje Qt-t, OpenCV-d mikrokontrollerites ja muid meie saavutusi.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster