Barka da rana Muna cikin aikin ƙaddamar da Qt akan STM32F7-Discovery kuma yana son yin magana game da shi. Tun da farko, mun riga mun faɗi yadda muka yi nasarar ƙaddamarwa .
Qt tsarin tsarin giciye ne wanda ya haɗa da ba kawai abubuwan haɗin hoto ba, har ma da abubuwa kamar QtNetwork, saitin azuzuwan aiki tare da bayanan bayanai, Qt don Automation (gami da aiwatar da IoT) da ƙari mai yawa. Qtungiyar Qt ta kasance mai himma game da amfani da Qt a cikin tsarin da aka haɗa, don haka ɗakunan karatu suna da sauƙin daidaitawa. Koyaya, har zuwa kwanan nan, mutane kaɗan sun yi tunanin jigilar Qt zuwa microcontrollers, mai yiwuwa saboda irin wannan aikin yana da wahala - Qt babba ne, MCUs ƙanana ne.
A gefe guda, a halin yanzu akwai microcontrollers da aka tsara don yin aiki tare da multimedia kuma sun fi na farko Pentiums. Kusan shekara guda da ta wuce, shafin Qt ya bayyana . Masu haɓakawa sun yi tashar jiragen ruwa na Qt don RTEMS OS, kuma sun ƙaddamar da misalai tare da widget a kan alluna da yawa da ke gudana stm32f7. Wannan sha'awar mu. Ya kasance sananne, kuma masu haɓakawa da kansu sun rubuta game da shi, cewa Qt yana jinkirin akan STM32F7-Discovery. Muna mamakin ko za mu iya gudanar da Qt a ƙarƙashin Embox, kuma ba kawai zana widget din ba, amma gudanar da motsin rai.
An aika Qt 4.8 zuwa Embox na dogon lokaci, don haka mun yanke shawarar gwada shi. Mun zaɓi aikace-aikacen motsi - misali na rayarwa na springy.
Matsalolin Qt akan QEMU
Da farko, muna saita Qt, idan zai yiwu, tare da mafi ƙarancin saitin abubuwan da ake buƙata don tallafawa rayarwa. Don wannan akwai zaɓi "-qconfig ƙarancin, ƙarami, matsakaici ...". Yana haɗa fayil ɗin sanyi daga Qt tare da macros da yawa - abin da za a kunna / abin da za a kashe. Bayan wannan zaɓin, muna ƙara wasu tutoci zuwa tsarin daidaitawa idan muna son musaki wani abu dabam. Ga misalin mu .
Domin Qt yayi aiki, kuna buƙatar ƙara Layer mai dacewa da OS. Hanya ɗaya ita ce aiwatar da QPA (Qt Platform Abstraction). Mun ɗauki tushen tushen fb_base plugin ɗin da aka haɗa a cikin Qt, akan abin da QPA don Linux ke aiki. Sakamakon shine ƙaramin plugin ɗin da ake kira emboxfb, wanda ke ba da Qt tare da framebuffer na Embox, sannan ya zana wurin ba tare da wani taimako na waje ba.
Wannan shine abin da ƙirƙirar plugin yayi kama
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();
}
Kuma wannan shine abin da redrawing zai yi kama
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;
}
Sakamakon haka, tare da haɓakawa na haɓaka don girman ƙwaƙwalwar ajiya -Os yana kunna, hoton ɗakin karatu ya zama 3.5 MB, wanda ba shakka bai dace da babban ƙwaƙwalwar ajiyar STM32F746 ba. Kamar yadda muka riga muka rubuta a cikin sauran labarinmu game da OpenCV, wannan hukumar tana da:
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
Tunda an riga an ƙara goyan bayan aiwatar da lamba daga QSPI zuwa OpenCV, mun yanke shawarar farawa ta loda dukkan hoton Embox c Qt cikin QSPI. Kuma sauri, komai ya fara kusan nan da nan daga QSPI! Amma kamar a cikin yanayin OpenCV, ya zama cewa yana aiki a hankali.

Saboda haka, mun yanke shawarar yin hakan ta wannan hanya - da farko za mu kwafi hoton zuwa QSPI, sannan mu loda shi cikin SDRAM kuma mu aiwatar daga can. Daga SDRAM ya zama ɗan sauri, amma har yanzu nesa da QEMU.

Bayan haka, akwai ra'ayin haɗawa da wurin iyo - bayan haka, Qt yana yin wasu ƙididdiga na daidaitawar murabba'ai a cikin rayarwa. Mun yi ƙoƙari, amma a nan ba mu sami wani hanzari na bayyane ba, kodayake a cikin Masu haɓaka Qt sun yi iƙirarin cewa FPU yana ba da gagarumin haɓaka cikin sauri don "jawo rayarwa" akan allon taɓawa. Akwai yuwuwar samun ƙarancin ƙididdige ƙididdiga masu iyo a cikin shingen motsi, kuma wannan ya dogara da takamaiman misali.
Mafi inganci ra'ayin shine don matsar da framebuffer daga SDRAM zuwa ƙwaƙwalwar ajiyar ciki. Don yin wannan, mun sanya girman allo ba 480x272 ba, amma 272x272. Mun kuma saukar da zurfin launi daga A8R8G8B8 zuwa R5G6B5, don haka rage girman pixel ɗaya daga 4 zuwa 2 bytes. Sakamakon girman framebuffer shine 272 * 272 * 2 = 147968 bytes. Wannan ya ba da gagarumin hanzari, watakila mafi mahimmanci, raye-rayen ya zama kusan santsi.
Sabbin ingantawa shine gudanar da lambar Embox daga RAM da lambar Qt daga SDRAM. Don yin wannan, da farko, kamar yadda muka saba, muna haɗa Embox a tsaye tare da Qt, amma muna sanya rubutu, rodata, bayanai da bss sassan ɗakin karatu a cikin QSPI don mu kwafa shi zuwa 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))
Ta hanyar aiwatar da lambar Embox daga ROM, mun kuma sami ingantaccen hanzari. A sakamakon haka, raye-rayen ya zama mai santsi:

A ƙarshe, yayin da ake shirya labarin da ƙoƙarin jeri na Embox daban-daban, ya nuna cewa ƙaƙƙarfan motsi na Qt yana aiki da kyau daga QSPI tare da framebuffer a cikin SDRAM, kuma ƙwanƙolin ya kasance daidai girman framebuffer! A bayyane yake, don shawo kan “slideshow” na farko, haɓakar ninki biyu ya isa saboda raguwar banal a cikin girman framebuffer. Amma ba zai yiwu a cimma irin wannan sakamakon ba ta hanyar canja wurin kawai lambar Embox zuwa ƙwaƙwalwar ajiyar sauri daban-daban (hanzarta ba 2 ba, amma game da sau 2).
Yadda zaka gwada da kanka
Idan kana da STM32F7-Discovery, zaka iya gudanar da Qt a ƙarƙashin Embox da kanka. Kuna iya karanta yadda ake yin hakan akan mu .
ƙarshe
Sakamakon haka, mun sami nasarar ƙaddamar da Qt! Rukunin aikin, a ra'ayinmu, an ɗan wuce gona da iri. A zahiri, kuna buƙatar yin la'akari da ƙayyadaddun abubuwan microcontrollers kuma gabaɗaya fahimtar gine-ginen tsarin kwamfuta. Sakamakon ingantawa yana nuna sanannen gaskiyar cewa ƙwanƙwasa a cikin tsarin kwamfuta ba shine mai sarrafawa ba, amma ƙwaƙwalwar ajiya.
A wannan shekara za mu shiga cikin bikin . A can za mu gaya muku dalla-dalla kuma mu nuna Qt, OpenCV akan microcontrollers da sauran nasarorinmu.
source: www.habr.com
