Feasgar math Tha sinn sa phròiseact Qt a chuir air bhog air STM32F7-Discovery agus bu mhath leotha bruidhinn mu dheidhinn. Na bu thrĂ ithe, dhâ innis sinn mu thrĂ th mar a chaidh againn air cur air bhog .
Tha Qt na fhrèam tar-Ă rd-Ăšrlar a tha aâ toirt a-steach chan e a-mhĂ in co-phĂ irtean grafaigeach, ach cuideachd rudan leithid QtNetwork, seata de chlasaichean airson a bhith ag obair le stòran-dĂ ta, Qt airson Automation (a âtoirt a-steach buileachadh IoT) agus mòran a bharrachd. Tha an sgioba Qt air a bhith for-ghnĂŹomhach mu bhith aâ cleachdadh Qt ann an siostaman freumhaichte, agus mar sin tha na leabharlannan gu math furasta an rèiteachadh. Ach, gu o chionn ghoirid, cha robh mòran dhaoine a 'smaoineachadh mu bhith a' giĂšlain Qt gu microcontrollers, is dòcha air sgĂ th 's gu bheil coltas gu bheil an leithid de dh' obair duilich - tha Qt mòr, tha MCUn beag.
Air an lĂ imh eile, aig an Ă m seo tha microcontrollers air an dealbhadh gus obrachadh le ioma-mheadhan agus nas fheĂ rr na a âchiad Pentiums. Mu bhliadhna air ais, nochd am blog Qt . Rinn an luchd-leasachaidh port de Qt airson an RTEMS OS, agus chuir iad air bhog eisimpleirean le widgets air grunn bhĂšird aâ ruith stm32f7. Bha seo aâ toirt Ăšidh dhuinn. Bha e follaiseach, agus tha an luchd-leasachaidh fhèin a 'sgrĂŹobhadh mu dheidhinn, gu bheil Qt slaodach air an STM32F7-Discovery. Bha sinn aâ faighneachd am bâ urrainn dhuinn Qt a ruith fo Embox, agus chan e a-mhĂ in widget a tharraing, ach beòthalachd a ruith.
Tha Qt 4.8 air a bhith air a ghluasad gu Embox airson Úine mhòr, agus mar sin chuir sinn romhainn feuchainn air. Thagh sinn an tagradh moveblocks - eisimpleir de bheòthalachd springy.
Qt moveblocks air QEMU
An toiseach, bidh sinn aâ rèiteachadh Qt, ma ghabhas e dèanamh, leis an t-seata as lugha de cho-phĂ irtean a dhâ fheumar gus taic a thoirt do bheòthalachd. Airson seo tha roghainn â-qconfig minimal, beag, meadhanach ....â. Bidh e a 'ceangal faidhle rèiteachaidh bho Qt le mòran macros - dè a nĂŹ thu comasach / dè a dhĂŹ-chomasachadh. Ăs deidh an roghainn seo, cuiridh sinn brataichean eile ris an rèiteachadh ma tha sinn airson rudeigin eile a chuir dheth. Seo eisimpleir de ar .
Gus an obraich Qt, feumaidh tu còmhdach co-chòrdalachd OS a chuir ris. Is e aon dhòigh air QPA (Qt Platform Abstraction) a chuir an gnĂŹomh. Ghabh sinn mar bhunait ris aâ plugan fb_base deiseil a tha air a ghabhail a-steach ann an Qt, air a bheil QPA airson Linux ag obair. Is e an toradh seo plugan beag ris an canar emboxfb, a bheir frèam-buffer Embox dha Qt, agus an uairsin bidh e aâ tarraing an sin gun chuideachadh bhon taobh a-muigh.
Seo mar a tha cruthachadh plugan coltach
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();
}
Agus is e seo cò ris a bhios an ath-dhealbhadh coltach
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;
}
Mar thoradh air an sin, leis an optimization compiler airson meud cuimhne -Os air a chomasachadh, thionndaidh ĂŹomhaigh an leabharlainn gu bhith 3.5 MB, rud nach eil gu dearbh a âfreagairt air prĂŹomh chuimhne an STM32F746. Mar a sgrĂŹobh sinn mu thrĂ th san artaigil eile againn mu OpenCV, tha am bòrd seo air:
- 1 MB ROM
- 320 KB de RAM
- 8 MB de SDRAM
- 16 MB QSPI
Leis gu bheil taic airson còd a chuir an gnĂŹomh bho QSPI air a chuir ri OpenCV mu thrĂ th, chuir sinn romhainn tòiseachadh le bhith aâ luchdachadh an ĂŹomhaigh Embox c Qt gu lèir gu QSPI. Agus Hurray, thòisich a h-uile cĂ il cha mhòr sa bhad bho QSPI! Ach mar ann an cĂšis OpenCV, thionndaidh e a-mach gu bheil e ag obair ro shlaodach.

