MirĂ«dita! Ne jemi nĂ« projekt kemi запŃŃĐșа (nĂ«) Qt nĂ« STM32F7-Discovery dhe dĂ«shirojmĂ« tĂ« flasim pĂ«r kĂ«tĂ«. MĂ« parĂ«, ne kishim folur pĂ«r mĂ«nyrĂ«n se si arritĂ«m tĂ« lançojmĂ« .
Qt Ă«shtĂ« njĂ« kornizĂ« ndĂ«rplatformĂ«, e cila pĂ«rfshin jo vetĂ«m komponentĂ« grafikĂ«, por edhe gjĂ«ra si QtNetwork, njĂ« grup klasash pĂ«r punĂ« me baza tĂ« dhĂ«nash, Qt for Automation (pĂ«rfshirĂ« pĂ«r realizimin e IoT) dhe shumĂ« tĂ« tjera. Zhvilluesit e ekipit Qt kishin parashikuar mĂ« parĂ« pĂ«rdorimin e Qt nĂ« sisteme tĂ« integruara, prandaj bibliotekat janĂ« mjaft tĂ« konfigurueshme. MegjithatĂ«, deri para njĂ« kohe tĂ« shkurtĂ«r, pak kush e kishte menduar portimin e Qt nĂ« mikroprocesorĂ«, ndoshta pĂ«r shkak se njĂ« detyrĂ« e tillĂ« duket e vĂ«shtirĂ« â Qt Ă«shtĂ« e madhe, mikroprocesorĂ«t janĂ« tĂ« vegjĂ«l.
Në anën tjetër, në këtë moment ka mikroprocesorë të destinuar për punë me multimedia dhe që tejkalojnë Pentium të parë. Rreth një vit më parë në blogun e Qt u shfaq një . Zhvilluesit e bënë portin Qt për sistemin e operativ RTEMS dhe ekzekutuan shembuj me widgeta në disa pllaka me menaxhimin e stm32f7. Kjo na interesoi. Ishte e dukshme, dhe vetë zhvilluesit e përmendin se Qt ngadalësohet në STM32F7-Discovery. Na u bë interesante, nëse do të mundnim të ekzekutonim Qt mbi Embox, duke mos e thjesht vizatuar widgetin, por duke ekzekutuar animacionin.
NĂ« Embox, Qt 4.8 Ă«shtĂ« portuar prej kohĂ«sh, kĂ«shtu qĂ« vendosĂ«m ta provojmĂ« atĂ«. ZgjedhĂ«m aplikacionin moveblocks â njĂ« shembull i animacionit elastik.
Qt moveblocks në QEMU
Para sĂ« gjithash, konfigurojmĂ« Qt me sa mĂ« shumĂ« pak komponentĂ« tĂ« nevojshĂ«m pĂ«r mbĂ«shtetje tĂ« animacionit. PĂ«r kĂ«tĂ«, ekziston opsioni "-qconfig minimal, small, medium ...". Kjo aktivizon njĂ« skedar konfigurimi nga pĂ«rbĂ«rja e Qt me shumĂ« makros â çfarĂ« tĂ« aktivizohet / çfarĂ« tĂ« shkĂ«putet. Pas kĂ«tij opsioni, shtojmĂ« nĂ« konfigurim flamuj tĂ« tjerĂ«, nĂ«se dĂ«shirojmĂ« tĂ« shkĂ«pusim diçka tjetĂ«r. KĂ«tu Ă«shtĂ« njĂ« shembull i... .
Për të bërë që Qt të funksionojë, duhet të shtoni një shtresë pajtueshmërie me sistemin operativ. Një nga mënyrat është të realizoni QPA (Qt Platform Abstraction). Përdorëm një plugin të gatshëm fb_base në pjesën e Qt, mbi të cilin funksionon QPA për Linux. Si rezultat, u krijua një plugin i vogël emboxfb, i cili ofron framebuffer-in e Embox për Qt, dhe më pas mund ta vizatojë atje pa ndihmë të jashtme.
Kështu duket krijimi i plugin-it
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 (fbPath setPhysicalSize(QSize(fbWidth, fbHeight));
mScreens.append(mPrimaryScreen);
this->printFbInfo();
}
kështu do të duket ri-renditja
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;
}
Si pashe optimizimi i kompilatorit për madhësinë e memories -Os, imazhi i bibliotekës u bë 3.5 MB, që natyrisht nuk ka vend në memorinë kryesore STM32F746. Siç kemi shkruar në artikullin tonë tjetër mbi OpenCV, në këtë bord ka:
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
Tani, pasi OpenCV ka shtuar mbështetje për ekzekutimin e kodit nga QSPI, ne vendosëm të fillojmë duke ngarkuar imazhin e Embox me Qt plotësisht në QSPI. Dhe urra, gjithçka pothuajse menjëherë filloi të funksionojë nga QSPI! Por si në rastin me OpenCV, rezultoi se funksionon shumë ngadalë.

