Ukuthuthwa kwe-Qt ukuya kwi-STM32

Ukuthuthwa kwe-Qt ukuya kwi-STM32Mholo Sikwiprojekthi Emboks yazisa i-Qt kwi-STM32F7-Discovery kwaye ingathanda ukuthetha ngayo. Ngaphambili, sele sixelele ukuba sikwazile njani ukusungula I-OpenCV.

I-Qt yinkqubo-sikhokelo ye-cross-platform engabandakanyi amacandelo emifanekiso kuphela, kodwa kunye nezinto ezifana ne-QtNetwork, isethi yeeklasi zokusebenza kunye nedathabhesi, i-Qt ye-Automation (kubandakanywa nokuphunyezwa kwe-IoT) kunye nokunye okuninzi. Iqela le-Qt belisoloko lisebenza malunga nokusebenzisa i-Qt kwiinkqubo ezizinzisiweyo, ngoko ke amathala eencwadi aqwalaselwe. Nangona kunjalo, kude kube kutshanje, bambalwa abantu abacinga ngokuhambisa i-Qt kwi-microcontrollers, mhlawumbi ngenxa yokuba umsebenzi onjalo ubonakala unzima - i-Qt inkulu, ii-MCU zincinci.

Ngakolunye uhlangothi, okwangoku kukho i-microcontrollers eyenzelwe ukusebenza kunye nemultimedia kwaye iphezulu kunePentiums yokuqala. Malunga nonyaka odlulileyo, ibhlog yeQt yavela iposti. Abaphuhlisi benze i-port ye-Qt ye-RTEMS OS, kwaye baqalise imizekelo enewijethi kwiibhodi ezininzi eziqhuba i-stm32f7. Oku kwaba nomdla kuthi. Kwaphawuleka, kwaye abaphuhlisi ngokwabo babhala ngayo, ukuba i-Qt iyacotha kwi-STM32F7-Discovery. Besicinga ukuba singaqhuba i-Qt phantsi kwe-Embox, kwaye singazobi nje iwijethi, kodwa siqhube oopopayi.

I-Qt 4.8 ifakwe kwi-Embox ixesha elide, ngoko ke sagqiba ekubeni siyizame. Sikhethe usetyenziso lwee-moveblocks-umzekelo wopopayi oluhlaza.

Qt iibhloko ezihambayo kwi-QEMUUkuthuthwa kwe-Qt ukuya kwi-STM32

Ukuqala, siqwalasela i-Qt, ukuba kuyenzeka, kunye neseti esezantsi yamacandelo afunekayo ukuxhasa oopopayi. Kule nto kukho ukhetho "-qconfig encinci, encinci, ephakathi ...". Idibanisa ifayile yoqwalaselo esuka kwi Qt ngeemakhro ezininzi-ukwenza ntoni/ukwenza ukukhubaza ntoni. Emva kolu khetho, songeza ezinye iiflegi kuqwalaselo ukuba sifuna ukukhubaza enye into. Nanku umzekelo wethu ubume.

Ukuze i-Qt isebenze, kufuneka udibanise umaleko wokuhambelana kwe-OS. Enye indlela kukuphumeza i-QPA (Qt Platform Abstraction). Sithathe njengesiseko iplagi esele yenziwe fb_base efakwe kwi-Qt, ngesiseko apho iQPA yeLinux isebenza. Isiphumo yiplagi encinci ebizwa ngokuba yi-emboxfb, ebonelela ngeQt nge-Embox's framebuffer, kwaye emva koko izoba apho ngaphandle koncedo lwangaphandle.

Yile nto ijongeka ngayo ukwenza iplagin

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 < 0) {
        qFatal("QEmboxFbIntegration: Error open framebuffer %s", fbPath);
    }
    if (ioctl(fbFd, FBIOGET_FSCREENINFO, &finfo) == -1) {
        qFatal("QEmboxFbIntegration: Error ioctl framebuffer %s", fbPath);
    }
    if (ioctl(fbFd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
        qFatal("QEmboxFbIntegration: Error ioctl framebuffer %s", fbPath);
    }
    fbWidth        = vinfo.xres;
    fbHeight       = vinfo.yres;
    fbBytesPerLine = finfo.line_length;
    fbSize         = fbBytesPerLine * fbHeight;
    fbFormat       = vinfo.fmt;
    fbData = (uint8_t *)mmap(0, fbSize, PROT_READ | PROT_WRITE,
                             MAP_SHARED, fbFd, 0);
    if (fbData == MAP_FAILED) {
        qFatal("QEmboxFbIntegration: Error mmap framebuffer %s", fbPath);
    }
    if (!fbData || !fbSize) {
        qFatal("QEmboxFbIntegration: Wrong framebuffer: base = %p,"
               "size=%d", fbData, fbSize);
    }

    mPrimaryScreen = new QEmboxFbScreen(fbData, fbWidth,
                                        fbHeight, fbBytesPerLine,
                                        emboxFbFormatToQImageFormat(fbFormat));

    mPrimaryScreen->setPhysicalSize(QSize(fbWidth, fbHeight));
    mScreens.append(mPrimaryScreen);

    this->printFbInfo();
}

Kwaye oku kuya kujongeka njani ukuzoba ngokutsha

QRegion QEmboxFbScreen::doRedraw()
{
    QVector<QRect> rects;
    QRegion touched = QFbScreen::doRedraw();

    DPRINTF("QEmboxFbScreen::doRedrawn");

    if (!compositePainter) {
        compositePainter = new QPainter(mFbScreenImage);
    }

    rects = touched.rects();
    for (int i = 0; i < rects.size(); i++) {
        compositePainter->drawImage(rects[i], *mScreenImage, rects[i]);
    }
    return touched;
}

