Нимирӯзи ба хайр Мо дар лоиҳа ҳастем Qt-ро дар STM32F7-Discovery оғоз кард ва мехостам дар бораи он сӯҳбат кунем. Пештар, мо аллакай гуфта будем, ки чӣ гуна ба мо муяссар шуд .
Qt як чаҳорчӯбаи кросс-платформаест, ки на танҳо ҷузъҳои графикӣ, балки чунин чизҳоро низ дар бар мегирад, ба монанди QtNetwork, маҷмӯи дарсҳо барои кор бо пойгоҳи додаҳо, Qt барои автоматизатсия (аз ҷумла барои татбиқи IoT) ва ғайра. Дастаи Qt дар бораи истифодаи Qt дар системаҳои дарунсохт фаъол буд, бинобар ин китобхонаҳо хеле танзимшавандаанд. Бо вуҷуди ин, то ба наздикӣ, чанд нафар дар бораи интиқоли Qt ба микроконтроллерҳо фикр мекарданд, шояд аз он сабаб, ки чунин вазифа душвор ба назар мерасад - Qt калон аст, MCUs хурд аст.
Аз тарафи дигар, дар айни замон микроконтроллерҳо мавҷуданд, ки барои кор бо мултимедия тарҳрезӣ шудаанд ва аз аввалин Pentiumҳо бартарӣ доранд. Тақрибан як сол пеш блоги Qt пайдо шуд . Таҳиягарон бандари Qt-ро барои RTEMS OS сохтанд ва намунаҳоро бо виджетҳо дар якчанд тахтаҳои stm32f7 оғоз карданд. Ин ба мо таваҷҷӯҳ кард. Ин назаррас буд, ва худи таҳиягарон дар бораи он менависанд, ки Qt дар STM32F7-Discovery суст аст. Мо дар ҳайрат будем, ки оё мо метавонем Qt-ро зери Embox иҷро кунем ва на танҳо виджетро кашем, балки аниматсияро иҷро кунем.
Qt 4.8 муддати тӯлонӣ ба Embox интиқол дода шудааст, аз ин рӯ мо тасмим гирифтем, ки онро дар он санҷем. Мо барномаи moveblocks-ро интихоб кардем - як мисоли аниматсияҳои баҳорӣ.
Moveblocks Qt дар QEMU
Барои оғози кор, мо Qt-ро, агар имконпазир бошад, бо ҳадди ақали ҷузъҳои зарурӣ барои дастгирии аниматсия танзим мекунем. Барои ин як варианти "-qconfig минималӣ, хурд, миёна..." мавҷуд аст. Он файли конфигуратсияро аз Qt бо макросҳои зиёде мепайвандад - он чиро фаъол кардан мумкин аст / чӣ хомӯш карда шавад. Пас аз ин интихоб, мо ба конфигуратсия парчамҳои дигар илова мекунем, агар мо хоҳем, ки чизи дигареро хомӯш кунем. Ана як мисоли мо .
Барои он ки Qt кор кунад, шумо бояд қабати мутобиқати OS илова кунед. Яке аз роҳҳо татбиқи QPA (Qt Platform Abstraction) мебошад. Мо плагини тайёри fb_base-ро ба Qt дохил кардем, ки дар асоси он QPA барои Linux кор мекунад. Дар натиҷа як Васлкунаки хурд бо номи emboxfb аст, ки Qt бо Framebuffer Embox таъмин, ва он гоҳ он ҷо ҷалб бе ягон кӯмаки беруна.
Ин аст он чизе ки сохтани плагин ба назар мерасад
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 МБ шуд, ки албатта ба хотираи асосии STM32F746 мувофиқат намекунад. Тавре ки мо аллакай дар мақолаи дигари худ дар бораи OpenCV навиштем, ин тахта дорои:
- 1 МБ ROM
- 320 KB RAM
- SDRAM 8 МБ
- 16 МБ QSPI
Азбаски дастгирӣ барои иҷро кардани код аз QSPI аллакай ба OpenCV илова карда шудааст, мо тасмим гирифтем, ки бо бор кардани тамоми тасвири Embox c Qt ба QSPI оғоз кунем. Ва ҳа, ҳама чиз қариб фавран аз QSPI оғоз шуд! Аммо чун дар мавриди OpenCV, маълум шуд, ки он хеле суст кор мекунад.

