بعد له غرمه مو پخیر موږ په پروژه کې یو
Qt د کراس پلیټ فارم چوکاټ دی چې پکې نه یوازې ګرافیکي برخې شاملې دي ، بلکه د QtNetwork په څیر شیان ، د ډیټابیسونو سره کار کولو لپاره د ټولګیو سیټ ، د اتومات کولو لپاره Qt (د IoT پلي کولو په شمول) او نور ډیر څه. د Qt ټیم په ایمبیډ شوي سیسټمونو کې د Qt کارولو په اړه فعال و ، نو کتابتونونه خورا د تنظیم وړ دي. په هرصورت، تر دې وروستیو پورې، لږو خلکو د مایکرو کنټرولرونو ته د Qt پورټ کولو په اړه فکر کاوه، شاید ځکه چې دا کار ستونزمن ښکاري - Qt لوی دی، MCUs کوچني دي.
له بلې خوا، دا مهال مایکرو کنټرولرونه شتون لري چې د ملټي میډیا سره کار کولو لپاره ډیزاین شوي او د لومړي پینټیم څخه غوره دي. شاوخوا یو کال دمخه، د Qt بلاګ ښکاره شو
Qt 4.8 د اوږدې مودې لپاره ایمبکس ته لیږدول شوی، نو موږ پریکړه وکړه چې دا یې هڅه وکړو. موږ د حرکت بلاکس غوښتنلیک غوره کړ - د پسرلي حرکت یوه بیلګه.
په QEMU کې د Qt حرکت بلاکونه
د پیل کولو لپاره، موږ Qt ترتیب کوو، که ممکنه وي، د انیمیشن مالتړ لپاره اړین اجزاو لږترلږه سیټ سره. د دې لپاره یو اختیار شتون لري "-qconfig لږترلږه، کوچنی، منځنی ...". دا د ډیری میکرو سره د Qt څخه د ترتیب کولو فایل سره نښلوي - څه فعال کړئ / څه غیر فعال کړئ. د دې اختیار وروسته، موږ په ترتیب کې نور بیرغونه اضافه کوو که چیرې موږ غواړو چې بل څه غیر فعال کړو. دلته زموږ یوه بیلګه ده
د Qt د کار کولو لپاره، تاسو اړتیا لرئ د OS مطابقت پرت اضافه کړئ. یوه لاره د QPA (Qt پلیټ فارم خلاصون) پلي کول دي. موږ په Qt کې شامل چمتو شوي fb_base پلگ ان د اساس په توګه واخیست ، د کوم پراساس چې د لینکس لپاره QPA کار کوي. پایله د emboxfb په نوم یو کوچنی پلگ ان دی ، کوم چې Qt د 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 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 څخه داخلي حافظې ته واړوي. د دې کولو لپاره، موږ د سکرین ابعاد 480x272 نه، مګر 272x272 جوړ کړل. موږ د رنګ ژوروالی هم له A8R8G8B8 څخه R5G6B5 ته راټیټ کړ، په دې توګه د یو پکسل اندازه له 4 څخه تر 2 بایټ پورې راټیټه کړه. د پایله شوي چوکاټ بفر اندازه 272 * 272 * 2 = 147968 بایټس دی. دې یو مهم سرعت ورکړ، شاید د پام وړ، حرکت تقریبا اسانه شو.
وروستی اصلاح د RAM څخه د Embox کوډ او د SDRAM څخه Qt کوډ چلول و. د دې کولو لپاره، موږ لومړی، د معمول په څیر، په ثابت ډول د Qt سره Embox سره نښلوو، مګر موږ د کتابتون متن، روډاټا، ډیټا او د بی ایس ایس برخې په 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))
د ROM څخه د Embox کوډ په اجرا کولو سره، موږ د پام وړ سرعت هم ترلاسه کړ. د پایلې په توګه، حرکت خورا اسانه شو:
په پای کې، د مقالې چمتو کولو په وخت کې او د ایمبکس مختلف ترتیباتو هڅه کول، دا معلومه شوه چې د Qt حرکت بلاکس د QSPI څخه په SDRAM کې د فریم بفر سره ښه کار کوي، او خنډ دقیقا د فریم بفر اندازه وه! په ښکاره ډول ، د لومړني "سلایډ شو" بریالي کولو لپاره ، د چوکاټ بفر اندازې کې د محدود کمښت له امله دوه چنده سرعت کافي و. مګر دا ممکنه نه وه چې دا ډول پایلې ترلاسه کړئ یوازې د ایمبکس کوډ مختلف ګړندی یادونو ته لیږدولو سره (سرعت 2 نه و ، مګر شاوخوا 2 ځله).
دا څنګه پخپله هڅه وکړئ
که تاسو STM32F7-Discovery لرئ، تاسو کولی شئ Qt پخپله د Embox لاندې چل کړئ. تاسو کولی شئ ولولئ چې دا زموږ په اړه څنګه ترسره کیږي
پایلې
د پایلې په توګه، موږ د Qt په لاره اچولو بریالي شو! د کار پیچلتیا، زموږ په نظر، یو څه مبالغه ده. په طبیعي ډول ، تاسو اړتیا لرئ د مایکرو کنټرولر ځانګړتیاوې په پام کې ونیسئ او په عمومي ډول د کمپیوټر سیسټمونو جوړښت باندې پوه شئ. د اصلاح کولو پایلې پیژندل شوي حقیقت ته اشاره کوي چې د کمپیوټر سیسټم کې خنډ پروسیسر نه دی، مګر حافظه.
سږکال به موږ په فیستیوال کې برخه واخلو
سرچینه: www.habr.com