U soo dejinta Qt ilaa STM32

U soo dejinta Qt ilaa STM32Galab wanaagsan Waxaan ku jirnaa mashruuca Ebox-ka bilaabay Qt on STM32F7-Discovery oo jeclaan lahaa inaan ka hadlo. Hadda ka hor, waxaan horay u sheegnay sida aan ugu suurtagashay in aan bilowno OpenCV.

Qt waa qaab dhismeed iskutallaab ah oo ay ku jiraan ma aha oo kaliya qaybaha garaafyada, laakiin sidoo kale waxyaabo ay ka mid yihiin QtNetwork, qaybo ka mid ah fasallada ka shaqeynta xogta, Qt for Automation (oo ay ku jiraan hirgelinta IoT) iyo waxyaabo kaloo badan. Kooxda Qt waxay ka fir-fircoonaayeen isticmaalka Qt ee nidaamyada ku-xidhan, sidaa darteed maktabaduhu waa kuwo la habeyn karo. Si kastaba ha ahaatee, ilaa wakhti dhow, dad yar ayaa ka fikiray in Qt loo geeyo microcontrollers, malaha sababtoo ah hawshan ayaa u muuqata mid adag - Qt waa weyn yahay, MCU-yadu waa yar yihiin.

Dhanka kale, wakhtigan xaadirka ah waxaa jira microcontrollers oo loogu talagalay inay ku shaqeeyaan multimedia oo ka sarreeya Pentium-yada ugu horreeya. Qiyaastii hal sano ka hor, blog-ka Qt ayaa soo muuqday dhajin. Horumariyayaashu waxay u sameeyeen deked Qt ah RTEMS OS, waxayna bilaabeen tusaalayaal leh widget-yo dhowr ah oo ku shaqeeya stm32f7. Tani waa noo xiiso. Waxay ahayd mid la dareemi karo, oo horumariyayaashu ay iyagu wax ka qoraan, in Qt uu yahay mid gaabis ah STM32F7-Discovery. Waxaan la yaabnay haddii aan ku maamuli karno Qt hoosta Embox, oo aan kaliya sawirin widget, laakiin aan wadno animation.

Qt 4.8 waxaa loo soo raray Embox muddo dheer, marka waxaan go'aansanay inaan isku dayno. Waxaan dooranay codsiga dhaqdhaqaaqa dhaqdhaqaaqa - tusaale ahaan animation guga.

Qt waxay xannibaysaa QEMUU soo dejinta Qt ilaa STM32

Si aan ku bilowno, waxaan u habeyneynaa Qt, haddii ay suurtagal tahay, iyadoo la adeegsanayo qaybaha ugu yar ee loo baahan yahay si loo taageero animation. Tan waxaa jira ikhtiyaar "-qconfig minimal, yar, dhexdhexaad..." Waxay ku xidhaa faylka qaabeynta ee Qt oo leh macros badan - waxa la awoodo / waxa la joojiyo. Doorashadan ka dib, waxaan ku darnaa calamo kale qaabeynta haddii aan rabno inaan joojino shay kale. Waa kan tusaale noo ah habaynta.

Si Qt u shaqeeyo, waxaad u baahan tahay inaad ku darto lakabka ku habboon OS. Hal dariiqo ayaa ah in la hirgeliyo QPA (Qt Platform Abstraction). Waxaan u qaadanay aasaaska fb_base plugin ee diyaarsan ee lagu daray Qt, taas oo ku saleysan QPA ee Linux u shaqeyso. Natiijadu waa plugin yar oo loo yaqaan emboxfb, kaas oo siinaya Qt qaab-dhismeedka Embox, ka dibna halkaas ayuu ku sawiraa iyada oo aan wax caawimo dibadda ah.

Tani waa waxa abuurista plugin u eg

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();
}

Tanina waa sida dib-u-qaabayntu u ekaan doonto

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;
}

Natiijo ahaan, iyada oo la hagaajinayo isku-darka cabbirka xusuusta -Os, sawirka maktabadda wuxuu noqday 3.5 MB, kaas oo dabcan aan ku habboonayn xusuusta ugu weyn ee STM32F746. Sida aan horey ugu soo qornay maqaalkeena kale ee ku saabsan OpenCV, guddigani wuxuu leeyahay:

  • 1 MB ROM
  • 320 KB RAM
  • 8 MB SDRAM
  • 16 MB QSPI

Maadaama taageerada fulinta koodka QSPI mar hore lagu daray OpenCV, waxaan go'aansanay inaan ku bilowno inaan ku shubno dhammaan sawirka Embox c Qt QSPI. Oo hurray, wax walba waxay isla markiiba ka bilaabeen QSPI! Laakin sida kiiska OpenCV, waxaa soo baxday in uu si tartiib tartiib ah u shaqeeyo.

