God dag! Vi arbetar pÄ projektet och har lanserat Qt pÄ STM32F7-Discovery och vill gÀrna berÀtta om det. Tidigare har vi redan berÀttat hur vi lyckades fÄ igÄng .
Qt Ă€r ett plattformsoberoende ramverk som inkluderar inte bara grafiska komponenter utan ocksĂ„ saker som QtNetwork, en uppsĂ€ttning klasser för databashantering, Qt for Automation (inklusive för implementering av IoT) och mycket mer. Utvecklarna i Qt-teamet har pĂ„ förhand förberett anvĂ€ndning av Qt i inbyggda system, sĂ„ biblioteken Ă€r ganska vĂ€l konfigurerbara. Men fram till nyligen har fĂ„ tĂ€nkt pĂ„ portering av Qt till mikrokontroller, sannolikt för att uppgiften verkar komplicerad â Qt Ă€r stort, MCU Ă€r smĂ„.
Ă
andra sidan finns det nu mikrokontroller som Àr avsedda för multimedia och övertrÀffar de första Pentium-datorerna. För ungefÀr ett Är sedan dök det upp ett i Qt-bloggen. Utvecklarna har portat Qt för RTEMS-operativsystemet och kört exempel med widgets pÄ flera kort som drivs av stm32f7. Det intresserade oss. Det var uppenbart, och utvecklarna sjÀlva skriver om det, att Qt Àr segt pÄ STM32F7-Discovery. Vi blev nyfikna pÄ om vi kunde köra Qt pÄ Embox, och inte bara rita widgets, utan ocksÄ köra animation.
Qt 4.8 har lĂ€nge varit portat till Embox, sĂ„ vi beslutade att försöka med det. Vi valde applikationen moveblocks â ett exempel pĂ„ fjĂ€drande animation.
Qt moveblocks pÄ QEMU
Först konfigurerar vi Qt med sĂ„ minimalt sett av komponenter som möjligt, vilket behövs för att stödja animation. Det finns en option â-qconfig minimal, small, medium âŠâ. Den kopplar ett konfigurationsfil frĂ„n Qt med mĂ„nga makron â vad som ska inkluderas / vad som ska uteslutas. Efter denna option lĂ€gger vi till andra flaggor i konfigurationen om vi vill stĂ€nga av nĂ„got mer. HĂ€r Ă€r ett exempel pĂ„ vĂ„r .
För att Qt ska fungera mÄste vi lÀgga till ett kompatibilitetslager för OS. Ett sÀtt Àr att implementera QPA (Qt Platform Abstraction). Vi anvÀnde den redan befintliga fb_base-pluginen i Qt som bas för QPA för Linux. Resultatet blev en liten plugin emboxfb som tillhandahÄller Qt framebuffer för Embox, och dÀrefter ritar den dit utan extern hjÀlp.
SÄ hÀr ser skapandet av en plugin ut
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();
}
SÄ hÀr kommer omritningen att se ut
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;
}
Som ett resultat av att kompilatorns minnesoptimering -Os var aktiverad, blev storleken pÄ bibliotekets bild 3,5 MB, vilket sjÀlvklart inte fÄr plats i huvudminnet STM32F746. Som vi redan nÀmnt i vÄr andra artikel om OpenCV, denna plat innehÄller:
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
Eftersom OpenCV redan hade stöd för att köra kod frÄn QSPI, beslutade vi att först ladda bilden av Embox med Qt i QSPI helt. Och hurra, nÀstan allt startade direkt frÄn QSPI! Men precis som med OpenCV visade det sig att det fungerade för lÄngsamt.

DĂ€rför bestĂ€mde vi oss för att göra sĂ„ hĂ€r â först kopiera bilden till QSPI, sedan ladda den i SDRAM och köra dĂ€rifrĂ„n. FrĂ„n SDRAM blev det lite snabbare, men det var fortfarande lĂ„ngt ifrĂ„n QEMU.

Vidare fanns tanken att aktivera flyttal â eftersom Qt gör vissa berĂ€kningar av kvadraternas koordinater i animationen. Vi provade, men fick ingen mĂ€rkbar accelerering, Ă€ven om Qt-utvecklarna hĂ€vdade att FPU ger en betydande hastighetsökning för "dragging animation" pĂ„ pekskĂ€rmen. Kanske handlar det om att moveblocks innehĂ„ller betydligt fĂ€rre flyttalsberĂ€kningar, och det beror pĂ„ det specifika exemplet.
Den mest effektiva idĂ©n var att flytta framebuffer frĂ„n SDRAM till internminnet. För detta gjorde vi skĂ€rmstorleken till 272Ă272 istĂ€llet för 480Ă272. Vi sĂ€nkte Ă€ven fĂ€rgdjupet frĂ„n A8R8G8B8 till R5G6B5, vilket minskade storleken pĂ„ en pixel frĂ„n 4 till 2 byte. Vi fick en framebuffer-storlek pĂ„ 272 * 272 * 2 = 147968 byte. Detta gav en betydande ökning av hastigheten, kanske den mest mĂ€rkbara, och animationen blev nĂ€stan helt jĂ€mn.
Den sista optimeringen var att köra koden frÄn Embox frÄn RAM och Qt frÄn SDRAM. För detta lÀnkade vi först Embox tillsammans med Qt statiskt som vanligt, men segmenten text, rodata, data och bss frÄn biblioteket placerades i QSPI, sÄ att vi sedan kunde kopiera dem till 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))
Genom att köra koden frÄn Embox frÄn ROM fick vi ocksÄ en mÀrkbar ökning av hastigheten. Resultatet blev att animationen blev tillrÀckligt jÀmn:

I slutet, nÀr vi förberedde artikeln och testade olika konfigurationer av Embox, upptÀckte vi att Qt moveblocks fungerar utmÀrkt frÄn QSPI med framebuffer i SDRAM, och det trÄnga omrÄdet var faktiskt storleken pÄ framebuffer! Det verkar som att för att övervinna det initiala "slideshowet" rÀckte det med en 2 gÄnger ökning genom att helt enkelt minska storleken pÄ framebuffer. Att uppnÄ ett sÄdant resultat genom att bara flytta koden frÄn Embox till olika snabba minnen var inte möjligt (ökningen var inte 2 utan cirka 1,5 gÄnger).
Hur du kan testa sjÀlv
Om du har en STM32F7-Discovery kan du köra Qt under Embox sjÀlv. LÀs hur det görs pÄ vÄr .
Slutsats
Som ett resultat lyckades vi köra Qt! SvÄrighetsgraden av uppgiften, enligt vÄr Äsikt, var nÄgot överdriven. Naturligtvis mÄste man ta hÀnsyn till mikrokontrollens specifik och förstÄ arkitekturen av datorsystem. Optimeringsresultaten visar det vÀlkÀnda faktumet att den mest begrÀnsande faktorn i ett datorsystem inte Àr processorn, utan minnet.
I Är kommer vi att delta i festivalen . DÀr kommer vi att berÀtta mer och visa Qt, OpenCV pÄ mikrokontroller och vÄra andra framgÄngar.
KĂ€lla: habr.com
