Ke lawe nei i ka Qt i STM32

Ke lawe nei i ka Qt i STM32Aloha awakea, Aloha Auinalā Aia mākou i ka papahana Embox hoʻokuʻu iā Qt ma STM32F7-Discovery a makemake e kamaʻilio e pili ana. Ma mua, ua haʻi mua mākou pehea mākou i hoʻomaka ai OpenCV.

ʻO Qt kahi papa hana cross-platform e komo pū ana me nā ʻāpana kiʻi wale nō, akā nā mea like me QtNetwork, kahi papa o nā papa no ka hana ʻana me nā waihona, Qt no Automation (me ka hoʻokō IoT) a ʻoi aku. Ua hoʻoikaika ka hui Qt i ka hoʻohana ʻana iā Qt i nā ʻōnaehana i hoʻopili ʻia, no laila hiki ke hoʻonohonoho pono ʻia nā hale waihona puke. Eia nō naʻe, a hiki i kēia manawa, liʻiliʻi ka poʻe i noʻonoʻo e pili ana i ka lawe ʻana iā Qt i nā microcontrollers, no ka mea paʻakikī ia hana - nui ka Qt, liʻiliʻi nā MCU.

Ma ka ʻaoʻao ʻē aʻe, i kēia manawa aia nā microcontrollers i hoʻolālā ʻia e hana me ka multimedia a ʻoi aku ka maikaʻi ma mua o nā Pentiums mua. Ma kahi o hoʻokahi makahiki i hala, ua ʻike ʻia ka blog Qt leka. Ua hana nā mea hoʻomohala i kahi awa o Qt no ka RTEMS OS, a hoʻokuʻu i nā hiʻohiʻona me nā widget ma kekahi mau papa e holo ana i ka stm32f7. Ua hoihoi kēia iā mākou. Ua ʻike ʻia, a kākau nā mea hoʻomohala iā ia iho, ua lohi ʻo Qt ma ka STM32F7-Discovery. Ke noʻonoʻo nei mākou inā hiki iā mākou ke holo i ka Qt ma lalo o Embox, ʻaʻole e huki wale i kahi widget, akā holo i kahi animation.

Ua lawe ʻia ʻo Qt 4.8 i Embox no ka manawa lōʻihi, no laila ua hoʻoholo mākou e hoʻāʻo iā ia. Ua koho mākou i ka noi moveblocks - kahi hiʻohiʻona o ka animation springy.

Qt moveblocks ma QEMUKe lawe nei i ka Qt i STM32

No ka hoʻomaka ʻana, hoʻonohonoho mākou i ka Qt, inā hiki, me ka liʻiliʻi o nā ʻāpana i koi ʻia e kākoʻo i ka animation. No kēia mea aia kahi koho "-qconfig liʻiliʻi, liʻiliʻi, waena ...". Hoʻopili ia i kahi faila hoʻonohonoho mai Qt me nā macros he nui - he aha ka mea e hiki ai / mea e hoʻopau ai. Ma hope o kēia koho, hoʻohui mākou i nā hae ʻē aʻe i ka hoʻonohonoho inā makemake mākou e hoʻopau i kahi mea ʻē aʻe. Eia kekahi laʻana o kā mākou eaiaeoaooo.

I mea e hana ai ʻo Qt, pono ʻoe e hoʻohui i kahi papa hoʻohālikelike OS. ʻO kahi ala e hoʻokō ai i ka QPA (Qt Platform Abstraction). Lawe mākou ma ke ʻano he kumu hoʻohui fb_base i hoʻomākaukau ʻia i Qt, ma ke kumu o ka hana ʻana o QPA no Linux. ʻO ka hopena he plugin liʻiliʻi i kapa ʻia ʻo emboxfb, nāna e hāʻawi iā Qt me ka framebuffer o Embox, a laila huki ʻia ma laila me ke kōkua ʻole o waho.

ʻO kēia ke ʻano o ka hana ʻana i kahi 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();
}

A ʻo kēia ke ʻano o ke kiʻi hou ʻana

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

ʻO ka hopena, me ka hoʻonui ʻana i ka compiler no ka nui o ka hoʻomanaʻo -Os, ua lilo ke kiʻi waihona i 3.5 MB, ʻoiaʻiʻo ʻaʻole kūpono i ka hoʻomanaʻo nui o ka STM32F746. E like me kā mākou i kākau ai ma kā mākou ʻatikala ʻē aʻe e pili ana iā OpenCV, aia kēia papa:

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

No ka mea ua hoʻohui ʻia ke kākoʻo no ka hoʻokō ʻana i ke code mai QSPI i OpenCV, ua hoʻoholo mākou e hoʻomaka ma ka hoʻouka ʻana i ke kiʻi holoʻokoʻa Embox c Qt i QSPI. A hurray, hoʻomaka koke nā mea āpau mai QSPI! Akā e like me ka hihia o OpenCV, ua ʻike ʻia he hana lohi.