Аз ин рӯ, мо тасмим гирифтем, ки ин корро кунем - аввал мо тасвирро ба QSPI нусхабардорӣ мекунем, сипас онро ба SDRAM бор мекунем ва аз он ҷо иҷро мекунем. Аз SDRAM он каме тезтар шуд, вале ба ҳар ҳол аз QEMU дур.

Баъдан, идеяи дохил кардани нуқтаи шинокунанда вуҷуд дошт - дар ниҳоят, Qt баъзе ҳисобҳои координатаҳои квадратҳоро дар аниматсия мекунад. Мо кӯшиш кардем, аммо дар ин ҷо мо суръатбахшии намоёнро ба даст наовардем, гарчанде ки дар Таҳиягарони Qt иддао карданд, ки FPU суръатро барои "кашидани аниматсия" дар экрани сенсорӣ ба таври назаррас афзоиш медиҳад. Мумкин аст, ки ҳисобҳои нуқтаи шинокунанда дар блокҳо ба таври назаррас камтар бошанд ва ин аз мисоли мушаххас вобаста аст.
Идеяи аз ҳама самаранок интиқол додани фреймбуфер аз SDRAM ба хотираи дохилӣ буд. Барои ин мо андозаи экранро на 480x272, балки 272x272 кардем. Мо инчунин умқи рангро аз A8R8G8B8 то R5G6B5 паст кардем ва ҳамин тавр андозаи як пикселро аз 4 то 2 байт кам кардем. Андозаи фреймбуфери натиҷавӣ 272 * 272 * 2 = 147968 байт аст. Ин суръатбахшии назаррасро дод, шояд аз ҳама назаррас, аниматсия қариб ҳамвор шуд.
Оптимизатсияи охирин ин буд, ки рамзи Embox аз RAM ва рамзи Qt аз SDRAM иҷро карда шавад. Барои ин, мо аввал, чун маъмул, Embox-ро бо Qt ба таври статикӣ пайваст мекунем, аммо мо матн, rodata, додаҳо ва сегментҳои китобхонаро дар QSPI ҷойгир мекунем, то онро ба 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))
Бо иҷро кардани рамзи Embox аз ROM, мо инчунин суръатбахшии назаррас гирифтем. Дар натиҷа, аниматсия хеле ҳамвор шуд:

Дар ниҳоят, ҳангоми омода кардани мақола ва кӯшиши конфигуратсияҳои гуногуни Embox, маълум шуд, ки ҳаракат блокҳои Qt аз QSPI бо фреймбуфер дар SDRAM аъло кор мекунанд ва монеа маҳз ба андозаи чаҳорчӯба буд! Эҳтимол, барои бартараф кардани "слайд-шоуи" аввалия суръатбахшии 2-карата аз ҳисоби кам кардани андозаи чаҳорчӯба кифоя буд. Аммо бо интиқол додани танҳо рамзи Embox ба хотираҳои гуногуни зуд ба чунин натиҷа ноил шудан ғайриимкон буд (шитоб на 2, балки тақрибан 1.5 маротиба).
Чӣ тавр онро худатон санҷед
Агар шумо як STM32F7-Discovery дошта бошед, шумо метавонед Qt-ро дар зери Embox худатон иҷро кунед. Шумо метавонед ин корро дар мо хонед .
хулоса
Дар натиҷа, мо тавонистем Qt-ро оғоз кунем! Мураккаб будани вазифа, ба фикри мо, то андозае муболига карда шудааст. Табиист, ки шумо бояд хусусиятҳои микроконтроллерҳоро ба назар гиред ва умуман меъмории системаҳои компютериро фаҳмед. Натиҷаҳои оптимизатсия ба далели маълум нишон медиҳанд, ки мушкилот дар системаи ҳисоббарорӣ на протсессор, балки хотира аст.
Имсол мо дар фестиваль иштирок мекунем . Дар он ҷо мо ба шумо муфассалтар маълумот медиҳем ва Qt, OpenCV-ро дар микроконтроллерҳо ва дастовардҳои дигари моро нишон медиҳем.
Манбаъ: will.com
