Salama Ao anatin'ny tetikasa izahay
Qt dia rafitra cross-platform izay tsy ahitana singa grafika ihany, fa koa zavatra toy ny QtNetwork, andiana kilasy hiasa amin'ny angon-drakitra, Qt ho an'ny Automation (anisan'izany ny fampiharana IoT) sy ny maro hafa. Ny ekipan'ny Qt dia mavitrika amin'ny fampiasana Qt amin'ny rafitra napetraka, noho izany dia azo amboarina ny tranomboky. Na izany aza, hatramin'ny vao haingana, vitsy ny olona nieritreritra ny handefa Qt amin'ny microcontrollers, angamba satria toa sarotra ny asa toy izany - lehibe ny Qt, kely ny MCU.
Amin'ny lafiny iray, amin'izao fotoana izao dia misy microcontrollers natao hiasa amin'ny multimedia ary ambony noho ny Pentium voalohany. Herintaona teo ho eo izay no niseho ny bilaogy Qt
Qt 4.8 dia nafindra tany amin'ny Embox nandritra ny fotoana ela, ka nanapa-kevitra ny hanandrana azy io izahay. Nisafidy ny fampiharana moveblocks izahay - ohatra amin'ny animation springy.
Qt moveblocks amin'ny QEMU
Hanombohana, amboary ny Qt, raha azo atao, miaraka amin'ireo singa kely indrindra ilaina hanohanana ny animation. Mba hanaovana izany dia misy safidy "-qconfig minimal, small, medium ...". Izy io dia mampifandray rakitra fanamafisana avy amin'ny Qt miaraka amin'ny macros maro - inona no azo atao / inona no ho esorina. Aorian'ity safidy ity dia ampiana saina hafa amin'ny fanitsiana izahay raha te hanala zavatra hafa. Ity misy ohatra ny antsika
Mba hahafahan'ny Qt miasa dia mila manampy sosona mifanaraka amin'ny OS ianao. Fomba iray ny fampiharana ny QPA (Qt Platform Abstraction). Noraisinay ho fototry ny plugin fb_base efa vonona tafiditra ao amin'ny Qt, mifototra amin'ny fiasan'ny QPA ho an'ny Linux. Ny vokatr'izany dia plugin kely antsoina hoe emboxfb, izay manome Qt amin'ny Embox's framebuffer, ary avy eo dia misintona any tsy misy fanampiana avy any ivelany.
Toy izao ny endriky ny famoronana 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();
}
Ary toy izao no ho endriky ny famerenana indray
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;
}
Vokatr'izany, miaraka amin'ny fanamafisana ny compiler ho an'ny haben'ny fahatsiarovana -Os, ny sarin'ny tranomboky dia 3.5 MB, izay mazava ho azy fa tsy mifanaraka amin'ny fahatsiarovana ny STM32F746. Araka ny efa nosoratanay tao amin'ny lahatsoratra hafa momba ny OpenCV, ity tabilao ity dia manana:
- 1 MB ROM
- 320 KB RAM
- 8 MB SDRAM
- 16 MB QSPI
Satria efa nampidirina tao amin'ny OpenCV ny fanohanana ny fanatanterahana ny code avy amin'ny QSPI, dia nanapa-kevitra ny hanomboka amin'ny fampidirana ny sary Embox c Qt manontolo ao amin'ny QSPI izahay. Ary hurray, nanomboka avy hatrany ny zava-drehetra avy amin'ny QSPI! Saingy tahaka ny tamin'ny OpenCV dia hita fa miadana loatra izy io.
Noho izany, nanapa-kevitra ny hanao izany izahay - voalohany dia mandika ny sary amin'ny QSPI, avy eo ampidiro ao amin'ny SDRAM ary tanterahana avy eo. Avy amin'ny SDRAM dia lasa haingana kokoa, fa mbola lavitra ny QEMU.
Manaraka izany dia nisy hevitra hampidirana teboka mitsingevana - na izany aza, ny Qt dia manao kajy sasantsasany amin'ny fandrindrana ny efamira amin'ny animation. Niezaka izahay, saingy teto dia tsy nahazo fanamafisam-peo hita, na dia tao anatin'ny
Ny hevitra mahomby indrindra dia ny famindrana ny framebuffer avy amin'ny SDRAM mankany amin'ny fitadidiana anatiny. Mba hanaovana izany, dia nanao ny haben'ny efijery tsy 480x272, fa 272x272. Nampidinay ihany koa ny halalin'ny loko avy amin'ny A8R8G8B8 ho R5G6B5, ka nampihena ny haben'ny piksel iray avy amin'ny 4 ka hatramin'ny 2 bytes. Ny haben'ny framebuffer dia 272 * 272 * 2 = 147968 bytes. Izany dia nanome fanafainganana lehibe, angamba ny tena tsikaritra, ny sarimiaina dia nanjary saika malama.
Ny fanatsarana farany dia ny fampandehanana ny kaody Embox avy amin'ny RAM sy ny kaody Qt avy amin'ny SDRAM. Mba hanaovana izany, isika aloha, toy ny mahazatra, statically mampifandray Embox miaraka amin'ny Qt, fa mametraka ny lahatsoratra, rodata, data sy bss fizarana ao amin'ny trano famakiam-boky ao amin'ny QSPI mba handika izany avy eo amin'ny 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))
Tamin'ny fanatanterahana ny kaody Embox avy amin'ny ROM, dia nahazo fanafainganana tsikaritra ihany koa izahay. Vokatr'izany, ny animation dia nivadika ho malefaka:
Amin'ny farany, raha manomana ny lahatsoratra sy manandrana ny Embox configurations samihafa, dia hita fa ny Qt moveblocks dia miasa tsara amin'ny QSPI miaraka amin'ny framebuffer ao amin'ny SDRAM, ary ny bottleneck dia mitovy amin'ny haben'ny framebuffer! Raha ny fahitana azy, mba handresena ny "slideshow" voalohany, dia ampy ny fanafainganana in-2 noho ny fampihenana ny haben'ny framebuffer. Saingy tsy azo atao ny manatratra izany vokatra izany amin'ny alΓ lan'ny famindrana ny code Embox amin'ny fahatsiarovana haingana isan-karazany (tsy 2 ny hafainganam-pandeha, fa in-1.5 eo ho eo).
Ahoana no hanandramana izany ny tenanao
Raha manana STM32F7-Discovery ianao dia azonao atao ny mampandeha ny Qt eo ambanin'ny Embox anao. Azonao atao ny mamaky ny fomba fanaovana izany ao amin'ny anay
famaranana
Vokatr'izany dia nahavita nandefa Qt izahay! Ny fahasarotan'ny asa, araka ny hevitray, dia somary tafahoatra. Mazava ho azy, mila mandinika ny mombamomba ny microcontrollers ianao ary amin'ny ankapobeny dia mahatakatra ny maritrano ny rafitra informatika. Ny valin'ny optimization dia manondro ny zava-misy fantatra fa ny bottleneck amin'ny rafitra informatika dia tsy ny processeur, fa ny fahatsiarovana.
Amin'ity taona ity dia handray anjara amin'ny fetibe isika
Source: www.habr.com