Kutakura Qt kune STM32

Kutakura Qt kune STM32Masikati akanaka Isu tiri muchirongwa Embox yakatanga Qt paSTM32F7-Discovery uye ingada kutaura nezvazvo. Pakutanga, takambotaura kuti takakwanisa sei kutanga OpenCV.

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 post. Vagadziri vakagadzira chiteshi cheQt cheRTEMS OS, uye vakatanga mienzaniso ine majeti pamabhodhi akati wandei anomhanya stm32f7. Izvi zvakatifadza. Zvaionekwa, uye vanogadzira ivo pachavo vanonyora nezvazvo, kuti Qt inononoka pane STM32F7-Discovery. Isu tainetseka kana taigona kumhanya Qt pasi peEmbox, uye kwete kungodhirowa widget, asi mhanyisa animation.

Qt 4.8 yakatakurwa kuEmbox kwenguva yakareba, saka takafunga kuiedza pairi. Isu takasarudza iyo moveblocks application - muenzaniso we springy animation.

Qt zvivharo paQEMUKutakura Qt kune STM32

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 kugadzirisa.

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.

Kutakura Qt kune STM32

Naizvozvo, isu takafunga kuzviita nenzira iyi - kutanga tinokopa mufananidzo kuQSPI, tozouisa muSDRAM uye toita kubva ipapo. Kubva kuSDRAM yakakurumidza kukurumidza, asi ichiri kure neQEMU.

Kutakura Qt kune STM32

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 chinyorwa Vagadziri veQt vakati FPU inopa kuwedzera kukuru kwekumhanya kwe "kukweva mifananidzo" pane yekubata-bata. Panogona kunge paine mashoma mashoma anoyangarara mapoinzi kuverenga mumabhuroka, uye izvi zvinoenderana nemuenzaniso chaiwo.

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 wiki.

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 Vadivelu Comedy TechTrain. Ikoko tichakuudza zvakadzama uye kuratidza Qt, OpenCV pane microcontrollers uye zvimwe zvatinowana.

Source: www.habr.com

Voeg