Na-ebufe Qt na STM32

Na-ebufe Qt na STM32Ehihie ọma Anyị nọ n'ọrụ a igbe igbe ewepụtara Qt na STM32F7-Discovery ma chọọ ikwu maka ya. Tupu mgbe ahụ, anyị ekwuola ka anyị siri nwee ike ịmalite Mepee.

Qt bụ usoro ikpo okwu nke na-agụnye ọ bụghị naanị ihe eserese, kamakwa ihe ndị dị ka QtNetwork, otu klas maka ịrụ ọrụ na ọdụ data, Qt maka akpaaka (gụnyere maka mmejuputa IoT) na ọtụtụ ndị ọzọ. Ndị otu Qt anọwo na-agbasi mbọ ike maka iji Qt na sistemu agbakwunyere, yabụ enwere ike ịhazi ọba akwụkwọ ndị ahụ. Otú ọ dị, ruo n'oge na-adịbeghị anya, mmadụ ole na ole chere echiche banyere ibuga Qt na microcontrollers, eleghị anya n'ihi na ọrụ dị otú ahụ siri ike - Qt buru ibu, MCU dị obere.

N'aka nke ọzọ, n'oge a, e nwere microcontrollers e mere iji rụọ ọrụ na multimedia ma dị elu karịa Pentium nke mbụ. Ihe dị ka otu afọ gara aga, blọgụ Qt pụtara posta. Ndị mmepe ahụ mere ọdụ ụgbọ mmiri nke Qt maka RTEMS OS, wee malite ihe atụ nwere wijetị n'ọtụtụ bọọdụ na-agba stm32f7. Nke a masịrị anyị. Ọ bụ ama, na mmepe onwe ha dee banyere ya, na Qt na-adịghị ngwa na STM32F7-Discovery. Anyị nọ na-eche ma anyị nwere ike ịgba ọsọ Qt n'okpuru Embox, ọ bụghị naanị ise wijetị, kama na-eme ihe ngosi.

Ebugara Qt 4.8 na Embox ogologo oge, yabụ anyị kpebiri ịnwale ya na ya. Anyị họọrọ ngwa ngagharị - ihe atụ nke animation springy.

Ihe mgbochi QT na QEMUNa-ebufe Qt na STM32

Iji malite, anyị na-ahazi Qt, ma ọ bụrụ na ọ ga-ekwe omume, yana obere ngwa ngwa achọrọ iji kwado animation. Maka nke a enwere nhọrọ "-qconfig minimal, obere, ọkara ...". Ọ na-ejikọta faịlụ nhazi site na Qt na ọtụtụ macros - ihe iji mee ka / ihe ị gbanyụọ. Mgbe nhọrọ a gasịrị, anyị na-agbakwunye ọkọlọtọ ndị ọzọ na nhazi ma ọ bụrụ na anyị chọrọ gbanyụọ ihe ọzọ. Nke a bụ ihe atụ nke anyị nhazi.

Ka Qt rụọ ọrụ, ịkwesịrị ịgbakwunye oyi akwa ndakọrịta OS. Otu ụzọ bụ itinye QPA (Qt Platform Abstraction). Anyị were dị ka ihe ndabere fb_base ngwa mgbakwunye etinyere na Qt, na ndabere nke QPA maka Linux na-arụ ọrụ. Nsonaazụ bụ obere ngwa mgbakwunye a na-akpọ emboxfb, nke na-enye Qt na Framebuffer Embox, wee dọta ebe ahụ n'enweghị enyemaka ọ bụla.

Nke a bụ ihe ịmepụta ngwa mgbakwunye dị ka

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

Na nke a bụ ihe redrawing ga-adị ka

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

N'ihi ya, na mkpokọta njikarịcha maka ebe nchekwa size -Os nyeere, ọbá akwụkwọ oyiyi wee bụrụ 3.5 MB, nke n'ezie adịghị adabara na isi ebe nchekwa nke STM32F746. Dịka anyị deburu n'akwụkwọ akụkọ anyị ọzọ gbasara OpenCV, bọọdụ a nwere:

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

Ebe ọ bụ na agbakwunyela nkwado maka koodu mmebe nke QSPI na OpenCV, anyị kpebiri ibido site na itinye ihe oyiyi Embox c Qt niile n'ime QSPI. Na ngwa ngwa, ihe niile malitere ozugbo site na QSPI! Mana dị ka ọ dị na OpenCV, ọ tụgharịrị na ọ na-arụ ọrụ nwayọ.

