Qt portimine STM32-le

Qt portimine STM32-leTere! Meie projektis Embox oleme kÀivitanud Qt STM32F7-Discovery'l ja soovime sellest rÀÀkida. Varem oleme juba jaganud, kuidas meil Ônnestus OpenCV.

Qt on platvormidevaheline raamistik, mis hĂ”lmab mitte ainult graafilisi komponente, vaid ka selliseid asju nagu QtNetwork, andmebaasidega töötamise klasside kogum, Qt for Automation (sealhulgas IoT rakendamiseks) ja palju muud. Qt meeskonna arendajad on ette nĂ€inud Qt kasutamise sisseehitatud sĂŒsteemides, seega on raamatukogud ĂŒsna hĂ€sti konfigureeritavad. Siiski on kuni viimase ajani vĂ€he inimesi mĂ”elnud Qt portimisele mikrokontrolleritele, ilmselt seetĂ”ttu, et selline ĂŒlesanne tundub keeruline — Qt on suur, MCU-id on vĂ€ikesed.

Teiselt poolt, hetkel on olemas mikrokontrollerid, mis on mĂ”eldud multimeedia töötlemiseks ja ĂŒletavad esimesi Pentiume. Umbes aasta tagasi ilmus Qt blogisse post. Arendajad lĂ”id Qt sadama RTEMS jaoks ja kĂ€ivitasid vidinatega nĂ€idendeid mitmetel STM32F7 platvormidel. See tĂ”mbas meie tĂ€helepanu. Oli mĂ€rgatav, ja ka arendajad ise kirjutavad sellest, et Qt jÀÀb STM32F7-Discovery puhul aeglaseks. Meie said huvitavaks, kas suudame Qt-d Emboxis kĂ€ivitada, mitte lihtsalt vidinat joonistada, vaid ka animatsiooni alustamiseks.

Emboxis on pikka aega olnud portitud Qt 4.8, seega otsustasime proovida seda. Valisime rakenduse moveblocks — nĂ€ite vedrulikust animatsioonist.

Qt moveblocks QEMU-sQt portimine STM32-le

Alustuseks konfigureerime Qt vĂ”imalikult vĂ€heste komponentidega, mis on vajalikud animatsiooni toetamiseks. Selleks on olemas valik "-qconfig minimal,small,medium 
". See ĂŒhendab konfigureerimisfaili Qt koostisosade seast, kus on palju makrosid — mida sisse lĂŒlitada / mida vĂ€lja lĂŒlitada. PĂ€rast seda valikut lisame konfiiguratsioonile teisi lippe, kui soovime veel midagi tĂ€iendavalt vĂ€lja lĂŒlitada. Siin on nĂ€ide meie konfigureerimisest.

Qt tööle saamiseks tuleb lisada ĂŒhilduvuskiht operatsioonisĂŒsteemiga. Üks vĂ”imalus on rakendada QPA (Qt Platform Abstraction). Aluseks vĂ”eti juba olemasolev fb_base plugin, millele toetub QPA Linuxile. Tulemuseks on vĂ€ike emboxfb plugin, mis pakub Qt-le Emboxi raamibufferit, ning seejĂ€rel joonistab see sinna juba iseseisvalt.

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 see nÀeb vÀlja, kui taaskÀivitamine toimub

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 kompressioon on lubatud -Os, sai teegi pilt 3,5 MB, mis ei mahutu STM32F746 peamisse mÀllu. Nagu juba meie teises artiklis OpenCV kohta kirjutatud, on sellel plaadil:

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

Kuna OpenCV jaoks on lisatud tugi koodi tÀitmiseks QSPI-st, otsustasime alustada sellega, et laadisime Emboxi pildi Qt-ga tÀielikult QSPI-sse. Ja hurraa, kÔik kÀivitus peaaegu kohe QSPI-st! Kuid nagu OpenCV puhul, ilmnes, et kÔik töötab liiga aeglaselt.

