Ihambisa i-Qt ku-STM32

Ihambisa i-Qt ku-STM32Sawubona Sikuphrojekthi I-embox yethule i-Qt ku-STM32F7-Discovery futhi ingathanda ukukhuluma ngayo. Ngaphambilini, sesivele sasho ukuthi sikwazile kanjani ukwethula I-OpenCV.

I-Qt iwuhlaka lwenkundla ephambanayo olungahlanganisi izingxenye zegraphic kuphela, kodwa nezinto ezifana ne-QtNetwork, iqoqo lamakilasi okusebenza ngezizindalwazi, i-Qt for Automation (okuhlanganisa nokusetshenziswa kwe-IoT) nokunye okuningi. Ithimba le-Qt belizimisele ngokusebenzisa i-Qt ezinhlelweni ezishumekiwe, ngakho-ke imitapo yolwazi iyalungiseka. Kodwa-ke, kuze kube muva nje, bambalwa abantu ababecabanga ngokuhambisa i-Qt kuma-microcontrollers, mhlawumbe ngenxa yokuthi umsebenzi onjalo ubonakala unzima - i-Qt inkulu, ama-MCU mancane.

Ngakolunye uhlangothi, okwamanje kukhona ama-microcontrollers aklanyelwe ukusebenza nge-multimedia futhi aphakeme kune-Pentiums yokuqala. Cishe unyaka owedlule, kwavela ibhulogi ye-Qt okusheshayo. Onjiniyela benze ichweba le-Qt le-RTEMS OS, futhi bethula izibonelo ezinamawijethi kumabhodi amaningana asebenzisa i-stm32f7. Lokhu kwaba nesithakazelo kithi. Kwabonakala, futhi abathuthukisi ngokwabo babhala ngakho, ukuthi i-Qt ihamba kancane ku-STM32F7-Discovery. Besizibuza ukuthi singakwazi yini ukusebenzisa i-Qt ngaphansi kwe-Embox, futhi singagcini nje ukudweba iwijethi, kodwa siqalise ukugqwayiza.

I-Qt 4.8 ithuthelwe ku-Embox isikhathi eside, ngakho-ke sinqume ukuyizama kuyo. Sikhethe uhlelo lokusebenza lwe-moveblocks - isibonelo sokugqwayiza kwe-springy.

I-Qt ivimba ukunyakaza ku-QEMUIhambisa i-Qt ku-STM32

Okokuqala, silungiselela i-Qt, uma kungenzeka, ngesethi encane yezingxenye ezidingekayo ukusekela ukugqwayiza. Kulokhu kukhona inketho "-qconfig minimal, encane, ephakathi ...". Ixhuma ifayela lokucushwa elisuka ku-Qt elinama-macros amaningi - yini ongayinika amandla / ozoyikhubaza. Ngemuva kwale nketho, sengeza amanye amafulegi ekucushweni uma sifuna ukukhubaza enye into. Nasi isibonelo sethu ukumisa.

Ukuze i-Qt isebenze, udinga ukwengeza isendlalelo sokuhambisana ne-OS. Enye indlela ukusebenzisa i-QPA (Qt Platform Abstraction). Sithathe njengesisekelo i-plugin esenziwe ngomumo ye-fb_base efakwe ku-Qt, ngesisekelo i-QPA ye-Linux esebenza ngayo. Umphumela uba i-plugin encane ebizwa nge-emboxfb, ehlinzeka nge-Qt nge-framebuffer ye-Embox, bese idonsela lapho ngaphandle kosizo lwangaphandle.

Yilokhu okwenza i-plugin kubukeke

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

Futhi lokhu kuzobukeka kanjani ukudwetshwa kabusha

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

Ngenxa yalokho, ngokulungiselela kahle komhlanganisi wosayizi wememori -Os inikwe amandla, isithombe selabhulali sivele saba ngu-3.5 MB, okuyinto engangeni kwimemori eyinhloko ye-STM32F746. Njengoba sesike sabhala kwenye indatshana yethu mayelana ne-OpenCV, leli bhodi linakho:

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

Njengoba ukusekelwa kokufaka ikhodi evela ku-QSPI sekungeziwe ku-OpenCV, sinqume ukuqala ngokulayisha sonke isithombe se-Embox c Qt ku-QSPI. Futhi ngokushesha, yonke into yaqala cishe ngokushesha kusuka ku-QSPI! Kepha njengasendabeni ye-OpenCV, kwavela ukuthi isebenza kancane kakhulu.