Na-ebufe Qt na STM32

Ya mere, anyị kpebiri ime ya n'ụzọ dị otú a - mbụ anyị na-eṅomi ihe oyiyi na QSPI, mgbe ahụ, bunye ya na SDRAM na-egbu si ebe ahụ. Site na SDRAM ọ ghọrọ ntakịrị ngwa ngwa, mana ọ ka dị anya na QEMU.

Na-ebufe Qt na STM32

Na-esote, enwere echiche ịgụnye ebe na-ese n'elu mmiri - ka emechara, Qt na-eme ụfọdụ mgbako nke nhazi nke square na animation. Anyị gbalịrị, mana ebe a anyị enwetaghị osooso ọ bụla a na-ahụ anya, n'agbanyeghị na ederede Ndị mmepe Qt kwuru na FPU na-enye mmụba dị ukwuu na ọsọ maka "ịdọrọ animation" na ihuenyo mmetụ. Enwere ike ịnwe ngụkọ ihe na-ese n'elu mmiri na ihe mgbochi, nke a dabere na ihe atụ akọwapụtara.

Echiche kachasị dị irè bụ ịkwaga framebuffer site na SDRAM gaa na ebe nchekwa dị n'ime. Iji mee nke a, anyị mere akụkụ ihuenyo ọ bụghị 480x272, kama 272x272. Anyị wedakwara omimi agba site na A8R8G8B8 ruo R5G6B5, si otú a belata nha nke otu pikselụ site na 4 ruo 2 bytes. Nha framebuffer pụta bụ 272 * 272 * 2 = 147968 bytes. Nke a nyere nnukwu osooso, ikekwe kacha pụta ìhè, animation ghọrọ ihe fọrọ nke nta ka ire ụtọ.

Nkwalite kachasị ọhụrụ bụ iji koodu Embox sitere na RAM yana koodu Qt sitere na SDRAM. Iji mee nke a, anyị na-ebu ụzọ, dị ka ọ dị na mbụ, na-ejikọta Embox na Qt, mana anyị na-edobe ederede, rodata, data na bss akụkụ nke ọba akwụkwọ na QSPI ka anyị wee detuo ya na 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))

Site na ime koodu Embox site na ROM, anyị nwetakwara ngwangwa pụtara ìhè. N'ihi ya, animation ahụ bịara mara ezigbo mma:


Na njedebe, ka ị na-akwadebe akụkọ ahụ ma na-anwale nhazi Embox dị iche iche, ọ tụgharịrị na Qt moveblock na-arụ ọrụ dị ukwuu site na QSPI na framebuffer na SDRAM, na bottleneck bụ kpọmkwem nha nke framebuffer! N'ụzọ doro anya, iji merie "slideshow" mbụ, ngwangwa okpukpu abụọ zuru ezu n'ihi mbelata banal na nha nke framebuffer. Mana ọ gaghị ekwe omume ịnweta nsonaazụ dị otú ahụ site na ịnyefe naanị koodu Embox na ncheta ngwa ngwa dị iche iche (mmepụta ahụ abụghị 2, ma ihe dị ka ugboro 2).

Otu esi anwale ya n'onwe gị

Ọ bụrụ na ị nwere STM32F7-Discovery, ị nwere ike ịgba ọsọ Qt n'okpuru Embox n'onwe gị. Ị nwere ike ịgụ ka esi eme nke a na anyị wiki.

nkwubi

N'ihi ya, anyị jisiri ike malite Qt! Ihe mgbagwoju anya nke ọrụ ahụ, n'echiche anyị, dị ntakịrị ikwubiga okwu ókè. Dị ka o kwesịrị ịdị, ịkwesịrị iburu n'uche nkọwa nke microcontrollers ma ghọtakarị ụkpụrụ nke sistemu kọmputa. Nsonaazụ njikarịcha na-arụtụ aka n'eziokwu a maara nke ọma na mkpịsị aka na sistemụ kọmputa abụghị ihe nrụpụta, mana ebe nchekwa.

N'afọ a, anyị ga-esonye na mmemme ahụ TechTrain. N'ebe ahụ, anyị ga-agwa gị nke ọma ma gosi Qt, OpenCV na microcontrollers na anyị rụzuru ndị ọzọ.

isi: www.habr.com

Tinye a comment