Mirëdita! Ne jemi në projekt përshkruam Qt në STM32F7-Discovery dhe dëshirojmë të flasim për këtë. Më parë, ne kemi treguar si arritëm të lançojmë .
Qt është një kornizë cross-platform, e cila përfshin jo vetëm komponente grafike, por edhe përbërës të tillë si QtNetwork, një grup klasash për të punuar me baza të dhënash, Qt for Automation (përfshirë edhe për realizimin e IoT) dhe shumë të tjera. Zhvilluesit e ekipit Qt e kanë parashikuar përdorimin e Qt në sisteme të integruara, prandaj bibliotekat janë mjaft të konfigurueshme. Megjithatë, deri vonë, pak kush mendonte për portimin e Qt në mikrokontrolerë, ndoshta sepse kjo detyrë duket e komplikuar - Qt është e madhe, MCU-të janë të vogla.
Në anën tjetër, aktualisht ekzistojnë mikrokontrolerë të dedikuar për punë me multimedia që tejkalojnë Pentium-ët e parë. Rreth një vit më parë, në blogun e Qt u publikua . Zhvilluesit bënë portimin e Qt nën OS RTEMS dhe lançuan shembuj me vidhet në disa bordere që drejtohen nga stm32f7. Kjo na interesoi. Vërejtëm, dhe vetë zhvilluesit shkruajnë për këtë, që Qt ngadalëson në STM32F7-Discovery. Na bëri kuriozë të shohim nëse do të ishim në gjendje të lançonim Qt nën Embox, duke pasur parasysh se jo vetëm të vizatojmë një widget, por të lançojmë një animacion.
Në Embox është portuar për një kohë të gjatë Qt 4.8, prandaj vendosëm ta provojmë atë. Zgjedhëm aplikacionin moveblocks - një shembull i animacionit elastik.
Qt moveblocks në QEMU
Për fillim, konfigurojmë Qt sa më shumë që është e mundur me një set minimal komponentesh, të kërkuara për mbështetje animacioni. Për këtë ekziston opsioni “-qconfig minimal,small,medium …”. Ky opsion lidhet me një skedar konfigurimi nga grupi i Qt me shumë makro - çfarë të përfshihet / çfarë të ç’aktivizohet. Pas këtij opsioni, shtojmë në konfigurim flamuj të tjerë, nëse duam të ç’aktivizojmë diçka tjetër përveç. Ja një shembull i konfigurimit tonë .
Për të bërë që Qt të funksionojë, është e nevojshme të shtohet një nivel pajtueshmërie me OS-në. Një nga mënyrat është të realizojmë QPA (Qt Platform Abstraction). Pjesa themelore u bazua në një plugin të gatshëm fb_base në grupin e Qt, mbi të cilin funksionon QPA për Linux. Në fund u krijua një plugin i vogël emboxfb, i cili i ofron Qt një framebuffer të Embox-it, dhe më pas ajo vizaton aty pa ndihmë të jashtme.
Ja si duket krijimi i një plugin
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();
}
Kështu do të duket ripërsëritja
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 rezultat nga optimizimi i përkthyesit për madhësinë e memories -Os, imazhi i bibliotekës doli 3.5 Mb, që sigurisht nuk për puthet në memorien kryesore STM32F746. Siç kemi thënë në një artikull tjetër mbi OpenCV, kjo plaka ka:
- 1 Mb ROM
- 320 Kb RAM
- 8 Mb SDRAM
- 16 Mb QSPI
Duke qenë se për OpenCV tashmë ishte shtuar mbështetje për ekzekutimin e kodit nga QSPI, ne vendosëm të fillonim duke ngarkuar imazhin e Embox me Qt në QSPI-në e plotë. Dhe, urra, gjithçka u aktivizua pothuajse menjëherë nga QSPI! Por, ashtu si në rastin e OpenCV, doli se funksionon shumë ngadalë.

Prandaj, vendosëm të veprojmë kështu — së pari kopjojmë imazhin në QSPI, pastaj e ngarkojmë në SDRAM dhe ekzekutojmë prej aty. Nga SDRAM ishte pak më shpejt, por ende larg QEMU.

Më pas ishim me ide për të aktivizuar pikën e lëngshme — sepse Qt bën disa llogaritje të koordinatave të katrorëve në animacion. Provuam, por këtu nuk arritëm një shpejtësi të dukshme, edhe pse në zhvilluesit e Qt pretendonin se FPU jep një rritje të rëndësishme në shpejtësi për 'animacionin e tërheqjes' në ekranin me prekje. Ndoshta, në moveblocks ka shumë më pak llogaritje me pikë lëngshme, dhe kjo varet nga shembulli konkret.
Ideja më e efektshme ishte të transferonim framebuffer nga SDRAM në memorinë e brendshme. Për këtë, ne e bëmë përmasën e ekranit jo 480×272, por 272×272. Po ashtu ulëm thellësinë e ngjyrës nga A8R8G8B8 në R5G6B5, duke reduktuar kështu madhësinë e një pikseli nga 4 në 2 byte. Kështu morëm madhësinë e framebufferit 272 * 272 * 2 = 147968 byte. Kjo dha një përshpejtim të konsiderueshëm, ndoshta më të dukshëm, animacioni u bë pothuajse i lëmuar.
Optimalizimi i fundit ishte ekzekutimi i kodit Embox nga RAM, dhe Qt nga SDRAM. Për këtë, ne fillimisht e lidhim statikisht Embox së bashku me Qt, por segmentet text, rodata, data dhe bss të bibliotekës vendosen në QSPI, që më pas të kopjohen në 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))
Duke ekzekutuar kodin Embox nga ROM, gjithashtu morëm një përshpejtim të ndjeshëm. Si rezultat, animacioni doli mjaft i lëmuar:

Gjatë përgatitjes së artikullit dhe provave të konfiguracioneve të ndryshme të Embox, u zbulua se Qt moveblocks punon mrekullisht edhe nga QSPI me framebuffer në SDRAM, dhe pika e ngushtë ishte pikërisht madhësia e framebufferit! Kështu duket se për të kaluar fillimin “slide-show” mjaftonte një përshpejtim prej 2 herësh përmes zvogëlimit të thjeshtë të madhësisë së framebufferit. Por të arrihej një rezultat të tillë duke transferuar vetëm kodin e Embox në memoriet e shpejta nuk ishte e mundur (përshpejtimi rezultonte jo 2 herë, por rreth 1.5 herë).
Si të provoni vetë
Nëse keni STM32F7-Discovery, mund të nisni Qt nën Embox vetë. Mund ta lexoni se si bëhet këtë në .
Përfundim
Në përfundim, arritëm të nisnim Qt! Sfidat mbi këtë detyrë, sipas mendimit tonë, ishin paksa të ekzagjeruara. Natyrisht, duhet të merret parasysh specifika e mikroprocesorëve dhe të kuptohet në përgjithësi arkitektura e sistemeve kompjuterike. Rezultatet e optimizimit tregojnë faktin e njohur se vendi më i ngushtë në një sistem llogaritës nuk është procesori, por memoria.
Këtë vit do të marrim pjesë në festivalin . Atje do të flasim dhe tregojmë më hollësi mbi Qt, OpenCV në mikroprocesorët dhe arritjet e tjera tona.
Burimi: habr.com