Ngenxa yoko, kunye ne-compiler optimization yesayizi yememori -i-Os inikwe amandla, umfanekiso wethala leencwadi uye waba ngu-3.5 MB, ngokuqinisekileyo awungeni kwimemori ephambili ye-STM32F746. Njengoko sele sibhale kwelinye inqaku lethu malunga ne-OpenCV, le bhodi ine:

  • 1 MB iROM
  • 320 KB RAM
  • 8 MB SDRAM
  • 16 MB QSPI

Ekubeni inkxaso yokwenza ikhowudi esuka kwi-QSPI sele yongezwe kwi-OpenCV, sigqibe ekubeni siqale ngokulayisha yonke i-Emboks c Qt umfanekiso kwi-QSPI. Kwaye ngokukhawuleza, yonke into yaqala ngokukhawuleza ukusuka kwi-QSPI! Kodwa njengakwimeko ye-OpenCV, kwavela ukuba isebenza kancinci kakhulu.

Ukuthuthwa kwe-Qt ukuya kwi-STM32

Ke ngoko, sigqibe kwelokuba siyenze ngale ndlela - okokuqala sikhuphela umfanekiso kwi-QSPI, emva koko siwulayishe kwi-SDRAM kwaye siphumeze ukusuka apho. Ukusuka kwi-SDRAM yaba ngokukhawuleza kancinci, kodwa kusekude neQEMU.

Ukuthuthwa kwe-Qt ukuya kwi-STM32

Okulandelayo, bekukho uluvo lokubandakanya indawo edadayo - emva kwayo yonke loo nto, iQt yenza izibalo zolungelelwaniso lwezikwere kuphiliso. Sizamile, kodwa apha asikhange sifumane nakuphi na ukukhawulezisa okubonakalayo, nangona singaphakathi nqaku Abaphuhlisi be-Qt babanga ukuba i-FPU inika ukonyuka okukhulu kwisantya β€œsokutsala oopopayi” kwiscreen sokuchukumisa. Kusenokubakho kakhulu izibalo ezincinci ezidadayo kwiibhloko ezihambayo, kwaye oku kuxhomekeke kumzekelo othile.

Olona luvo lusebenzayo yayikukususa isakhelo kwi-SDRAM ukuya kwimemori yangaphakathi. Ukwenza oku, senze imilinganiselo yesikrini hayi 480x272, kodwa 272x272. Siphinde sehlise ubunzulu bombala ukusuka kwi-A8R8G8B8 ukuya kwi-R5G6B5, ngaloo ndlela sinciphisa ubungakanani bepixel enye ukusuka kwi-4 ukuya kwi-2 bytes. Isiphumo sobungakanani besakhelo se-framebuffer yi-272 * 272 * 2 = 147968 bytes. Oku kunike isantya esibalulekileyo, mhlawumbi okuphawuleka kakhulu, oopopayi baphantse bagudiswa.

Ukulungiswa kwamva nje yayikukuqhuba ikhowudi ye-Emboks esuka kwi-RAM kunye nekhowudi ye-Qt esuka kwi-SDRAM. Ukwenza oku, siqala, njengesiqhelo, sidibanisa i-Emboks kunye ne-Qt, kodwa sibeka isicatshulwa, i-rodata, idatha kunye namacandelo e-bss yethala leencwadi kwi-QSPI ukuze siyikopishe kwi-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))

Ngokusebenzisa ikhowudi ye-Emboks evela kwi-ROM, siphinde safumana ukukhawuleza okubonakalayo. Ngenxa yoko, oopopayi bavele batyibilika:


Ekugqibeleni, ngelixa ulungiselela inqaku kwaye uzama uqwalaselo olwahlukileyo lwe-Embox, kwavela ukuba iibhloko ezihambayo ze-Qt zisebenza kakhulu ukusuka kwi-QSPI ngesakhelo se-SDRAM, kwaye i-bottleneck yayibubungakanani besakhelo esichanekileyo! Kubonakala ukuba, ukunqoba i-"slideshow" yokuqala, ukukhawuleza kwe-2 kwakwanele ngenxa yokunciphisa i-banal kubungakanani befreyimu yesakhelo. Kodwa kwakungenakwenzeka ukuphumeza umphumo onjalo ngokudlulisela kuphela ikhowudi ye-Emboks kwiinkumbulo ezahlukeneyo ezikhawulezayo (i-speedup yayingeyi-2, kodwa malunga namaxesha angama-1.5).

Ungazama njani ngokwakho

Ukuba une-STM32F7-Discovery, ungaqhuba i-Qt phantsi kwe-Embox ngokwakho. Unokufunda indlela oku kwenziwa ngayo kwinqaku lethu wiki.

isiphelo

Ngenxa yoko, sikwazile ukumisela iQt! Ubunzima bomsebenzi, ngokombono wethu, bugqithisekile. Ngokwemvelo, kufuneka uthathele ingqalelo izinto ezikhethekileyo ze-microcontrollers kwaye uqonde ngokubanzi ukwakhiwa kweenkqubo zekhompyuter. Iziphumo zokuphucula zikhomba kwinto eyaziwayo ukuba i-bottleneck kwinkqubo yekhompyutha ayiyona iprosesa, kodwa imemori.

Kulo nyaka siza kuthatha inxaxheba kulo mnyhadala I-TechTrain. Apho siya kukuxelela ngakumbi kwaye sibonise i-Qt, i-OpenCV kwi-microcontrollers kunye nezinye izinto esizifezileyo.

umthombo: www.habr.com

Yongeza izimvo