Ke lawe nei i ka Qt i STM32

No laila, ua hoʻoholo mākou e hana i kēia ala - kope mua mākou i ke kiʻi i QSPI, a laila hoʻouka iā ia i SDRAM a hoʻokō mai laila. Mai SDRAM ua lilo ia i ʻoi aku ka wikiwiki, akā mamao loa mai QEMU.

Ke lawe nei i ka Qt i STM32

Ma hope aʻe, aia kahi manaʻo e hoʻokomo i kahi kiko lana - ma hope o nā mea a pau, hana ʻo Qt i kekahi mau helu ʻana o nā hoʻonohonoho o nā ʻāpana i ka animation. Ua hoʻāʻo mākou, akā ma ʻaneʻi ʻaʻole i ʻike ʻia ka wikiwiki, ʻoiai i loko 'ōlelo Ua ʻōlelo nā mea hoʻomohala Qt e hāʻawi ka FPU i ka piʻi nui o ka wikiwiki no ka "kauo ʻana i ka animation" ma ka touchscreen. He emi iki paha ka helu lana ana ma ka moveblocks, a pili keia i ka la'ana.

ʻO ka manaʻo maikaʻi loa e neʻe i ka framebuffer mai SDRAM i ka hoʻomanaʻo kūloko. No ka hana ʻana i kēia, hana mākou i ka nui o ka pale ʻaʻole 480x272, akā 272x272. Ua hoʻohaʻahaʻa mākou i ka hohonu kala mai A8R8G8B8 a i R5G6B5, no laila e hōʻemi ana i ka nui o hoʻokahi pika mai ka 4 a i ka 2 bytes. ʻO ka nui framebuffer ka hopena he 272 * 272 * 2 = 147968 bytes. Hāʻawi kēia i ka wikiwiki nui, ʻoi aku paha ka mea i ʻike ʻia, ua lilo ka animation i mea maʻalahi.

ʻO ka loiloi hou loa e holo i ka code Embox mai RAM a me Qt code mai SDRAM. No ka hana ʻana i kēia, mākou mua, e like me ka mea maʻamau, hoʻopili statically Embox me Qt, akā, waiho mākou i ka kikokikona, rodata, ʻikepili a me nā ʻāpana bss o ka waihona ma QSPI i mea e kope ai iā 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))

Ma ka hoʻokō ʻana i ka code Embox mai ROM, ua loaʻa iā mākou ka wikiwiki ʻike. ʻO ka hopena, ua maʻalahi ka animation:


I ka hopena, ʻoiai e hoʻomākaukau ana i ka ʻatikala a me ka hoʻāʻo ʻana i nā hoʻonohonoho Embox ʻē aʻe, ua ʻike ʻia he hana nui nā Qt moveblocks mai QSPI me kahi framebuffer ma SDRAM, a ʻo ka bottleneck ka nui o ka framebuffer! ʻIke ʻia, no ka lanakila ʻana i ka "slideshow" mua, ua lawa ka wikiwiki o 2-fold ma muli o ka hōʻemi banal i ka nui o ka framebuffer. Akā ʻaʻole hiki ke hoʻokō i kēlā hopena ma ka hoʻololi ʻana i ka code Embox i nā hoʻomanaʻo wikiwiki (ʻaʻole 2 ka wikiwiki, akā ma kahi o 1.5 mau manawa).

Pehea e hoao ai ia oe iho

Inā loaʻa iā ʻoe kahi STM32F7-Discovery, hiki iā ʻoe ke holo Qt ma lalo o Embox iā ʻoe iho. Hiki iā ʻoe ke heluhelu pehea e hana ʻia ai kēia ma kā mākou wiki.

hopena

ʻO ka hopena, ua hiki iā mākou ke hoʻomaka i ka Qt! ʻO ka paʻakikī o ka hana, i ko mākou manaʻo, ua hoʻonui ʻia. Ma keʻano maʻamau, pono ʻoe e noʻonoʻo i nā kikoʻī o nā microcontrollers a hoʻomaopopo maʻamau i ke ʻano o nā ʻōnaehana kamepiula. Hōʻike nā hopena optimization i ka ʻoiaʻiʻo i ʻike ʻia ʻo ka bottleneck i kahi ʻōnaehana kamepiula ʻaʻole ia ka mea hana, akā ka hoʻomanaʻo.

I kēia makahiki e komo mākou i ka ʻahaʻaina TechTrain. Ma laila mākou e haʻi aku ai iā ʻoe i nā kikoʻī hou aʻe a hōʻike iā Qt, OpenCV ma nā microcontrollers a me kā mākou mau hoʻokō ʻē aʻe.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka