Tauranga Qt ki STM32

Tauranga Qt ki STM32Kia pai te ahiahi Kei roto tatou i te kaupapa Embox i whakarewahia a Qt i runga i te STM32F7-Discovery me te hiahia ki te korero mo taua mea. I mua ake nei, kua korerohia e matou me pehea te whakarewatanga OpenCV.

Ko te Qt he anga-whakawhitiwhiti e mau ana ehara i nga waahanga kauwhata anake, engari ano ko nga mea penei i te QtNetwork, he huinga karaehe mo te mahi me nga papaa raraunga, Qt mo te Aunoatanga (tae atu ki te whakatinana IoT) me te maha atu. Kua kaha te roopu Qt ki te whakamahi i te Qt i roto i nga punaha whakauru, na reira ka taea te whirihora i nga whare pukapuka. Heoi, i mua tata nei, he ruarua nga tangata i whakaaro ki te kawe i te Qt ki nga microcontrollers, na te mea he uaua te ahua o tera mahi - he nui te Qt, he iti nga MCU.

I tetahi atu taha, i tenei wa he microcontrollers i hangaia hei mahi me te rongorau me te pai ake i nga Pentiums tuatahi. Tata ki te tau ki muri, ka puta te blog Qt pou. I hangaia e nga kaihanga he tauranga Qt mo te RTEMS OS, ka whakarewahia nga tauira me nga widget i runga i nga papa maha e whakahaere ana i te stm32f7. I pai tenei ki a matou. I kitea, a ko nga kaiwhakawhanake ake e tuhi ana, he puhoi a Qt i runga i te STM32F7-Discovery. I whakaaro matou mehemea ka taea e matou te whakahaere i te Qt i raro i te Embox, kaore i te tuhi noa i te widget, engari ka whakahaere i te hākoritanga.

Ko te Qt 4.8 kua tukuna ki te Embox mo te wa roa, no reira ka whakatau matou ki te whakamatau. I whiriwhiria e matou te tono moveblocks - he tauira o te hākoritanga puna.

Qt moveblocks i runga i QEMUTauranga Qt ki STM32

Hei timata, ka whirihorahia e matou te Qt, mena ka taea, me te huinga iti o nga waahanga e hiahiatia ana hei tautoko i te hākoritanga. Mo tenei he whiringa "-qconfig iti, iti, reo ...". Ka honoa he konae whirihoranga mai i te Qt me te maha o nga tonotono - he aha hei whakaahei / aha hei mono. Whai muri i tenei whiringa, ka taapirihia e matou etahi atu haki ki te whirihoranga mena ka hiahia matou ki te whakakore i tetahi atu mea. Anei tetahi tauira o to maatau whirihoranga.

Kia mahi a Qt, me taapiri he paparanga hototahi OS. Ko tetahi huarahi ko te whakatinana i te QPA (Qt Platform Abstraction). I tangohia e matou hei kaupapa te mono fb_base kua rite kua whakauruhia ki roto i te Qt, na runga i te mahi a QPA mo Linux. Ko te hua ko te mono iti e kiia ana ko emboxfb, e whakarato ana i te Qt me te framebuffer a Embox, katahi ka kumea ki reira kaore he awhina o waho.

Koinei te ahua o te hanga mono

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 koinei te ahua o te tuhi ano

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

Ko te hua o tenei, na te whakahiatotanga o te kaitoi mo te rahi o te mahara -Os kua whakahohea, ka puta te ahua o te whare pukapuka ki te 3.5 MB, kaore e uru ki te mahara matua o te STM32F746. Ka rite ki ta maatau i tuhi i etahi atu tuhinga mo OpenCV, kei tenei poari:

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

I te mea kua taapirihia te tautoko mo te mahi waehere mai i QSPI ki OpenCV, i whakatau matou ki te timata ma te uta i te whakaahua Embox c Qt katoa ki roto i te QSPI. Na hurray, tata tonu nga mea katoa i timata mai i te QSPI! Engari i te ahua o OpenCV, i puta mai he puhoi te mahi.