U soo dejinta Qt ilaa STM32

Sidaa darteed, waxaan go'aansanay inaan sidan u sameyno - marka hore waxaan ku koobiyeynaa sawirka QSPI, ka dibna ku dheji SDRAM oo aan ka fulineyno halkaas. Laga soo bilaabo SDRAM waxay noqotay wax yar ka dheereeya, laakiin wali way ka fog tahay QEMU.

U soo dejinta Qt ilaa STM32

Marka xigta, waxaa jiray fikrad ah in lagu daro barta sabayn - ka dib oo dhan, Qt wuxuu sameeyaa xisaabinta qaar ka mid ah isku-duwayaasha labajibbaaran ee animation. Waanu isku daynay, laakiin halkan kamaanaan helin wax dardargelin ah, inkasta oo gudaha maqaal Horumarinta Qt waxay sheegteen in FPU ay si weyn u kordhiso xawaaraha "jiidista animation" shaashadda taabashada. Waxaa laga yaabaa inay si aad ah u yaraato xisaabinta barta sabaynta ee meelaha dhaqaaqa, tani waxay ku xidhan tahay tusaalaha gaarka ah.

Fikradda ugu waxtarka badan waxay ahayd in laga raro framebuffer SDRAM loona wareejiyo xusuusta gudaha. Si tan loo sameeyo, waxaanu samaynay cabbirada shaashadda ma 480x272, laakiin 272x272. Waxaan sidoo kale hoos u dhignay qoto dheeraanta midabka A8R8G8B8 ilaa R5G6B5, sidaas darteed hoos u dhigista cabbirka hal pixel min 4 ilaa 2 bytes. Cabbirka framebuffer ee ka dhashay waa 272 * 272 * 2 = 147968 bytes. Tani waxay siisay dardargelin la taaban karo, laga yaabee sida ugu macquulsan, animation-ku wuxuu noqday ku dhawaad ​​siman.

Hagaajinta ugu dambeysay waxay ahayd in laga wado koodhka Embox ee RAM iyo koodhka Qt ee SDRAM. Si tan loo sameeyo, waxaan marka hore, sida caadiga ah, si istiic ah ugu xidhidha Embox iyo Qt, laakiin waxaan dhignaa qoraalka, rodata, xogta iyo qaybaha bss ee maktabadda gudaha QSPI si aan markaas ugu koobiyno 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))

Markaan fulinayno summada Embox-ka ROM-ka, waxaan sidoo kale helnay dardargelin muuqata. Natiijo ahaan, animation-ku wuxuu noqday mid sahlan:


Dhammaadkii, intaad diyaarinaysay maqaalka oo aad isku dayaysay qaabab kala duwan oo Embox ah, waxaa soo baxday in dhaqdhaqaaqa Qt uu si weyn uga shaqeeyo QSPI oo leh framebuffer gudaha SDRAM, iyo dhalooyinku waxay si sax ah u ahaayeen cabbirka framebuffer! Sida muuqata, si looga adkaado "slideshow" bilawga ah, 2-laab dardargelinta ayaa ku filan sababtoo ah dhimista banal ee cabbirka framebuffer. Laakiin suurtagal ma ahayn in la gaaro natiijadan oo kale iyada oo loo wareejinayo kaliya code Embox xusuuso kala duwan oo degdeg ah (dardargelintu ma ahayn 2, laakiin qiyaastii 1.5 jeer).

Sida loo tijaabiyo naftaada

Haddii aad haysato STM32F7-Discovery, waxaad adigu ku dhex mari kartaa Qt hoosta Embox. Waxaad akhrin kartaa sida tan loo sameeyo annaga wiki.

gunaanad

Natiijo ahaan, waxaan ku guuleysanay inaan bilowno Qt! Kakanaanta hawsha, ra'yigeenna, waa xoogaa la buunbuuniyay. Dabcan, waxaad u baahan tahay inaad tixgeliso waxyaabaha gaarka ah ee microcontrollers oo aad guud ahaan fahamto qaab dhismeedka nidaamyada kombiyuutarka. Natiijooyinka wanaajinta waxay tilmaamayaan xaqiiqada caanka ah ee ah in cidhiidhiga ku jira nidaamka kombuyuutarku aanu ahayn processor-ka, laakiin xusuusta.

Sannadkan waxaan ka qayb qaadan doonnaa xafladda TechTrain. Halkaas waxaan kuugu sheegi doonaa si faahfaahsan waxaana ku tusi doonaa Qt, OpenCV on microcontrollers iyo guulahayaga kale.

Source: www.habr.com

Add a comment