Gbigbe Qt si STM32

Gbigbe Qt si STM32E kaasan A wa ninu ise agbese na Apoti se igbekale Qt on STM32F7-Awari ati ki o yoo fẹ lati soro nipa o. Ni iṣaaju, a ti sọ tẹlẹ bi a ṣe ṣakoso lati ṣe ifilọlẹ OpenCV.

Qt ni a agbelebu-Syeed ilana ti o ba pẹlu ko nikan ayaworan irinše, sugbon tun iru ohun bi QtNetwork, a ti ṣeto ti awọn kilasi fun ṣiṣẹ pẹlu infomesonu, Qt fun Automation (pẹlu fun IoT imuse) ati Elo siwaju sii. Qt egbe ti wa ni amojuto nipa a lilo Qt ni ifibọ awọn ọna šiše, ki awọn ikawe wa ni oyimbo Configurable. Sibẹsibẹ, titi laipe, diẹ eniyan ro nipa a ibudo Qt to microcontrollers, jasi nitori iru iṣẹ-ṣiṣe dabi soro - Qt ni o tobi, MCUs wa ni kekere.

Ni apa keji, ni akoko awọn microcontrollers wa ti a ṣe apẹrẹ lati ṣiṣẹ pẹlu multimedia ati giga si Pentium akọkọ. Nipa odun kan seyin, Qt bulọọgi han sare. Awọn Difelopa ṣe ibudo Qt fun RTEMS OS, ati ṣe ifilọlẹ awọn apẹẹrẹ pẹlu awọn ẹrọ ailorukọ lori ọpọlọpọ awọn igbimọ ti n ṣiṣẹ stm32f7. Eleyi nife wa. O je ti ṣe akiyesi, ati awọn Difelopa ara wọn kọ nipa o, ti Qt o lọra lori STM32F7-Awari. A ni won iyalẹnu ti o ba ti a le ṣiṣe Qt labẹ Embox, ati ki o ko o kan fa ẹrọ ailorukọ, ṣugbọn ṣiṣe awọn ohun iwara.

Qt 4.8 ti gbejade si Embox fun igba pipẹ, nitorinaa a pinnu lati gbiyanju lori rẹ. A yan ohun elo gbigbe-blocks - apẹẹrẹ ti iwara orisun omi.

Qt moveblocks on QEMUGbigbe Qt si STM32

Lati bẹrẹ pẹlu, a tunto Qt, ti o ba ti ṣee ṣe, pẹlu awọn kere ṣeto ti irinše ti a beere fun a support iwara. Fun eyi aṣayan kan wa “-qconfig pọọku, kekere, alabọde…”. O so a iṣeto ni faili lati Qt pẹlu ọpọlọpọ awọn macros - ohun ti lati jeki / ohun ti lati mu. Lẹhin aṣayan yii, a ṣafikun awọn asia miiran si iṣeto ti a ba fẹ mu nkan miiran kuro. Eyi ni apẹẹrẹ ti wa iṣeto ni.

Ni ibere fun Qt ṣiṣẹ, o nilo lati fi ohun OS ibamu Layer. Ọna kan ni lati ṣe QPA (Qt Platform Abstraction). A mu bi ipilẹ ohun itanna fb_base ti o ṣetan ti o wa ninu Qt, lori ipilẹ eyiti QPA fun Linux ṣiṣẹ. Abajade jẹ ohun itanna kekere kan ti a pe ni emboxfb, eyiti o pese Qt pẹlu fireemu fireemu Embox, lẹhinna o fa nibẹ laisi iranlọwọ ita eyikeyi.

Eyi ni ohun ti ṣiṣẹda ohun itanna kan dabi

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

Ati pe eyi ni ohun ti atunṣe yoo dabi

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

Bi abajade, pẹlu iṣapeye iṣapeye fun iwọn iranti -Os ṣiṣẹ, aworan ile-ikawe wa ni 3.5 MB, eyiti dajudaju ko baamu sinu iranti akọkọ ti STM32F746. Gẹgẹbi a ti kọ tẹlẹ ninu nkan wa miiran nipa OpenCV, igbimọ yii ni:

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

