PΕ™evod QWB na STM32

PΕ™evod QWB na STM32Nyob zoo tav su Peb nyob hauv qhov project Embox launched Qt ntawm STM32F7-Discovery thiab xav tham txog nws. Yav dhau los, peb twb tau hais tias peb tau tswj hwm li cas rau kev tso tawm OpenCV.

Qt yog cov txheej txheem hla-platform uas suav nrog tsis tsuas yog cov duab kos duab, tab sis kuj tseem muaj xws li QtNetwork, cov chav kawm rau kev ua haujlwm nrog databases, Qt rau Automation (xws li kev siv IoT) thiab ntau ntxiv. Pab pawg Qt tau ua haujlwm zoo txog kev siv Qt hauv cov kab ke, yog li cov tsev qiv ntawv tau teeb tsa tau zoo. Txawm li cas los xij, txog thaum tsis ntev los no, ob peb tus neeg xav txog kev xa Qt mus rau microcontrollers, tej zaum vim tias txoj haujlwm zoo li nyuaj - Qt loj, MCUs me me.

Ntawm qhov tod tes, lub sijhawm tam sim no muaj cov microcontrollers tsim los ua haujlwm nrog multimedia thiab superior rau thawj Pentiums. Kwv yees li ib xyoos dhau los, Qt blog tshwm sim tswg. Cov neeg tsim tawm tau ua qhov chaw nres nkoj ntawm Qt rau RTEMS OS, thiab pib ua piv txwv nrog cov khoom siv ntawm ntau lub rooj tsavxwm khiav stm32f7. Qhov no txaus siab rau peb. Nws tau pom zoo, thiab cov neeg tsim khoom lawv tus kheej sau txog nws, tias Qt qeeb ntawm STM32F7-Discovery. Peb tau xav paub yog tias peb tuaj yeem khiav Qt hauv Embox, thiab tsis yog kos tus widget xwb, tab sis khiav ib qho animation.

Qt 4.8 tau xa mus rau Embox tau ntev, yog li peb txiav txim siab sim nws ntawm nws. Peb xaiv cov ntawv thov moveblocks - piv txwv ntawm springy animation.

Qt mov blocks ntawm QEMUPΕ™evod QWB na STM32

Yuav pib nrog, peb teeb tsa Qt, yog tias ua tau, nrog qhov tsawg kawg ntawm cov khoom tsim nyog los txhawb cov animation. Rau qhov no muaj kev xaiv "-qconfig tsawg, me, nruab nrab ...". Nws txuas cov ntaub ntawv teeb tsa los ntawm Qt nrog ntau cov macros - dab tsi los pab / ua li cas rau lov tes taw. Tom qab qhov kev xaiv no, peb ntxiv lwm tus chij rau qhov kev teeb tsa yog tias peb xav lov tes taw lwm yam. Nov yog ib qho piv txwv ntawm peb kev teeb tsa.

Txhawm rau Qt ua haujlwm, koj yuav tsum ntxiv txheej txheej OS. Ib txoj hauv kev yog siv QPA (Qt Platform Abstraction). Peb tau coj los ua lub hauv paus npaj ua fb_base plugin suav nrog Qt, raws li QPA rau Linux ua haujlwm. Qhov tshwm sim yog ib lub plugin me me hu ua emboxfb, uas muab Qt nrog Embox's framebuffer, thiab tom qab ntawd nws kos rau ntawd yam tsis muaj kev pab sab nraud.

Nov yog qhov tsim lub plugin zoo li

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

Thiab qhov no yog qhov redrawing yuav zoo li

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

Raws li qhov tshwm sim, nrog rau kev ua kom zoo tshaj plaws rau lub cim xeeb loj -Os tau qhib, lub tsev qiv ntawv duab tau hloov mus ua 3.5 MB, uas tau kawg tsis haum rau lub cim xeeb tseem ceeb ntawm STM32F746. Raws li peb twb tau sau rau hauv peb lwm tsab xov xwm txog OpenCV, lub rooj tsavxwm no muaj:

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

Txij li kev txhawb nqa rau kev ua tiav cov lej los ntawm QSPI twb tau ntxiv rau OpenCV, peb tau txiav txim siab pib los ntawm kev thauj tag nrho Embox c Qt duab rau hauv QSPI. Thiab hurray, txhua yam pib yuav luag tam sim ntawm QSPI! Tab sis raws li nyob rau hauv rooj plaub ntawm OpenCV, nws tau pom tias nws ua haujlwm qeeb heev.