Tauranga Qt ki STM32

Na reira, i whakatau matou ki te mahi penei - tuatahi ka kapehia e matou te ahua ki te QSPI, ka utaina ki te SDRAM ka mahia mai i reira. Mai i te SDRAM ka tere ake, engari kei tawhiti tonu i te QEMU.

Tauranga Qt ki STM32

I muri mai, i puta he whakaaro ki te whakauru i tetahi tohu maanu - inaa, ka mahia e Qt etahi tatauranga o nga taunga o nga tapawha i roto i te hākoritanga. I whakamatau matou, engari i konei kaore i kitea he whakaterenga, ahakoa kei roto Tuhinga Ko nga kaiwhakawhanake Qt i kii ko te FPU he nui te piki o te tere mo te "toia hākoritanga" i runga i te mata pa. He iti ake pea nga tatauranga ira maanu i roto i nga poraka nekehanga, a ka whakawhirinaki tenei ki te tauira motuhake.

Ko te whakaaro tino whai hua ko te neke i te framebuffer mai i te SDRAM ki te mahara o roto. Hei mahi i tenei, i hanga e matou nga rahi o te mata ehara i te 480x272, engari 272x272. I whakahekehia ano e matou te hohonu o te tae mai i te A8R8G8B8 ki te R5G6B5, na reira ka whakaitihia te rahi o te pika kotahi mai i te 4 ki te 2 paita. Ko te rahi o te framebuffer ko te 272 * 272 * 2 = 147968 paita. Na tenei i nui te whakaterenga, tera pea i tino kitea, kua tata maeneene te hākoritanga.

Ko te arotautanga hou ko te whakahaere waehere Embox mai i te RAM me te waehere Qt mai i SDRAM. Ki te mahi i tenei, ko te tuatahi ka honoa e matou a Embox ki te Qt, engari ka whakanohohia e matou nga waahanga kuputuhi, rodata, raraunga me nga bss o te whare pukapuka ki te QSPI kia kape ai ki te 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))

Na roto i te mahi i te waehere Embox mai i te ROM, i kite ano matou i te tere tere. Ko te mutunga, he maeneene te ahua o te hākoritanga:


I te mutunga, i te wa e whakarite ana i te tuhinga me te whakamatau i nga momo whirihoranga Embox, i puta mai he pai te mahi a Qt moveblocks mai i te QSPI me te framebuffer i roto i te SDRAM, a ko te pounamu he rite tonu te rahi o te framebuffer! Ko te ahua, ki te wikitoria i te "whakaata whakaataata" tuatahi, he 2-whakatere tere i nui na te whakahekenga o te rahi o te framebuffer. Engari kaore i taea te whakatutuki i taua hua ma te whakawhiti noa i te waehere Embox ki nga maharatanga tere (kaore i te 2 te whakatere, engari mo te 1.5 nga wa).

Me pehea te whakamatau i a koe ano

Mena kei a koe he STM32F7-Discovery, ka taea e koe te whakahaere Qt i raro i te Embox koe. Ka taea e koe te panui me pehea te mahi i runga i ta maatau wiki.

mutunga

Ko te mutunga, i taea e matou te whakarewa i te Qt! Ko te uauatanga o te mahi, ki ta matou nei whakaaro, he ahua whakanuia. Ko te tikanga, me whai whakaaro koe ki nga ahuatanga o nga microcontrollers me te maarama ki te hoahoanga o nga punaha rorohiko. Ko nga hua arotautanga e tohu ana ki te meka e mohiotia ana ko te pounamu i roto i te punaha rorohiko ehara i te tukatuka, engari ko te mahara.

I tenei tau ka uru matou ki te hakari TechTrain. I reira ka korero atu matou ki a koe me te whakaatu i te Qt, OpenCV i runga i nga microcontrollers me etahi atu whakatutukitanga.

Source: will.com

Tāpiri i te kōrero