Mholo Sikwiprojekthi
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
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-QEMU
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
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.
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.
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
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
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
umthombo: www.habr.com