Portimi i Qt në STM32

Portimi i Qt në STM32Mirëdita! Ne jemi në projekt Embox 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ë OpenCV.

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 një postim. 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ë QEMUPortimi i Qt në STM32

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Ă« konfigurimit.

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

Portimi i Qt në STM32

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.

Portimi i Qt në STM32

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Ă« artikulli ynĂ« 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:

Luaj videon

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ë wiki.

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 TechTrain. Atje do të flasim dhe tregojmë më hollësi mbi Qt, OpenCV në mikroprocesorët dhe arritjet e tjera tona.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster