Masikati akanaka Isu tiri muchirongwa
Qt is a cross-platform framework iyo inosanganisira kwete chete graphical components, asiwo zvinhu zvakadai seQtNetwork, seti yemakirasi ekushanda nemadhatabhesi, Qt yeAutomation (inosanganisira yeIoT kuita) nezvimwe zvakawanda. Chikwata cheQt chave kuita zvekushandisa Qt mumasisitimu akaiswa, saka maraibhurari anogona kurongeka. Nekudaro, kusvika nguva pfupi yadarika, vanhu vashoma vakafunga nezve kuendesa Qt kune microcontrollers, pamwe nekuti basa rakadaro rinoita serakaoma - Qt yakakura, MCU idiki.
Kune rumwe rutivi, panguva ino kune microcontrollers yakagadzirirwa kushanda nemultimedia uye yepamusoro kune yekutanga Pentiums. Rinenge gore rapfuura, Qt blog yakaonekwa
Qt 4.8 yakatakurwa kuEmbox kwenguva yakareba, saka takafunga kuiedza pairi. Isu takasarudza iyo moveblocks application - muenzaniso we springy animation.
Qt zvivharo paQEMU
Kutanga, isu tinogadzirisa Qt, kana zvichibvira, neiyo shoma seti yezvikamu zvinodiwa kutsigira animation. Kune izvi pane sarudzo "-qconfig shoma, diki, yepakati ...". Iyo inobatanidza faira yekumisikidza kubva kuQt ine akawanda macros - chii chekugonesa / chii chekudzima. Mushure meiyi sarudzo, isu tinowedzera mamwe mireza kune iyo gadziriso kana isu tichida kudzima chimwe chinhu. Heino muenzaniso wedu
Kuti Qt ishande, unofanirwa kuwedzera OS inoenderana layer. Imwe nzira ndeyekushandisa QPA (Qt Platform Abstraction). Isu takatora sehwaro iyo yakagadzirira-yakagadzirwa fb_base plugin inosanganisirwa muQt, pahwaro hweiyo QPA yeLinux inoshanda. Mhedzisiro idiki plugin inonzi emboxfb, inopa Qt neEmbox's framebuffer, yobva yakwevera ipapo pasina rubatsiro rwekunze.
Izvi ndizvo zvinoita kugadzira 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 (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();
}
Uye izvi ndizvo zvichaita kudhirowazve
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;
}
Nekuda kweizvozvo, neiyo compiler optimization yehukuru hwendangariro -Os yakagoneswa, iyo raibhurari mufananidzo wakave 3.5 MB, izvo zvisingaenderane mundangariro huru yeSTM32F746. Sezvatakatonyora mune chimwe chinyorwa chedu nezve OpenCV, bhodhi iri rine:
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
Sezvo rutsigiro rwekuita kodhi kubva kuQSPI yatowedzerwa kuOpenCV, takafunga kutanga nekurodha iyo yese Embox c Qt mufananidzo muQSPI. Uye hurray, zvese zvakatanga nekukurumidza kubva kuQSPI! Asi sezvazvakaita kune OpenCV, zvakazoitika kuti inoshanda zvishoma nezvishoma.
Naizvozvo, isu takafunga kuzviita nenzira iyi - kutanga tinokopa mufananidzo kuQSPI, tozouisa muSDRAM uye toita kubva ipapo. Kubva kuSDRAM yakakurumidza kukurumidza, asi ichiri kure neQEMU.
Tevere, pakanga paine zano rekubatanidza nzvimbo inoyangarara - shure kwezvose, Qt inoita mamwe maverengero ezvirongwa zvemasikweya muanimation. Takaedza, asi pano hatina kuwana chero kukurumidza kunooneka, kunyangwe mukati
Iro zano rainyanya kushanda raive rekufambisa iyo framebuffer kubva kuSDRAM kuenda mukati mendangariro. Kuti tiite izvi, takagadzira zviyero kwete 480x272, asi 272x272. Isu takadzikisawo kudzika kwemavara kubva kuA8R8G8B8 kuenda kuR5G6B5, nokudaro tichidzikisa saizi yepikisi imwe kubva pa4 kusvika ku2 bytes. Iyo inokonzeresa framebuffer size ndeye 272 * 272 * 2 = 147968 bytes. Izvi zvakapa kukwidziridzwa kwakakosha, pamwe zvinonyanya kuoneka, iwo animation yakave yakatsetseka.
Iyo yazvino optimization yaive yekumhanyisa Embox kodhi kubva RAM uye Qt kodhi kubva SDRAM. Kuti tiite izvi, isu tinotanga, senguva dzose, tinobatanidza Embox pamwe chete neQt, asi tinoisa zvinyorwa, rodata, data uye bss zvikamu zveraibhurari muQSPI kuitira kuti tizoikopa kuSDRAM.
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))
Nekuita iyo Embox kodhi kubva kuROM, isu takagamuchirawo kukurumidza kunooneka. Nekuda kweizvozvo, iyo animation yakave yakapfava:
Pakupedzisira, tichigadzira chinyorwa uye kuyedza zvigadziriso zvakasiyana zveEmbox, zvakazoitika kuti Qt mafambiro anoshanda zvikuru kubva kuQSPI ine furemu muSDRAM, uye iyo bhodhoro yaive saizi chaiyo yeframebuffer! Sezviri pachena, kukunda yekutanga "slideshow", 2-kupeta kukurumidza kwakaringana nekuda kwekuderedzwa kwebhanari muhukuru hweframebuffer. Asi zvakange zvisingaite kuwana mhedzisiro yakadaro nekuendesa chete Embox kodhi kune dzakasiyana siyana dzekurangarira (kukwidziridza kwanga kusiri 2, asi kanenge ka1.5).
Ungazviedza sei iwe pachako
Kana iwe uine STM32F7-Discovery, unogona kumhanya Qt pasi Embox iwe pachako. Unogona kuverenga kuti izvi zvinoitwa sei pane yedu
mhedziso
Nekuda kweizvozvo, takakwanisa kuburitsa Qt! Kuoma kwebasa racho, mumaonero edu, kunoti kuwedzeredza. Nomuzvarirwo, iwe unofanirwa kufunga nezve izvo zve microcontrollers uye kazhinji kunzwisisa magadzirirwo emakombuta masisitimu. Mhedzisiro yemhedzisiro inonongedzera kune inosanozivikanwa chokwadi chekuti bhodhoro mukombuta system haisi iyo processor, asi ndangariro.
Gore rino tichapinda mumutambo
Source: www.habr.com