Tere pÀevast! Meie projektis kÀivitasime Qt STM32F7-Discovery'l ja tahaksime sellest rÀÀkida. Varasemalt oleme juba rÀÀkinud, kuidas me suutsime kÀivitada .
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 . 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-l
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 .
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.

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.

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. 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:

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 .
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 . Seal rÀÀgime ja nÀitame podroobneje Qt-t, OpenCV-d mikrokontrollerites ja muid meie saavutusi.
Allikas: habr.com