Mar sin, chuir sinn romhainn a dhèanamh mar seo - an toiseach bidh sinn aâ dèanamh lethbhreac den ĂŹomhaigh gu QSPI, an uairsin ga luchdachadh gu SDRAM agus ga chuir an gnĂŹomh Ă s an sin. Bho SDRAM dh'fhĂ s e beagan na bu luaithe, ach fhathast fada bho QEMU.

An ath rud, bha beachd ann puing-fleòdraidh a ghabhail a-steach - Ă s deidh a h-uile cĂ il, bidh Qt aâ dèanamh beagan Ă ireamhachadh de cho-chomharran cheĂ rnagan ann am beothachadh. Dh'fheuch sinn, ach an seo cha d 'fhuair sinn luathachadh faicsinneach sam bith, ged a bha sinn a-staigh Thuirt luchd-leasachaidh Qt gu bheil FPU aâ toirt Ă rdachadh mòr ann an astar airson âtarraing beòthalachdâ air touchscreen. Is dòcha gu bheil mòran nas lugha de Ă ireamhachadh puing-fleòdraidh ann am blocaichean gluasad, agus tha seo an urra ris an eisimpleir shònraichte.
Bâ e am beachd a bâ èifeachdaiche am bufair frèam a ghluasad bho SDRAM gu cuimhne a-staigh. Gus seo a dhèanamh, rinn sinn na tomhasan sgrion chan e 480x272, ach 272x272. LĂšghdaich sinn cuideachd an doimhneachd dath bho A8R8G8B8 gu R5G6B5, mar sin aâ lughdachadh meud aon piogsail bho 4 gu 2 bytes. Is e meud frèam bufair mar thoradh air sin 272 * 272 * 2 = 147968 bytes. Thug seo luathachadh mòr, is dòcha gu sònraichte, dh'fhĂ s am beòthalachd cha mhòr rèidh.
B âe an optimization as Ăšire còd Embox a ruith bho RAM agus còd Qt bho SDRAM. Gus seo a dhèanamh, bidh sinn an-toiseach, mar as Ă bhaist, aâ ceangal Embox gu staitigeach ri Qt, ach bidh sinn aâ cur earrannan teacsa, rodata, dĂ ta agus bss den leabharlann ann an QSPI gus an dèan sinn lethbhreac dheth gu 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))
Le bhith aâ cur an gnĂŹomh còd Embox bho ROM, fhuair sinn luathachadh follaiseach cuideachd. Mar thoradh air an sin, thionndaidh am beòthalachd gu math rèidh:

Aig aâ cheann thall, fhad âs a bha e ag ullachadh an artaigil agus aâ feuchainn diofar rèiteachaidhean Embox, thionndaidh e a-mach gu bheil Qt moveblocks ag obair gu math bho QSPI le frèam bufair ann an SDRAM, agus bha am botail dĂŹreach meud an fhrèam bufair! A rèir coltais, gus faighinn thairis air aâ chiad âtaisbeanadh-shleamhnaganâ, bha luathachadh dĂ -fhillte gu leòr mar thoradh air lughdachadh banal ann am meud an fhrèam bufair. Ach cha robh e comasach a leithid de thoradh a choileanadh le bhith a 'gluasad a' chòd Embox a-mhĂ in gu diofar chuimhneachain luath (cha robh an luaths 2, ach mu 2 uair).
Mar a nÏ thu feuchainn leat fhèin
Ma tha STM32F7-Discovery agad, faodaidh tu Qt a ruith fo Embox thu fhèin. Faodaidh tu leughadh mar a tha seo air a dhèanamh air ar .
co-dhĂšnadh
Mar thoradh air an sin, chaidh againn air Qt! Tha iom-fhillteachd na h-obrach, nar beachd, rudeigin a 'dèanamh cus iomadachd. Gu nĂ darra, feumaidh tu aire a thoirt do mhion-fhiosrachadh microcontrollers agus san fharsaingeachd tuigsinn ailtireachd siostaman coimpiutair. Tha na toraidhean optimization aâ nochdadh gu bheil fios againn nach e am pròiseasar a thâ anns aâ bhotail ann an siostam coimpiutaireachd, ach an cuimhne.
Am-bliadhna bidh sinn aâ gabhail pĂ irt anns an fhèis . An sin innsidh sinn dhut nas mionaidiche agus seallaidh sinn Qt, OpenCV air microcontrollers agus na coileanaidhean eile againn.
Source: www.habr.com