Qt portimine STM32-le

SeetÔttu otsustasime teha nii - esmalt kopeerime pildi QSPI-sse, seejÀrel laadime selle SDRAM-i ja kÀivitame sealt. SDRAM-is oli pisut kiiremini, kuid ikkagi kaugel QEMU-st.

Qt portimine STM32-le

JĂ€rgmine idee oli lubada ujukoma - kuna Qt teeb animatsiooni ruutude koordinaatide arvutamiseks mĂ”ningaid arvutusi. Proovisime, kuid siin ei saanud nĂ€htavat kiirendust, kuigi artiklis Qt arendajad vĂ€idavad, et FPU toob „puutetundlikul ekraanil” „dragging animation” jaoks kaasa mĂ€rkimisvÀÀrse kiirusetĂ”usu. VĂ”imalik, et moveblocks'i puhul on ujukomaga arvutamisi oluliselt vĂ€hem, mis sĂ”ltub konkreetsetest nĂ€idetest.

KĂ”ige efektiivsemaks osutus mĂ”te viia framebuffer SDRAM'ist sisse*mĂ€llu. Selleks muutsime ekraanide suurused 480×272 asemel 272×272-ks. Samuti vĂ€hendasime vĂ€rvisĂŒgavust A8R8G8B8-lt R5G6B5-ks, vĂ€hendades seega ĂŒhe pikseli suurust 4 baitist 2 baitini. Saime framebuffersuuruseks 272 * 272 * 2 = 147968 baiti. See andis mĂ€rkimisvÀÀrse kiirusetĂ”usu, mis oli tĂ”enĂ€oliselt kĂ”ige silmatorkavam, ning animatsioon muutus peaaegu sujuvaks.

Viimane optimeerimine oli Emboxi koodi tÀitmine RAM-is ja Qt SDRAM-is. Selleks lingime kÔigepealt Emboxi koos Qt-ga staatiliselt, kuid paigutame teeki segmentide text, rodata, data ja bss QSPI-sse, et seejÀrel SDRAM-i kopeerida.

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'i koodi tÀitmise tÔttu ROM-is saime samuti tajutava kiirusetÔusu. Tulemuseks oli animatsioon, mis osutus piisavalt sujuvaks:

Vaata videot

Artikli ettevalmistamise ja erinevate Embox'i konfigureerimiste proovimise kĂ€igus selgus, et Qt moveblocks töötab suurepĂ€raselt ka QSPI kaudu SDRAM-i kaadrimĂ€lu abil, kuid kitsaskohaks oli tĂ”epoolest kaadrimĂ€lu suurus! Ilmneb, et algse 'slaidishow' ĂŒletamiseks piisab kahe kiire tĂ”usu saavutamisest kaadrimĂ€lu suuruse lihtsa vĂ€hendamise tĂ”ttu. Sellist tulemust, viies ainult Embox'i koodi kiiremasse mĂ€lu, ei Ă”nnestunud saavutada (kiirus kasvas mitte 2, vaid umbes 1.5 korda).

Kuidas ise proovida

Kui teil on STM32F7-Discovery, saate Qt'i Embox'i all ise kÀivitada. Selle kohta saate lugeda meie vikis.

KokkuvÔte

LĂ”puks Ă”nnestus meil Qt kĂ€ivitada! Ülesande keerukus on meie arvates pisut ĂŒlehindatud. Loomulikult on oluline arvestada mikrokontrollerite spetsiifikat ja mĂ”ista arvutusprogrammide arhitektuuri. Optimeerimise tulemused nĂ€itavad tuntud fakti, et kĂ”ige kitsam koht arvutisĂŒsteemis ei ole protsessor, vaid mĂ€lu.

Sel aastal osaleme festivalil TechTrain. Seal rÀÀgime ja nÀitame lÀhemalt Qt, OpenCV mikrokontrolleritel ja muid meie saavutusi.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster