Pag-port sa Qt sa STM32

Pag-port sa Qt sa STM32Maayong hapon Naa mi sa project Embox gilansad ang Qt sa STM32F7-Discovery ug gusto nga hisgutan kini. Sa sayo pa, gisulti na namo kung giunsa namo paglansad OpenCV.

Ang Qt usa ka cross-platform framework nga naglakip dili lamang sa mga graphical nga mga sangkap, apan usab sa mga butang sama sa QtNetwork, usa ka hugpong sa mga klase alang sa pagtrabaho sa mga database, Qt alang sa Automation (lakip na ang pagpatuman sa IoT) ug daghan pa. Ang grupo sa Qt nahimong aktibo bahin sa paggamit sa Qt sa mga naka-embed nga sistema, mao nga ang mga librarya medyo ma-configure. Bisan pa, hangtod karon, pipila ka mga tawo ang naghunahuna bahin sa pag-port sa Qt sa mga microcontroller, tingali tungod kay ang ingon nga buluhaton daw lisud - ang Qt dako, ang mga MCU gamay.

Sa laing bahin, sa pagkakaron adunay mga microcontroller nga gidisenyo aron magtrabaho uban sa multimedia ug labaw sa unang mga Pentium. Mga usa ka tuig ang milabay, ang Qt blog nagpakita post. Ang mga developers naghimo sa usa ka pantalan sa Qt alang sa RTEMS OS, ug naglunsad sa mga panig-ingnan uban sa mga widgets sa pipila ka mga tabla nga nagdagan stm32f7. Kini nakapainteres kanamo. Namatikdan, ug ang mga developer mismo ang nagsulat bahin niini, nga ang Qt hinay sa STM32F7-Discovery. Naghunahuna kami kung makadagan ba kami sa Qt sa ilawom sa Embox, ug dili lang magdrowing og widget, apan magpadagan usa ka animation.

Ang Qt 4.8 dugay nang gi-port sa Embox, mao nga nakahukom kami nga sulayan kini. Gipili namo ang aplikasyon sa moveblocks - usa ka pananglitan sa springy animation.

Qt moveblocks sa QEMUPag-port sa Qt sa STM32

Sa pagsugod, among gi-configure ang Qt, kung mahimo, nga adunay minimum nga set sa mga sangkap nga gikinahanglan aron suportahan ang animation. Alang niini adunay kapilian nga "-qconfig minimal, gamay, medium ...". Nagkonektar kini sa usa ka file sa pag-configure gikan sa Qt nga adunay daghang mga macro - kung unsa ang mahimo / kung unsa ang pag-disable. Pagkahuman niini nga kapilian, gidugang namon ang ubang mga bandila sa pag-configure kung gusto namon nga dili paganahon ang usa pa ka butang. Ania ang usa ka pananglitan sa among configuration.

Aron magtrabaho ang Qt, kinahanglan nimo nga idugang ang layer sa pagpahiangay sa OS. Usa ka paagi mao ang pagpatuman sa QPA (Qt Platform Abstraction). Gikuha namo isip basehan ang andam nga fb_base nga plugin nga gilakip sa Qt, base sa kung asa ang QPA para sa Linux nagtrabaho. Ang resulta usa ka gamay nga plugin nga gitawag og emboxfb, nga naghatag sa Qt sa Embox's framebuffer, ug dayon kini nagdrowing didto nga wala’y tabang sa gawas.

Kini ang hitsura sa paghimo sa usa ka 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();
}

Ug mao kini ang hitsura sa pag-redrawing

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

Ingon usa ka sangputanan, sa pag-optimize sa compiler alang sa gidak-on sa memorya -Os, ang imahe sa librarya nahimo nga 3.5 MB, nga siyempre dili mohaum sa panguna nga panumduman sa STM32F746. Sama sa gisulat na namo sa among uban nga artikulo bahin sa OpenCV, kini nga board adunay:

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

Tungod kay ang suporta alang sa pagpatuman sa code gikan sa QSPI gidugang na sa OpenCV, nakahukom kami nga magsugod pinaagi sa pagkarga sa tibuok Embox c Qt nga larawan ngadto sa QSPI. Ug hurray, nagsugod ang tanan hapit dayon gikan sa QSPI! Apan sama sa kaso sa OpenCV, kini nahimo nga hinay kaayo.

Pag-port sa Qt sa STM32

Busa, nakahukom kami nga buhaton kini niining paagiha - una among kopyahon ang imahe sa QSPI, dayon i-load kini sa SDRAM ug ipatuman gikan didto. Gikan sa SDRAM kini nahimong mas paspas, apan layo gihapon sa QEMU.

Pag-port sa Qt sa STM32

Sunod, adunay usa ka ideya nga maglakip sa usa ka naglutaw nga punto - pagkahuman, ang Qt naghimo sa pipila ka mga kalkulasyon sa mga koordinasyon sa mga kwadro sa animation. Gisulayan namon, apan dinhi wala kami makakuha bisan unsang makita nga pagpatulin, bisan kung sa artikulo Giangkon sa mga developer sa Qt nga ang FPU naghatag usa ka hinungdanon nga pagtaas sa katulin alang sa "pag-drag sa animation" sa touchscreen. Mahimong adunay labi ka gamay nga pagkalkula sa floating point sa mga moveblock, ug kini nagdepende sa piho nga pananglitan.

Ang labing epektibo nga ideya mao ang pagbalhin sa framebuffer gikan sa SDRAM ngadto sa internal memory. Aron mahimo kini, gihimo namon ang mga sukat sa screen nga dili 480x272, apan 272x272. Gipaubos usab namo ang giladmon sa kolor gikan sa A8R8G8B8 ngadto sa R5G6B5, sa ingon gipakunhod ang gidak-on sa usa ka pixel gikan sa 4 ngadto sa 2 bytes. Ang resulta nga gidak-on sa framebuffer mao ang 272 * 272 * 2 = 147968 bytes. Naghatag kini usa ka hinungdanon nga pagpatulin, tingali labing namatikdan, ang animation nahimong hapit hapsay.

Ang pinakabag-o nga pag-optimize mao ang pagpadagan sa Embox code gikan sa RAM ug Qt code gikan sa SDRAM. Sa pagbuhat niini, kita una, sama sa naandan, statically link Embox uban sa Qt, apan gibutang namo ang teksto, rodata, data ug bss bahin sa librarya sa QSPI aron unya kopyahon kini sa 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))

Pinaagi sa pagpatuman sa Embox code gikan sa ROM, nakadawat usab kami usa ka mamatikdan nga pagpatulin. Ingon usa ka sangputanan, ang animation nahimo nga hapsay:


Sa katapusan, samtang giandam ang artikulo ug gisulayan ang lainlaing mga pag-configure sa Embox, nahibal-an nga ang mga Qt moveblocks nagtrabaho nga maayo gikan sa QSPI nga adunay framebuffer sa SDRAM, ug ang bottleneck tukma nga gidak-on sa framebuffer! Dayag, aron mabuntog ang inisyal nga "slideshow", ang usa ka 2-pilo nga pagpadali igo na tungod sa usa ka banal nga pagkunhod sa gidak-on sa framebuffer. Apan dili posible nga makab-ot ang ingon nga resulta pinaagi sa pagbalhin lamang sa Embox code sa lainlaing paspas nga mga panumduman (ang pagpatulin dili 2, apan mga 1.5 ka beses).

Sa unsa nga paagi sa pagsulay niini sa imong kaugalingon

Kung ikaw adunay STM32F7-Discovery, mahimo nimong ipadagan ang Qt ubos sa Embox sa imong kaugalingon. Mahimo nimo mabasa kung giunsa kini gihimo sa among wiki.

konklusyon

Ingon usa ka sangputanan, nakahimo kami sa paglansad sa Qt! Ang pagkakomplikado sa buluhaton, sa among opinyon, medyo gipasobrahan. Siyempre, kinahanglan nimo nga tagdon ang mga detalye sa mga microcontroller ug sa kasagaran masabtan ang arkitektura sa mga sistema sa kompyuter. Ang mga resulta sa pag-optimize nagpunting sa nahibal-an nga kamatuoran nga ang bottleneck sa usa ka sistema sa kompyuter dili ang processor, apan ang memorya.

Karong tuiga moapil mi sa pista TechTrain. Didto isulti namo kanimo ang mas detalyado ug ipakita ang Qt, OpenCV sa mga microcontroller ug uban pa namon nga mga nahimo.

Source: www.habr.com

Idugang sa usa ka comment