Kutumiza Qt ku STM32

Kutumiza Qt ku STM32Masana abwino Tili mu polojekiti Emboks adayambitsa Qt pa STM32F7-Discovery ndipo akufuna kulankhula za izo. M'mbuyomu, tanena kale momwe tidakwanitsa kukhazikitsa OpenCV.

Qt ndi nsanja yolumikizirana yomwe imaphatikizapo osati zigawo zojambulidwa zokha, komanso zinthu monga QtNetwork, gulu la makalasi ogwirira ntchito ndi databases, Qt for Automation (kuphatikiza kukhazikitsa kwa IoT) ndi zina zambiri. Gulu la Qt lakhala likuchitapo kanthu pakugwiritsa ntchito Qt pamakina ophatikizidwa, kotero kuti malaibulale ndi osinthika. Komabe, mpaka posachedwa, anthu ochepa adaganiza zotengera Qt kwa ma microcontrollers, mwina chifukwa ntchito yotereyi ikuwoneka yovuta - Qt ndi yayikulu, ma MCU ndi ochepa.

Kumbali inayi, pakadali pano pali ma microcontrollers opangidwa kuti azigwira ntchito ndi ma multimedia komanso apamwamba kuposa ma Pentium oyamba. Pafupifupi chaka chapitacho, blog ya Qt idawonekera positi. Madivelopa adapanga doko la Qt la RTEMS OS, ndikuyambitsa zitsanzo zokhala ndi ma widget pama board angapo omwe akuthamanga stm32f7. Zimenezi zinatisangalatsa. Zinali zoonekeratu, ndipo opanga okha amalemba za izo, kuti Qt imachedwa pa STM32F7-Discovery. Tinkadabwa ngati titha kuyendetsa Qt pansi pa Embox, osati kungojambula widget, koma kuyendetsa makanema.

Qt 4.8 yatumizidwa ku Embox kwa nthawi yayitali, chifukwa chake tinaganiza zoyesera. Tidasankha ma moveblocks application - chitsanzo cha makanema ojambula pamadzi.

Qt imasuntha pa QEMUKutumiza Qt ku STM32

Poyamba, timakonza Qt, ngati n'kotheka, ndi magawo ochepa omwe amafunikira kuti athandizire makanema ojambula. Pa izi pali njira "-qconfig yochepa, yaying'ono, yapakatikati ...". Imalumikiza fayilo yosinthira kuchokera ku Qt yokhala ndi ma macros ambiri - zomwe zingathandize / zomwe mungalepheretse. Pambuyo pa njirayi, timawonjezera mbendera zina ku kasinthidwe ngati tikufuna kuletsa china chake. Nachi chitsanzo chathu kasinthidwe.

Kuti Qt igwire ntchito, muyenera kuwonjezera gawo la OS. Njira imodzi ndikukhazikitsa QPA (Qt Platform Abstraction). Tidatenga ngati maziko a pulogalamu yowonjezera ya fb_base yophatikizidwa mu Qt, pamaziko omwe QPA ya Linux imagwira ntchito. Zotsatira zake ndi pulogalamu yaing'ono yotchedwa emboxfb, yomwe imapereka Qt ndi Embox's framebuffer, ndiyeno imakokera kumeneko popanda thandizo lakunja.

Izi ndi zomwe kupanga plugin kumawoneka ngati

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

Ndipo izi ndi momwe kujambulanso kudzawonekera

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

Chotsatira chake, ndi kukhathamiritsa kwa compiler kwa kukula kwa kukumbukira -Os kuthandizidwa, chithunzi cha laibulale chinakhala 3.5 MB, chomwe sichikugwirizana ndi kukumbukira kwakukulu kwa STM32F746. Monga talembera kale m'nkhani yathu ina ya OpenCV, bolodi ili ndi:

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

Popeza kuthandizira popereka ma code kuchokera ku QSPI awonjezedwa kale ku OpenCV, tinaganiza zoyamba ndikukweza chithunzi chonse cha Embox c Qt mu QSPI. Ndipo mwachangu, zonse zidayamba nthawi yomweyo kuchokera ku QSPI! Koma monga momwe zinalili ndi OpenCV, zidapezeka kuti zimagwira ntchito pang'onopang'ono.

