Aloha awakea, Aloha Auinalā Aia mākou i ka papahana
ʻ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
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 QEMU
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
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.
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.
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
ʻ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
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
Source: www.habr.com