Ihambisa i-Qt ku-STM32

Ngakho-ke, sinqume ukukwenza ngale ndlela - okokuqala sikopisha isithombe ku-QSPI, bese sisilayisha ku-SDRAM bese sisenza sisuka lapho. Kusuka ku-SDRAM kube ngokushesha, kodwa kusekude ne-QEMU.

Ihambisa i-Qt ku-STM32

Okulandelayo, kube nombono wokufaka iphoyinti elintantayo - phela, i-Qt yenza izibalo zezixhumanisi zezikwele ku-animation. Sizamile, kodwa lapha asitholanga noma yikuphi ukusheshisa okubonakalayo, nakuba kuphakathi isihloko Abathuthukisi be-Qt bathi i-FPU inikeza ukwanda okukhulu kwejubane β€œlokudonsa izithombe” kusikrini esithintwayo. Kungase kube nezibalo ezincane kakhulu zamaphuzu antantayo kuma-moveblocks, futhi lokhu kuncike esibonelweni esithile.

Umbono osebenza kahle kakhulu bekuwukuhambisa i-framebuffer isuka ku-SDRAM iye kumemori yangaphakathi. Ukwenza lokhu, asenze ubukhulu besikrini hhayi 480x272, kodwa 272x272. Siphinde sehlisa ukujula kombala kusuka ku-A8R8G8B8 kuya ku-R5G6B5, ngaleyo ndlela sehlisa usayizi wephikseli eyodwa ukusuka ku-4 kuya ku-2 bytes. Usayizi we-framebuffer owumphumela ungu-272 * 272 * 2 = 147968 bytes. Lokhu kunikeze ukusheshisa okukhulu, mhlawumbe okuphawuleka kakhulu, ukugqwayiza kwacishe kwashelela.

Ukulungiselela kwakamuva bekuwukusebenzisa ikhodi ye-Embox esuka ku-RAM kanye nekhodi ye-Qt evela ku-SDRAM. Ukuze senze lokhu, siqala, njengenjwayelo, sixhumanise i-Emboks kanye ne-Qt ngokwezibalo, kodwa sibeka umbhalo, i-rodata, idatha kanye nezingxenye ze-bss zelabhulali ku-QSPI ukuze sikukopishele ku-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))

Ngokusebenzisa ikhodi ye-Embox evela ku-ROM, siphinde sathola ukusheshisa okubonakalayo. Ngenxa yalokho, i-animation ibonakale ishelela kakhulu:


Ekugcineni, ngenkathi silungiselela i-athikili futhi sizama ukucushwa okuhlukile kwe-Embox, kuvele ukuthi ama-moveblocks e-Qt asebenza kahle ukusuka ku-QSPI nge-framebuffer ku-SDRAM, futhi ibhodlela lalilingana ngqo nosayizi we-framebuffer! Ngokusobala, ukuze unqobe "umbukiso wesilayidi" wokuqala, ukusheshisa okuphindwe kabili kwakwanele ngenxa yokunciphisa ibhanali kusayizi wefreyimu. Kodwa kwakungenakwenzeka ukufeza umphumela onjalo ngokudlulisela kuphela ikhodi ye-Embox ezinkumbulo ezihlukahlukene ezisheshayo (i-speedup yayingeyona 2, kodwa izikhathi ezingaba ngu-2).

Ungazama kanjani ngokwakho

Uma une-STM32F7-Discovery, ungasebenzisa i-Qt ngaphansi kwe-Embox ngokwakho. Ungafunda ukuthi lokhu kwenziwa kanjani esihlokweni sethu wiki.

isiphetho

Ngenxa yalokho, sikwazile ukwethula i-Qt! Ubunkimbinkimbi bomsebenzi, ngokombono wethu, buyihaba ngandlela-thile. Ngokwemvelo, udinga ukunaka okucacisiwe kwama-microcontrollers futhi uqonde ngokujwayelekile ukwakheka kwezinhlelo zamakhompiyutha. Imiphumela yokuthuthukisa ikhomba eqinisweni elaziwayo lokuthi ibhodlela ohlelweni lwekhompiyutha akuyona iprosesa, kodwa inkumbulo.

Kulo nyaka sizohlanganyela emkhosini I-TechTrain. Lapho sizokutshela kabanzi futhi sibonise i-Qt, i-OpenCV kuma-microcontroller kanye nezinye izimpumelelo zethu.

Source: www.habr.com

Engeza amazwana