Labdien MÄs esam projektÄ
Qt ir starpplatformu sistÄma, kas ietver ne tikai grafiskos komponentus, bet arÄ« tÄdas lietas kÄ QtNetwork, klaÅ”u kopu darbam ar datu bÄzÄm, Qt automatizÄcijai (tostarp IoT ievieÅ”anai) un daudz ko citu. Qt komanda ir aktÄ«vi izmantojusi Qt iegultÄs sistÄmÄs, tÄpÄc bibliotÄkas ir diezgan konfigurÄjamas. TomÄr vÄl nesen retais domÄja par Qt pÄrneÅ”anu uz mikrokontrolleriem, iespÄjams, tÄpÄc, ka Å”Äds uzdevums Ŕķiet grÅ«ts - Qt ir liels, MCU ir mazi.
No otras puses, Å”obrÄ«d ir mikrokontrolleri, kas paredzÄti darbam ar multimediju un ir labÄki par pirmajiem Pentiums. ApmÄram pirms gada parÄdÄ«jÄs Qt emuÄrs
Qt 4.8 jau ilgu laiku ir pÄrnests uz Embox, tÄpÄc mÄs nolÄmÄm to izmÄÄ£inÄt. IzvÄlÄjÄmies aplikÄciju moveblocks ā atsperÄ«gas animÄcijas piemÄru.
Qt pÄrvietoÅ”anas bloki QEMU
SÄkumÄ mÄs konfigurÄjam Qt, ja iespÄjams, ar minimÄlo komponentu komplektu, kas nepiecieÅ”ams animÄcijas atbalstam. Å im nolÅ«kam ir opcija ā-qconfig minimÄls, mazs, vidÄjs...ā. Tas savieno Qt konfigurÄcijas failu ar daudziem makro - ko iespÄjot / ko atspÄjot. PÄc Ŕīs opcijas mÄs konfigurÄcijai pievienojam citus karogus, ja vÄlamies atspÄjot kaut ko citu. Å eit ir mÅ«su piemÄrs
Lai Qt darbotos, jÄpievieno OS saderÄ«bas slÄnis. Viens no veidiem ir ieviest QPA (Qt Platform Abstraction). Par pamatu ÅÄmÄm Qt iekļauto gatavo fb_base spraudni, uz kura pamata darbojas QPA for Linux. RezultÄts ir neliels spraudnis ar nosaukumu emboxfb, kas nodroÅ”ina Qt ar Embox kadru buferi, un pÄc tam tas tiek zÄ«mÄts bez jebkÄdas ÄrÄjas palÄ«dzÄ«bas.
Å Ädi izskatÄs spraudÅa izveide
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();
}
Un Å”Ädi izskatÄ«sies pÄrzÄ«mÄjums
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;
}
RezultÄtÄ, ja ir iespÄjota kompilatora optimizÄcija atmiÅas izmÄram -Os, bibliotÄkas attÄls izrÄdÄ«jÄs 3.5 MB, kas, protams, neietilpst STM32F746 galvenajÄ atmiÅÄ. KÄ mÄs jau rakstÄ«jÄm citÄ mÅ«su rakstÄ par OpenCV, Å”ajÄ panelÄ« ir:
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
TÄ kÄ OpenCV jau ir pievienots QSPI koda izpildes atbalsts, mÄs nolÄmÄm sÄkt, ielÄdÄjot visu Embox c Qt attÄlu QSPI. Un urrÄ, viss sÄkÄs gandrÄ«z uzreiz no QSPI! Bet, tÄpat kÄ OpenCV gadÄ«jumÄ, izrÄdÄ«jÄs, ka tas darbojas pÄrÄk lÄni.
TÄpÄc mÄs nolÄmÄm to darÄ«t Å”Ädi - vispirms nokopÄjam attÄlu uz QSPI, pÄc tam ielÄdÄjam to SDRAM un izpildÄm no turienes. No SDRAM tas kļuva nedaudz ÄtrÄks, taÄu joprojÄm ir tÄlu no QEMU.
TÄlÄk radÄs doma iekļaut peldoÅ”o komatu - galu galÄ Qt veic dažus kvadrÄtu koordinÄtu aprÄÄ·inus animÄcijÄ. MÄÄ£inÄjÄm, bet Å”eit nekÄdu redzamu paÄtrinÄjumu nesaÅÄmÄm, kaut gan iekÅ”Ä
VisefektÄ«vÄkÄ ideja bija pÄrvietot kadru buferi no SDRAM uz iekÅ”Äjo atmiÅu. Lai to izdarÄ«tu, mÄs izveidojÄm ekrÄna izmÄrus nevis 480x272, bet gan 272x272. MÄs arÄ« samazinÄjÄm krÄsu dziļumu no A8R8G8B8 uz R5G6B5, tÄdÄjÄdi samazinot viena pikseļa izmÄru no 4 lÄ«dz 2 baitiem. IegÅ«tais kadru bufera lielums ir 272 * 272 * 2 = 147968 baiti. Tas deva ievÄrojamu paÄtrinÄjumu, iespÄjams, visievÄrojamÄk, animÄcija kļuva gandrÄ«z vienmÄrÄ«ga.
PÄdÄjÄ optimizÄcija bija palaist Embox kodu no RAM un Qt kodu no SDRAM. Lai to izdarÄ«tu, mÄs vispirms, kÄ parasti, statiski saistÄm Embox kopÄ ar Qt, bet bibliotÄkas tekstu, rodata, datu un bss segmentus ievietojam QSPI, lai pÄc tam kopÄtu to uz 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))
Izpildot Embox kodu no ROM, mÄs arÄ« saÅÄmÄm ievÄrojamu paÄtrinÄjumu. RezultÄtÄ animÄcija izrÄdÄ«jÄs diezgan gluda:
PaÅ”Äs beigÄs, gatavojot rakstu un izmÄÄ£inot dažÄdas Embox konfigurÄcijas, atklÄjÄs, ka Qt moveblocks lieliski strÄdÄ no QSPI ar kadru buferi SDRAM, un pudeles kakls bija tieÅ”i kadru bufera izmÄrs! AcÄ«mredzot, lai pÄrvarÄtu sÄkotnÄjo āslaidrÄdiā, pietika ar 2-kÄrtÄ«gu paÄtrinÄjumu, jo tika banÄls kadru bufera lieluma samazinÄjums. Bet Å”Ädu rezultÄtu nebija iespÄjams sasniegt, pÄrsÅ«tot tikai Embox kodu uz dažÄdÄm ÄtrajÄm atmiÅÄm (paÄtrinÄjums bija nevis 2, bet apmÄram 1.5 reizes).
KÄ paÅ”am izmÄÄ£inÄt
Ja jums ir STM32F7-Discovery, varat pats palaist Qt sadaÄ¼Ä Embox. KÄ tas tiek darÄ«ts, varat lasÄ«t mÅ«su vietnÄ
SecinÄjums
RezultÄtÄ mums izdevÄs palaist Qt! Uzdevuma sarežģītÄ«ba, mÅ«suprÄt, ir nedaudz pÄrspÄ«lÄta. Protams, jums ir jÄÅem vÄrÄ mikrokontrolleru specifika un vispÄrÄji jÄsaprot datorsistÄmu arhitektÅ«ra. OptimizÄcijas rezultÄti norÄda uz labi zinÄmo faktu, ka skaitļoÅ”anas sistÄmas saÅ”aurinÄjums nav procesors, bet gan atmiÅa.
Å ogad piedalÄ«simies festivÄlÄ
Avots: www.habr.com