Kutumiza Qt ku STM32

Chifukwa chake, tidaganiza zochita izi - choyamba timakopera chithunzicho ku QSPI, kenako ndikuchiyika mu SDRAM ndikuchichita kuchokera pamenepo. Kuchokera ku SDRAM idakhala yothamanga pang'ono, komabe kutali ndi QEMU.

Kutumiza Qt ku STM32

Kenako, panali lingaliro lophatikizirapo malo oyandama - pambuyo pake, Qt imawerengera zina zamagawo amakanema mu makanema ojambula. Tidayesa, koma apa sitinapeze mathamangitsidwe aliwonse owoneka, ngakhale mkati nkhani Madivelopa a Qt adanenanso kuti FPU imapereka chiwonjezeko chachikulu cha liwiro la "kukoka makanema" pazithunzi. Pakhoza kukhala kuwerengetsa kwamalo oyandama pang'ono m'magawo osuntha, ndipo izi zimatengera chitsanzo chapadera.

Lingaliro lothandiza kwambiri linali kusuntha framebuffer kuchokera ku SDRAM kupita kukumbukira mkati. Kuti tichite izi, tidapanga miyeso ya zenera osati 480x272, koma 272x272. Tidatsitsanso kuya kwa utoto kuchokera ku A8R8G8B8 kupita ku R5G6B5, motero timachepetsa kukula kwa pixel imodzi kuchokera pa 4 mpaka 2 mabayiti. Kukula kwake kwa framebuffer ndi 272 * 272 * 2 = 147968 bytes. Izi zidapereka chiwongolero chachikulu, mwina chowoneka bwino, makanema ojambula adakhala osalala.

Kukhathamiritsa kwaposachedwa kunali kuyendetsa nambala ya Embox kuchokera ku RAM ndi Qt code kuchokera ku SDRAM. Kuti tichite izi, choyamba, monga mwachizolowezi, timagwirizanitsa Embox pamodzi ndi Qt, koma timayika malemba, rodata, deta ndi zigawo za bss za laibulale ya QSPI kuti tiyikopere ku 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))

Pochita nambala ya Embox kuchokera ku ROM, tidalandiranso mathamangitsidwe owoneka bwino. Chifukwa chake, makanema ojambula adakhala osalala:


Pamapeto pake, pokonzekera nkhaniyi ndikuyesera masinthidwe osiyanasiyana a Embox, zidapezeka kuti Qt moveblocks imagwira ntchito bwino kuchokera ku QSPI yokhala ndi framebuffer mu SDRAM, ndipo botolo linali ndendende kukula kwa framebuffer! Mwachiwonekere, kuti mugonjetse "chiwonetsero chazithunzi" choyambirira, kuthamangitsidwa kwa 2 kunali kokwanira chifukwa cha kuchepa kwa banal mu kukula kwa framebuffer. Koma sizinali zotheka kukwaniritsa izi mwa kusamutsa kachidindo ka Embox kumakumbukiro osiyanasiyana ofulumira (kuthamanga sikunali 2, koma nthawi 1.5).

Momwe mungayesere nokha

Ngati muli ndi STM32F7-Discovery, mutha kuyendetsa Qt pansi pa Embox nokha. Mutha kuwerenga momwe izi zimachitikira patsamba lathu wiki.

Pomaliza

Zotsatira zake, tinakwanitsa kukhazikitsa Qt! Kuvuta kwa ntchitoyi, m'malingaliro athu, ndikokokomeza. Mwachilengedwe, muyenera kuganizira za ma microcontrollers ndikumvetsetsa kapangidwe ka makina apakompyuta. Zotsatira zokhathamiritsa zimalozera ku mfundo yodziwika bwino kuti botolo mu makina apakompyuta si purosesa, koma kukumbukira.

Chaka chino tidzachita nawo chikondwererochi Mtengo wa TechTrain. Kumeneko tidzakuuzani mwatsatanetsatane ndikuwonetsa Qt, OpenCV pa ma microcontrollers ndi zina zomwe takwaniritsa.

Source: www.habr.com

Kuwonjezera ndemanga