Sawubona Sikuphrojekthi
I-Qt iwuhlaka lwenkundla ephambanayo olungahlanganisi izingxenye zegraphic kuphela, kodwa nezinto ezifana ne-QtNetwork, iqoqo lamakilasi okusebenza ngezizindalwazi, i-Qt for Automation (okuhlanganisa nokusetshenziswa kwe-IoT) nokunye okuningi. Ithimba le-Qt belizimisele ngokusebenzisa i-Qt ezinhlelweni ezishumekiwe, ngakho-ke imitapo yolwazi iyalungiseka. Kodwa-ke, kuze kube muva nje, bambalwa abantu ababecabanga ngokuhambisa i-Qt kuma-microcontrollers, mhlawumbe ngenxa yokuthi umsebenzi onjalo ubonakala unzima - i-Qt inkulu, ama-MCU mancane.
Ngakolunye uhlangothi, okwamanje kukhona ama-microcontrollers aklanyelwe ukusebenza nge-multimedia futhi aphakeme kune-Pentiums yokuqala. Cishe unyaka owedlule, kwavela ibhulogi ye-Qt
I-Qt 4.8 ithuthelwe ku-Embox isikhathi eside, ngakho-ke sinqume ukuyizama kuyo. Sikhethe uhlelo lokusebenza lwe-moveblocks - isibonelo sokugqwayiza kwe-springy.
I-Qt ivimba ukunyakaza ku-QEMU
Okokuqala, silungiselela i-Qt, uma kungenzeka, ngesethi encane yezingxenye ezidingekayo ukusekela ukugqwayiza. Kulokhu kukhona inketho "-qconfig minimal, encane, ephakathi ...". Ixhuma ifayela lokucushwa elisuka ku-Qt elinama-macros amaningi - yini ongayinika amandla / ozoyikhubaza. Ngemuva kwale nketho, sengeza amanye amafulegi ekucushweni uma sifuna ukukhubaza enye into. Nasi isibonelo sethu
Ukuze i-Qt isebenze, udinga ukwengeza isendlalelo sokuhambisana ne-OS. Enye indlela ukusebenzisa i-QPA (Qt Platform Abstraction). Sithathe njengesisekelo i-plugin esenziwe ngomumo ye-fb_base efakwe ku-Qt, ngesisekelo i-QPA ye-Linux esebenza ngayo. Umphumela uba i-plugin encane ebizwa nge-emboxfb, ehlinzeka nge-Qt nge-framebuffer ye-Embox, bese idonsela lapho ngaphandle kosizo lwangaphandle.
Yilokhu okwenza i-plugin kubukeke
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();
}
Futhi lokhu kuzobukeka kanjani ukudwetshwa kabusha
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 yalokho, ngokulungiselela kahle komhlanganisi wosayizi wememori -Os inikwe amandla, isithombe selabhulali sivele saba ngu-3.5 MB, okuyinto engangeni kwimemori eyinhloko ye-STM32F746. Njengoba sesike sabhala kwenye indatshana yethu mayelana ne-OpenCV, leli bhodi linakho:
- 1 MB I-ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
Njengoba ukusekelwa kokufaka ikhodi evela ku-QSPI sekungeziwe ku-OpenCV, sinqume ukuqala ngokulayisha sonke isithombe se-Embox c Qt ku-QSPI. Futhi ngokushesha, yonke into yaqala cishe ngokushesha kusuka ku-QSPI! Kepha njengasendabeni ye-OpenCV, kwavela ukuthi isebenza kancane kakhulu.
Ngakho-ke, sinqume ukukwenza ngale ndlela - okokuqala sikopisha isithombe ku-QSPI, bese sisilayisha ku-SDRAM bese sisenza sisuka lapho. Kusuka ku-SDRAM kube ngokushesha, kodwa kusekude ne-QEMU.
Okulandelayo, kube nombono wokufaka iphoyinti elintantayo - phela, i-Qt yenza izibalo zezixhumanisi zezikwele ku-animation. Sizamile, kodwa lapha asitholanga noma yikuphi ukusheshisa okubonakalayo, nakuba kuphakathi
Umbono osebenza kahle kakhulu bekuwukuhambisa i-framebuffer isuka ku-SDRAM iye kumemori yangaphakathi. Ukwenza lokhu, asenze ubukhulu besikrini hhayi 480x272, kodwa 272x272. Siphinde sehlisa ukujula kombala kusuka ku-A8R8G8B8 kuya ku-R5G6B5, ngaleyo ndlela sehlisa usayizi wephikseli eyodwa ukusuka ku-4 kuya ku-2 bytes. Usayizi we-framebuffer owumphumela ungu-272 * 272 * 2 = 147968 bytes. Lokhu kunikeze ukusheshisa okukhulu, mhlawumbe okuphawuleka kakhulu, ukugqwayiza kwacishe kwashelela.
Ukulungiselela kwakamuva bekuwukusebenzisa ikhodi ye-Embox esuka ku-RAM kanye nekhodi ye-Qt evela ku-SDRAM. Ukuze senze lokhu, siqala, njengenjwayelo, sixhumanise i-Emboks kanye ne-Qt ngokwezibalo, kodwa sibeka umbhalo, i-rodata, idatha kanye nezingxenye ze-bss zelabhulali ku-QSPI ukuze sikukopishele ku-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 ikhodi ye-Embox evela ku-ROM, siphinde sathola ukusheshisa okubonakalayo. Ngenxa yalokho, i-animation ibonakale ishelela kakhulu:
Ekugcineni, ngenkathi silungiselela i-athikili futhi sizama ukucushwa okuhlukile kwe-Embox, kuvele ukuthi ama-moveblocks e-Qt asebenza kahle ukusuka ku-QSPI nge-framebuffer ku-SDRAM, futhi ibhodlela lalilingana ngqo nosayizi we-framebuffer! Ngokusobala, ukuze unqobe "umbukiso wesilayidi" wokuqala, ukusheshisa okuphindwe kabili kwakwanele ngenxa yokunciphisa ibhanali kusayizi wefreyimu. Kodwa kwakungenakwenzeka ukufeza umphumela onjalo ngokudlulisela kuphela ikhodi ye-Embox ezinkumbulo ezihlukahlukene ezisheshayo (i-speedup yayingeyona 2, kodwa izikhathi ezingaba ngu-2).
Ungazama kanjani ngokwakho
Uma une-STM32F7-Discovery, ungasebenzisa i-Qt ngaphansi kwe-Embox ngokwakho. Ungafunda ukuthi lokhu kwenziwa kanjani esihlokweni sethu
isiphetho
Ngenxa yalokho, sikwazile ukwethula i-Qt! Ubunkimbinkimbi bomsebenzi, ngokombono wethu, buyihaba ngandlela-thile. Ngokwemvelo, udinga ukunaka okucacisiwe kwama-microcontrollers futhi uqonde ngokujwayelekile ukwakheka kwezinhlelo zamakhompiyutha. Imiphumela yokuthuthukisa ikhomba eqinisweni elaziwayo lokuthi ibhodlela ohlelweni lwekhompiyutha akuyona iprosesa, kodwa inkumbulo.
Kulo nyaka sizohlanganyela emkhosini
Source: www.habr.com