Niwọn igba ti atilẹyin fun ṣiṣe koodu lati QSPI ti ti ṣafikun tẹlẹ si OpenCV, a pinnu lati bẹrẹ nipa ikojọpọ gbogbo aworan Embox c Qt sinu QSPI. Ati ki o yara, ohun gbogbo bẹrẹ fere lẹsẹkẹsẹ lati QSPI! Ṣugbọn bi ninu ọran ti OpenCV, o wa ni jade pe o ṣiṣẹ laiyara.

Gbigbe Qt si STM32

Nitorinaa, a pinnu lati ṣe ni ọna yii - akọkọ a daakọ aworan naa si QSPI, lẹhinna gbe e sinu SDRAM ki o ṣiṣẹ lati ibẹ. Lati SDRAM o di kekere kan yiyara, sugbon si tun jina lati QEMU.

Gbigbe Qt si STM32

Next, nibẹ je ohun agutan lati ni a lilefoofo ojuami - lẹhin ti gbogbo, Qt ṣe diẹ ninu awọn isiro ti awọn ipoidojuko ti awọn onigun mẹrin ni iwara. A gbiyanju, sugbon nibi a ko gba eyikeyi han isare, biotilejepe ni article Qt Difelopa so wipe FPU yoo fun a significant ilosoke ninu iyara fun "fa iwara" loju iboju Afọwọkan. O le wa ni significantly kere lilefoofo ojuami isiro ni moveblocks, ki o si yi da lori awọn kan pato apẹẹrẹ.

Ero ti o munadoko julọ ni lati gbe fireemu lati SDRAM si iranti inu. Lati ṣe eyi, a ṣe awọn iwọn iboju kii ṣe 480x272, ṣugbọn 272x272. A tun sọ ijinle awọ silẹ lati A8R8G8B8 si R5G6B5, nitorinaa dinku iwọn ti ẹbun kan lati 4 si 2 baiti. Abajade framebuffer iwọn jẹ 272 * 272 * 2 = 147968 baiti. Eyi funni ni isare pataki, boya ni akiyesi julọ, ere idaraya ti fẹrẹ dan.

Imudara tuntun ni lati ṣiṣẹ koodu Embox lati Ramu ati koodu Qt lati SDRAM. Lati ṣe eyi, a akọkọ, bi ibùgbé, statically asopọ Embox pọ pẹlu Qt, sugbon a gbe awọn ọrọ, rodata, data ati bss apa ti awọn ìkàwé ni QSPI ni ibere lati ki o si da o si 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))

Nipa ṣiṣe koodu Embox lati ROM, a tun gba isare ti o ṣe akiyesi. Bi abajade, iwara naa yipada ni irọrun pupọ:


Ni ipari, lakoko ti o ngbaradi nkan naa ati igbiyanju awọn atunto Embox oriṣiriṣi, o wa ni pe Qt moveblocks ṣiṣẹ nla lati QSPI pẹlu fireemu ni SDRAM, ati igo naa jẹ deede iwọn ti fireemu buffer! Nkqwe, lati bori ni ibẹrẹ “afihan ifaworanhan”, isare 2-agbo ti to nitori idinku banal ni iwọn ti framebuffer. Ṣugbọn ko ṣee ṣe lati ṣaṣeyọri iru abajade kan nipa gbigbe koodu Embox nikan si ọpọlọpọ awọn iranti iyara (isare naa kii ṣe 2, ṣugbọn nipa awọn akoko 1.5).

Bii o ṣe le gbiyanju funrararẹ

Ti o ba ni STM32F7-Awari, o le ṣiṣe awọn Qt labẹ Embox ara. O le ka bi eyi ṣe ṣe lori wa wiki.

ipari

Bi awọn kan abajade, a ti iṣakoso lati lọlẹ Qt! Idiju ti iṣẹ-ṣiṣe naa, ninu ero wa, jẹ abumọ diẹ. Nipa ti, o nilo lati ṣe akiyesi awọn pato ti awọn oluṣakoso micro ati ni gbogbogbo loye faaji ti awọn eto kọnputa. Awọn abajade ti o dara julọ tọka si otitọ ti a mọ daradara pe igo igo ni eto iširo kii ṣe ero isise, ṣugbọn iranti.

Odun yi a yoo kopa ninu àjọyọ TechTrain. Nibẹ ni a yoo sọ fun ọ ni alaye diẹ sii ati ṣafihan Qt, OpenCV lori awọn iṣakoso micro ati awọn aṣeyọri miiran wa.

orisun: www.habr.com

Fi ọrọìwòye kun