PΕ™evod QWB na STM32

Yog li ntawd, peb txiav txim siab ua li no - ua ntej peb luam cov duab rau QSPI, tom qab ntawd thauj nws mus rau SDRAM thiab ua tiav los ntawm qhov ntawd. Los ntawm SDRAM nws dhau los ua me ntsis sai dua, tab sis tseem nyob deb ntawm QEMU.

PΕ™evod QWB na STM32

Tom ntej no, muaj ib lub tswv yim kom suav nrog qhov taw tes ntab - tom qab tag nrho, Qt ua qee qhov kev suav ntawm cov kev tswj hwm ntawm cov squares hauv cov yeeb yaj kiab. Peb sim, tab sis ntawm no peb tsis tau txais ib qho pom acceleration, txawm nyob rau hauv Tshooj Cov neeg tsim khoom Qt tau thov tias FPU muab qhov nrawm nrawm rau "txuas cov duab" ntawm lub vijtsam kov. Tej zaum yuav muaj qhov ntsuas qis qis hauv qhov txav txav, thiab qhov no nyob ntawm qhov piv txwv tshwj xeeb.

Lub tswv yim zoo tshaj plaws yog txav lub framebuffer los ntawm SDRAM mus rau hauv lub cim xeeb. Txhawm rau ua qhov no, peb ua qhov ntsuas qhov ntev tsis yog 480x272, tab sis 272x272. Peb kuj txo qis xim qhov tob ntawm A8R8G8B8 rau R5G6B5, yog li txo qhov loj ntawm ib pixel los ntawm 4 mus rau 2 bytes. Qhov tshwm sim ntawm qhov loj me yog 272 * 272 * 2 = 147968 bytes. Qhov no ua rau muaj kev nrawm nrawm, tej zaum qhov pom tseeb tshaj plaws, cov animation tau yuav luag du.

Qhov tseeb optimization yog khiav Embox code los ntawm RAM thiab Qt code los ntawm SDRAM. Txhawm rau ua qhov no, peb ua ntej, raws li niaj zaus, statically txuas Embox ua ke nrog Qt, tab sis peb tso cov ntawv nyeem, rodata, cov ntaub ntawv thiab bss ntu ntawm lub tsev qiv ntawv hauv QSPI txhawm rau txhawm rau luam nws mus rau 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))

Los ntawm kev ua tiav Embox code los ntawm ROM, peb kuj tau txais kev ceeb toom nrawm. Raws li qhov tshwm sim, cov animation tig tawm zoo heev:


Thaum kawg, thaum npaj tsab xov xwm thiab sim sib txawv Embox configurations, nws tau muab tawm tias Qt moveblocks ua hauj lwm zoo los ntawm QSPI nrog ib tug framebuffer nyob rau hauv SDRAM, thiab lub bottleneck yog precisely qhov luaj li cas ntawm lub framebuffer! Thaj, kom kov yeej qhov pib "slideshow", 2-fold acceleration yog txaus vim qhov banal txo qhov loj ntawm lub framebuffer. Tab sis nws tsis tuaj yeem ua tiav cov txiaj ntsig zoo li no los ntawm kev hloov pauv tsuas yog Embox code rau ntau yam kev nco ceev (qhov nrawm tsis yog 2, tab sis txog 1.5 zaug).

Yuav ua li cas sim nws tus kheej

Yog tias koj muaj STM32F7-Discovery, koj tuaj yeem khiav Qt hauv Embox koj tus kheej. Koj tuaj yeem nyeem yuav ua li cas qhov no ua tiav ntawm peb wiki.

xaus

Raws li qhov tshwm sim, peb tau tswj hwm los tsim Qt! Lub complexity ntawm txoj hauj lwm, nyob rau hauv peb lub tswv yim, yog me ntsis exaggerated. Lawm, koj yuav tsum tau coj mus rau hauv tus account qhov tshwj xeeb ntawm microcontrollers thiab feem ntau nkag siab txog cov qauv ntawm cov tshuab computer. Cov txiaj ntsig kev ua kom zoo taw qhia rau qhov tseeb paub zoo tias lub fwj hauv lub khoos phis tawj tsis yog lub processor, tab sis lub cim xeeb.

Xyoo no peb yuav koom nrog kev ua koob tsheej TechTrain. Nyob ntawd peb yuav qhia rau koj paub ntau ntxiv thiab qhia Qt, OpenCV ntawm microcontrollers thiab peb lwm yam kev ua tiav.

Tau qhov twg los: www.hab.com

Ntxiv ib saib