Pòt Qt nan STM32

Pòt Qt nan STM32Bon apremidi Nou nan pwojè a Embox te lanse Qt sou STM32F7-Discovery epi li ta renmen pale sou li. Byen bonè, nou te deja di ki jan nou jere lanse OpenCV.

Qt se yon kad kwa-platfòm ki gen ladan non sèlman eleman grafik, men tou bagay tankou QtNetwork, yon seri klas pou travay ak baz done, Qt pou Automatisation (ki gen ladan pou aplikasyon IoT) ak plis ankò. Ekip Qt la te aktif sou itilizasyon Qt nan sistèm entegre, kidonk bibliyotèk yo byen configurable. Sepandan, jiska dènyèman, gen kèk moun ki te panse sou pòtaj Qt nan mikro, pwobableman paske yon travay sa a sanble difisil - Qt se gwo, MCU yo piti.

Nan lòt men an, nan moman sa a gen mikrokontwolè ki fèt pou travay ak miltimedya ak siperyè premye Pentiums yo. Apeprè yon ane de sa, blog la Qt parèt pòs. Devlopè yo te fè yon pò Qt pou eksplwatasyon RTEMS la, epi yo te lanse egzanp ak widgets sou plizyè tablo ki kouri stm32f7. Sa te enterese nou. Li te aparan, ak devlopè yo tèt yo ekri sou li, ke Qt se ralanti sou STM32F7-Discovery la. Nou t ap mande si nou ta ka kouri Qt anba Embbox, epi yo pa jis trase yon widget, men kouri yon animasyon.

Qt 4.8 te pote nan Embox pou yon tan long, se konsa nou deside eseye li sou li. Nou te chwazi aplikasyon moveblocks - yon egzanp animasyon springy.

Qt moveblocks sou QEMUPòt Qt nan STM32

Pou kòmanse, nou konfigirasyon Qt, si sa posib, ak seri minimòm eleman ki nesesè pou sipòte animasyon. Pou sa gen yon opsyon "-qconfig minim, ti, mwayen...". Li konekte yon fichye konfigirasyon soti nan Qt ak anpil makro - ki sa pou pèmèt / ki sa yo enfim. Apre opsyon sa a, nou ajoute lòt drapo nan konfigirasyon an si nou vle enfim yon lòt bagay. Isit la se yon egzanp nou konfigirasyon.

Pou Qt travay, ou bezwen ajoute yon kouch konpatibilite OS. Youn nan fason yo se aplike QPA (Qt Platform Abstraction). Nou te pran kòm yon baz plugin fb_base pare ki te enkli nan Qt, sou baz ki QPA pou Linux travay. Rezilta a se yon ti plugin ki rele emboxfb, ki bay Qt ak framebuffer Embbox a, epi li trase la san okenn èd deyò.

Sa a se sa ki kreye yon Plugin sanble

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

Ak sa a se sa redesen an pral sanble

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

Kòm yon rezilta, ak optimize a du pou gwosè memwa -Os pèmèt, imaj bibliyotèk la te tounen soti nan 3.5 MB, ki nan kou pa anfòm nan memwa prensipal la nan STM32F746 la. Kòm nou te deja ekri nan lòt atik nou an sou OpenCV, tablo sa a gen:

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

Depi sipò pou egzekite kòd ki soti nan QSPI te deja ajoute nan OpenCV, nou deside kòmanse pa chaje tout imaj la Embbox c Qt nan QSPI. Ak Hurray, tout bagay te kòmanse prèske imedyatman soti nan QSPI! Men, tankou nan ka a nan OpenCV, li te tounen soti ke li travay twò dousman.

Pòt Qt nan STM32

Se poutèt sa, nou deside fè li nan fason sa a - premye nou kopye imaj la nan QSPI, Lè sa a, chaje li nan SDRAM epi egzekite soti nan la. Soti nan SDRAM li te vin yon ti kras pi vit, men li toujou lwen QEMU.

Pòt Qt nan STM32

Apre sa, te gen yon lide yo enkli yon pwen k ap flote - apre tout, Qt fè kèk kalkil nan kowòdone yo nan kare nan animasyon. Nou te eseye, men isit la nou pa t 'jwenn okenn akselerasyon vizib, byenke nan Atik Devlopè Qt te deklare ke FPU bay yon ogmantasyon siyifikatif nan vitès pou "trenen animasyon" sou ekran tactile. Ka gen siyifikativman mwens kalkil k ap flote nan moveblocks, e sa depann de egzanp espesifik la.

Lide ki pi efikas se te deplase framebuffer la soti nan SDRAM nan memwa entèn. Pou fè sa, nou te fè dimansyon ekran yo pa 480x272, men 272x272. Nou menm tou nou bese pwofondè koulè soti nan A8R8G8B8 a R5G6B5, kidonk diminye gwosè a nan yon pixel soti nan 4 a 2 bytes. Gwosè framebuffer ki kapab lakòz se 272 * 272 * 2 = 147968 octets. Sa a te bay yon akselerasyon enpòtan, petèt pi notables, animasyon an te vin prèske lis.

Dènye optimize a se te kouri kòd Embbox soti nan RAM ak kòd Qt soti nan SDRAM. Pou fè sa, nou premye, kòm dabitid, estatikman lyen Embbox ansanm ak Qt, men nou mete tèks, rodata, done ak segman bss nan bibliyotèk la nan QSPI nan lòd yo Lè sa a, kopye li nan 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))

Lè nou egzekite kòd Embbox soti nan ROM, nou menm tou nou te resevwa yon akselerasyon aparan. Kòm yon rezilta, animasyon an te byen lis:

Jwe videyo

Nan fen a anpil, pandan y ap prepare atik la ak ap eseye diferan konfigirasyon Embbox, li te tounen soti ke Qt moveblocks travay gwo soti nan QSPI ak yon framebuffer nan SDRAM, ak kou boutèy la te jisteman gwosè a nan framebuffer la! Aparamman, simonte premye "slideshow la", yon akselerasyon 2-pliye te ase akòz yon rediksyon ordinèr nan gwosè a nan framebuffer la. Men, li pa t 'posib reyalize yon rezilta sa yo pa transfere sèlman kòd la Embbox nan plizyè souvni rapid (akselerasyon an pa t' 2, men apeprè 1.5 fwa).

Ki jan yo eseye li tèt ou

Si ou gen yon STM32F7-Discovery, ou ka kouri Qt anba Embbox tèt ou. Ou ka li kijan sa fèt sou nou wiki.

Konklizyon

Kòm yon rezilta, nou jere lanse Qt! Konpleksite travay la, nan opinyon nou an, se yon ti jan ekzajere. Natirèlman, ou bezwen pran an kont spesifik yo nan mikrokontwolè epi jeneralman konprann achitekti a nan sistèm òdinatè. Rezilta optimize yo montre lefèt ke goudwon ​​nan yon sistèm informatique se pa processeur a, men memwa a.

Ane sa a nou pral patisipe nan festival la TechTrain. La nou pral di w an plis detay epi montre Qt, OpenCV sou mikrokontwolè ak lòt reyalizasyon nou yo.

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster