áááºá¹ááá¬áá±á·áááºáááºážáá« áá»áœááºáá±á¬áºááá¯á·á ááá±á¬áá»ááºáá²ááŸá¬ ááŸááááºá
Qt ááẠááááºáá
áºááá¯ááºáᬠá¡á
áááºá¡ááá¯ááºážáá»á¬ážáá¬áá QtNetworká áá±áá¬áá±á·á
áºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠá¡áááºážá¡á
á¯á¶á Qt for Automation (IoT á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ á¡áá«á¡áááº) ááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬áž áá«áááºáááºá Qt á¡ááœá²á·ááẠááŒáŸá¯ááºááœááºážáá¬ážáá±á¬á
áá
áºáá»á¬ážááœáẠQt ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŸáá·áºáááºáááºá áááºááŒáœá
áœá¬áá¯ááºáá±á¬ááºáá±áá±á¬ááŒá±á¬áá·áº á
á¬ááŒáá·áºááá¯ááºáá»á¬ážááẠááŒá¯ááŒááºáááºáá®ážááá¯ááºááŸá¯á¡áá±á¬áºá¡áááºááŸááááºá ááá¯á·áá±á¬áºá áááŒá¬áá±ážáá®á¡áá áá°á¡áááºážáááºá Qt ááᯠááá¯ááºáááá¯ááœááºáááá¯áá¬áá»á¬ážááá¯á· ááá¯á·ááẠá
ááºážá
á¬ážáá²á·áá±á¬áºáááºážá ááá¯ááá¯á·áá±á¬á¡áá¯ááºááŸá¬ áááºáá²áá¯á¶áá±á«áºáá±á¬ááŒá±á¬áá·áº ááŒá
áºááá¯ááºááẠ- Qt ááẠááŒá®ážáá¬ážáááºá MCU áá»á¬ážááẠáá±ážáááºáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá
á¡ááŒá¬ážáá
áºáááºááœááºá ááá¯á¡áá»áááºááœáẠmultimedia áá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáááºáá®ááá¯ááºážáá¯ááºáá¬ážáá±á¬ microcontroller áá»á¬ážááŸáááŒá®ážááá Pentiums áá»á¬ážáááºáá¬ááœááºáááºá ááœááºáá²á·áá±á¬ áá
áºááŸá
áºááá·áºá Qt ááá±á¬á·áẠáá±á«áºáá¬áááºá
Qt 4.8 ááᯠEmbox ááá¯á· ááá¯á·áá¬ážáááºááŸá¬ ááŒá¬áá«ááŒá®á ááá¯á·ááŒá±á¬áá·áº áááºážááᯠá ááºážááŒáá·áºááẠáá¯á¶ážááŒááºááá¯ááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠááœá±áŠážá¡ááºáá®áá±ážááŸááºážá á¥ááá¬áá áºáá¯ááŒá áºááá·áº moveblocks á¡ááºááºááᯠááœá±ážáá»ááºáá²á·áááºá
QEMU ááŸá Qt ááœáŸá±á·ááœááºáá»á¬áž
á
áááºáááºá áá»áœááºá¯ááºááá¯á·ááẠáá¬ááœááºážáá¯ááºááŒááŸá¯ááᯠáá¶á·ááá¯ážáááºá¡ááœáẠááŒá
áºááá¯ááºáá»áŸáẠá¡áááºážáá¯á¶áž á¡á
áááºá¡ááá¯ááºážá¡á
á¯á¶ááŒáá·áº Qt ááᯠááŒááºáááºáááºááŸááºáá«áááºá áááºážá¡ááœáẠâ-qconfig minimalásmallámediumâŠâ ááœá±ážá
áá¬áá
áºáá¯ááŸááááºá áááºážááẠQt á០configuration ááá¯ááºááᯠmacros á¡áá»á¬ážá¡ááŒá¬ážááŒáá·áº áá»áááºáááºáá±ážááẠ- áááºááá·áºá¡áá¬ááá¯ááœáá·áºáááẠ/ ááááºáá¬ážáááá·áºá¡áá¬á á€ááœá±ážáá»ááºááŸá¯ááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá¬ážáá
áºáá¯áá¯ááᯠááááºááá¯áá«á áááºááŸááºááœá²á·á
ááºážááŸá¯ááœáẠá¡ááŒá¬ážá¡áá¶áá»á¬ážááᯠáá±á«ááºážááá·áºáá«áááºá á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á á¥ááá¬áá
áºáá¯ááŒá
áºáááºá
Qt á¡áá¯ááºáá¯ááºáááºá¡ááœáẠáááºááẠOS ááá¯ááºáááºáá®áá±á¬ á¡ááœáŸá¬áá áºáá¯ááᯠááá·áºááẠááá¯á¡ááºáááºá áááºážáááºážáá áºáá¯ááŸá¬ QPA (Qt Platform Abstraction) ááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºáááºááŒá áºáááºá Linux á¡ááœáẠQPA ááᯠá¡ááŒá±áá¶á Qt ááœáẠáá«áááºáá±á¬ á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ fb_base ááááºá¡ááºááᯠá¡ááŒá±áá¶á¡ááŒá Ạáá»áœááºá¯ááºááá¯á·áá°áá±á¬ááºáá²á·áááºá ááááºááŸá¬ Embox á framebuffer ááŒáá·áº Qt ááᯠáá¶á·ááá¯ážáá±ážááá·áº emboxfb áá¯áá±á«áºáá±á¬ ááááºá¡ááºá¡áá±ážáá áºáá¯ááŒá áºááŒá®ážá ááá¯á·áá±á¬áẠáááºážááẠááŒááºáá¡áá°á¡áá®ááá«áá² áááºážááᯠááœá²áá¯ááºáááºá
áááºážááẠááááºá¡ááºáá áºáᯠáááºáá®ážáá¯á¶ááŸáá·áº áá°áááºá
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();
}
á€áááºááŸá¬ ááŒááºáááºáá±ážááœá²ááá·áºáá¯á¶á á¶ááŒá áºáááºá
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;
}
ááááºá¡áá±ááŸáá·áºá áááºááá¯áá®á¡ááœááºá¡á á¬áž-Os á¡ááœáẠááœááºááá±á¬áºááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážááŒáá·áºá á á¬ááŒáá·áºááá¯ááºáá¯á¶ááẠ3.5 MB ááŒá áºááœá¬ážáááºá áááºážááẠSTM32F746 ááááºáááŸááºáá¬ááºááŸáá·áº áááá¯ááºáá®áá«á OpenCV á¡ááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·á á¡ááŒá¬ážáá±á¬ááºážáá«ážááœáẠáá±ážáá¬ážááŒá®ážááŒá áºááá·áºá¡ááá¯ááºážá á€áá¯ááºááœááº-
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
QSPI á០áá¯ááºáá¯ááºáá±á¬ááºááŒááºážá¡ááœáẠá¡áá±á¬ááºá¡áá¶á·ááᯠOpenCV ááœáẠááá·áºááœááºážáá¬ážááŒá®ážááŒá áºáá±á¬ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠEmbox c Qt áá¯á¶áá áºáá¯áá¯á¶ážááᯠQSPI áá²ááá¯á· ááá·áºááœááºážááŒááºážááŒáá·áº á áááºááẠáá¯á¶ážááŒááºáá²á·áááºá ááŒááºááŒááºá á¡áá¬á¡á¬ážáá¯á¶áž QSPI á០áá»ááºáá»ááºážáá®ážáá«áž á áááºáá²á·áááºá ááá¯á·áá±á¬áº OpenCV áááá á¹á ááœááºáá²á·ááá¯á·áááºážáááºááŸá±ážááœá±ážá áœá¬á¡áá¯ááºáá¯ááºááŒá±á¬ááºážááœá±á·ááŸááá²á·áááºá
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á· áá«ááá¯áá¯ááºáá±á¬ááºááẠáá¯á¶ážááŒááºáá²á·ááẠ- áŠážá
áœá¬ áá»áœááºá¯ááºááá¯á·ááẠáá¯á¶ááᯠQSPI ááá¯á· áá°ážáá°ááŒá®áž áááºážááᯠSDRAM ááœáẠáááºááŒá®áž ááá¯áá±áá¬á០áá¯ááºáá±á¬ááºáá«áááºá SDRAM á០á¡áááºážááẠááá¯ááŒááºáá¬áá±á¬áºáááºáž QEMU ááŸáá·áº áá±ážáá±áá±ážáááºá
ááá¯á·áá±á¬ááºááœááºá áá±áá±á«áºá¡ááŸááºááᯠááá·áºááœááºážááẠá
áááºáá°ážáá
áºáᯠááŸááá²á·ááẠ- ááŒá®ážáá±á¬ááºá Qt ááẠáá¬ááœááºážáá²ááœáẠáá±ážáá±á¬áá·áºáá¯á¶áá»á¬ážá ááŒáá®ááááºáá»á¬ážááᯠááœááºáá»ááºááŸá¯á¡áá»áá¯á· ááŒá¯áá¯ááºáááºá áá»áœááºá¯ááºááá¯á· ááŒáá¯ážá
á¬ážáá±á¬áºáááºáž á€áá±áá¬ááœáẠááŒááºáá¬áá±á¬ á¡ááŸáááºááᯠááááŸááá²á·áá«á
á¡áááá±á¬ááºáá¯á¶ážá¡ááŒá¶á¥á¬ááºááŸá¬ SDRAM á០framebuffer ááᯠinternal memory ááá¯á·ááœáŸá±á·áááºááŒá áºáááºá áá«ááá¯áá¯ááºááá¯á·á áá»ááºááŸá¬ááŒááºá¡ááá¯ááºážá¡áá¬ááᯠ480x272 ááá¯ááºáá² 272x272 áá²á· ááŒá¯áá¯ááºáá¬ážáá«áááºá á¡áá±á¬ááºá¡ááááºá¡áááºááᯠA8R8G8B8 á០R5G6B5 ááá¯á·áááºáž áá»áŸá±á¬á·áá»áá¬ážáá±á¬ááŒá±á¬áá·áº áá Ạpixel á¡ááœááºá¡á á¬ážááᯠ4 bytes á០2 bytes á¡áá áá»áŸá±á¬á·áá»áá±ážáá«áááºá ááá¬áá²á· framebuffer á¡ááœááºá¡á á¬ážá 272*272*2 = 147968 bytes ááŒá áºáá«áááºá áááºážááẠáááá¬áááºááŸá¬ážáá±á¬ á¡ááŸáááºá¡áá¯ááºááᯠáá±ážá áœááºážááá¯ááºáááºá áááá¬áá¯á¶ážááŸá¬á áá¬ááœááºážááẠáá»á±á¬ááœá±á·áá¯áá®ážáá«áž ááŒá áºáá¬áááºá
áá±á¬ááºáá¯á¶áž ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážááŸá¬ RAM á០Embox áá¯ááºááŸáá·áº SDRAM á០Qt áá¯ááºááá¯á·ááᯠáá¯ááºáá±á¬ááºáááºááŒá áºáááºá áá«ááá¯áá¯ááºááá¯á·á áá¯á¶ážá á¶á¡ááá¯ááºážáá²á ááááŠážá áœá¬ áá»áœááºá¯ááºááá¯á·ááẠEmbox ááᯠQt ááŸáá·áº áááºááŒáááºá áœá¬ áá»áááºáááºáá¬ážáá±á¬áºáááºážá ááá¯á·áá±á¬áẠáááºážááᯠSDRAM ááá¯á·áá°ážáá°áááºá¡ááœáẠá á¬ááŒáá·áºááá¯ááºá á á¬áá¬ážá rodataá áá±áá¬ááŸáá·áº bss á¡ááá¯ááºážáá»á¬ážááᯠQSPI ááœáẠáá¬ážááŸááá«áááºá
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))
ROM á០Embox áá¯ááºááᯠáá¯ááºáá±á¬ááºááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠáááá¬áááºááŸá¬ážáá±á¬ á¡ááŸáááºá¡áá¯ááºááᯠáááŸááá²á·áá«áááºá ááááºá¡áá±ááŒáá·áºá áá¬ááœááºážáá¯ááºáá¯á¶ááẠá¡áá±á¬áºáá±áž áá»á±á¬ááœá±á·áá±áá«áááºá
á¡áá¯á¶ážááœááºá áá±á¬ááºážáá«ážááá¯ááŒááºáááºááŒá®áž ááá°áá®áá±á¬ Embox ááœá²á·á ááºážááŸá¯áá¯á¶á á¶áá»á¬ážááᯠááŒáá¯ážá á¬ážáá±á ááºááœááºá Qt moveblocks áá»á¬ážááẠSDRAM ááœáẠframebuffer ááŒáá·áº QSPI á០áá±á¬ááºážááœááºá áœá¬á¡áá¯ááºáá¯ááºááŒá±á¬ááºážá áááºáááºážááẠframebuffer áá¡ááœááºá¡á á¬ážá¡ááá¡áá»ááŒá áºááẠá áááŠáž "á ááá¯ááºááŸáá¯áž" ááᯠáá»á±á¬áºááœáŸá¬ážáááºá framebuffer á¡ááœááºá¡á á¬ážááᯠbanal áá»áŸá±á¬á·áá»ááŒááºážááŒá±á¬áá·áº 2-á á¡ááŸáááºááŒáá·áº áá¯á¶áá±á¬ááºáá«áááºá ááá¯á·áá±á¬áº Embox áá¯ááºááá¯áᬠááŒááºáááºáá±á¬ááŸááºáá¬ááºá¡áá»áá¯ážáá»áá¯ážááá¯á· ááœáŸá²ááŒá±á¬ááºážááŒááºážááŒáá·áº ááá¯ááá¯á·áá±á¬ááááºááᯠáááŸáááẠáááŒá áºááá¯ááºáá« (á¡ááŸáááºááŸá¯ááºážááŸá¬ 2 ááá¯ááºáá±á¬áºáááºáž 1.5 ááŒáááºááá·áº)á
ááá¯ááºááá¯ááºáááºááá¯ááŒáá¯ážá á¬ážáááá²
ááá·áºááœáẠSTM32F7-Discovery ááŸááá«áá áááºááẠEmbox á¡á±á¬ááºááœáẠQt ááᯠáááºáá¯á¶ážááá¯ááºáááºá á€á¡áá¬ááẠáá»áœááºá¯ááºááá¯á·á á
á¬áá»ááºááŸá¬ááœáẠáááºááá¯á·áá¯ááºáá±á¬ááºáááºááᯠáááºáááºááŸá¯ááá¯ááºáá«áááºá
áá±á¬ááºáá»ááº
ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠQt ááᯠá áááºááá¯ááºáá²á·áááºá á¡áá¯ááºá ááŸá¯ááºááœá±ážááŸá¯ááẠáá»áœááºá¯ááºááá¯á·á¡ááŒááºááœáẠá¡áááºážáááºáá»á²á·áá¬ážáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áááºááẠááá¯ááºáááá¯ááœááºáááá¯áá¬áá»á¬ážá á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááá·áºááœááºážá ááºážá á¬ážáááºááŸáá·áº ááœááºáá»á°áá¬á áá áºáá»á¬ážá áááºáá±á¬ááºáá¯á¶ááᯠáá±áá°áá»áá¬ážáááºááẠááá¯á¡ááºáááºá ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážááááºáá»á¬ážááẠááœááºááŒá°áá¬á áá áºáá áºáá¯ááœáẠááááºááá¯á·áá±ááŒááºážááẠáááá¯áááºáá¬ááá¯ááºáá±á¬áºáááºáž ááŸááºáá¬ááºááŒá áºááŒá±á¬ááºáž áá°áááá»á¬ážáá±á¬á¡áá»ááºááᯠááœáŸááºááŒáááºá
áá®ááŸá
áºááœá²áá±á¬áºááŸá¬ áá»áœááºáá±á¬áºááá¯á· áá«áááºááœá¬ážááŸá¬áá«á
source: www.habr.com