Prandaj vendosĂ«m tĂ« bĂ«nim kĂ«shtu â fillimisht kopjojmĂ« imazhin nĂ« QSPI, pastaj e ngarkojmĂ« atĂ« nĂ« SDRAM dhe ekzekutojmĂ« nga atje. Nga SDRAM u bĂ« pak mĂ« e shpejtĂ«, por ende shumĂ« larg QEMU.

MĂ« pas pati idenĂ« pĂ«r tĂ« aktivizuar pikĂ«t e lĂ«vizshme â sepse Qt bĂ«n disa llogaritje tĂ« koordinatave tĂ« katrorĂ«ve nĂ« animacion. Provomuam, por kĂ«tu s'e morĂ«m ndonjĂ« pĂ«rfitim tĂ« dukshĂ«m, ndonĂ«se nĂ« Zhvilluesit e Qt kanĂ« pohuar se FPU ofron njĂ« rritje tĂ« dukshme tĂ« shpejtĂ«sisĂ« pĂ«r "dragging animation" nĂ« ekranet me prekje. MundĂ«sisht, nĂ« moveblocks ka mĂ« pak llogaritje me pikĂ« flotante, dhe kjo varet nga shembulli specifik.
Ideja mĂ« efektive ishte tĂ« transferonim frame buffer nga SDRAM nĂ« memorie tĂ« brendshme. PĂ«r kĂ«tĂ«, ne vendosĂ«m dimensionet e ekranit nga 480Ă272 nĂ« 272Ă272. Gjithashtu e ulĂ«m thellĂ«sinĂ« e ngjyrĂ«s nga A8R8G8B8 nĂ« R5G6B5, duke e reduktuar kĂ«shtu madhĂ«sinĂ« e njĂ« pikseli nga 4 nĂ« 2 byte. KĂ«shtu, morĂ«m madhĂ«sinĂ« e frame buffer-it 272 * 272 * 2 = 147968 byte. Kjo ofroi njĂ« pĂ«rshpejtim tĂ« konsiderueshĂ«m, ndoshta mĂ« tĂ« dukshmin, animacioni u bĂ« pothuajse i qetĂ«.
Optimizimi i fundit ishte ekzekutimi i kodit Embox nga RAM, ndërsa Qt nga SDRAM. Për këtë, ne fillimisht si zakonisht e lidhim statikisht Embox së bashku me Qt, por segmenteve text, rodata, data dhe bss të bibliotekës u vendosëm në QSPI, për t'i kopjuar më pas në SDRAM.
section (qt_text, SDRAM, QSPI)\nphdr\t(qt_text, PT_LOAD, FLAGS(5))\n\nsection (qt_rodata, SDRAM, QSPI)\nphdr\t(qt_rodata, PT_LOAD, FLAGS(5))\n\nsection (qt_data, SDRAM, QSPI)\nphdr\t(qt_data, PT_LOAD, FLAGS(6))\n\nsection (qt_bss, SDRAM, QSPI)\nphdr\t(qt_bss, PT_LOAD, FLAGS(6))
Duke ekzekutuar kodin Embox nga ROM, gjithashtu kemi marrë një përshpejtim të dukshëm. Në fund, animacioni rezultoi mjaft i qetë:

Në fund, duke përgatitur artikullin dhe provuar konfigurime të ndryshme të Embox, u zbulua se Qt moveblocks funksionon shkëlqyeshëm edhe nga QSPI me framebuffer në SDRAM, dhe ngushtimi ishte pikërisht madhësia e framebuffer-it! Për sa duket, për të tejkaluar "slideshow" fillestar ishte e mjaftueshme një përshpejtim 2-fish duke ulur thjesht madhësinë e framebuffer-it. Duke e transferuar vetëm kodin e Embox në memori të shpejta, nuk arritëm një rezultat të tillë (përshpejtimi dilte jo 2, por rreth 1.5 herë).
Si ta provoni vetë
NĂ«se keni STM32F7-Discovery, mund tĂ« запŃŃĐșаДŃĐ” Qt nĂ«n Embox vetĂ«. Mund tĂ« lexoni se si bĂ«het kjo nĂ« .
Përfundimi
Si përfundim, arritëm të nisim Qt! Sfidat e detyrës, sipas mendimit tonë, janë paksa të ekzagjëruara. Natyrisht, duhet të merret parasysh specifika e mikrokontrollerëve dhe të kuptohet përgjithësisht arkitektura e sistemeve kompjuterike. Rezultatet e optimizimit tregojnë faktin e njohur se pjesa më e ngushtë në sistemin e përpunimit nuk është procesori, por memoria.
Këtë vit do të marrim pjesë në festivalin . Atje do të tregojmë më shumë dhe do të shfaqim Qt, OpenCV në mikrokontrollerë dhe arritjet tona të tjera.
Burimi: habr.com
