د Qt پورټینګ STM32 ته

د Qt پورټینګ STM32 تهبعد له غرمه مو پخیر موږ په پروژه کې یو ایمبکس Qt په STM32F7-Discovery کې پیل کړ او غواړم په دې اړه وغږیږم. مخکې، موږ لا دمخه ویلي وو چې موږ څنګه په لاره اچولو توان درلود OpenCV.

Qt د کراس پلیټ فارم چوکاټ دی چې پکې نه یوازې ګرافیکي برخې شاملې دي ، بلکه د QtNetwork په څیر شیان ، د ډیټابیسونو سره کار کولو لپاره د ټولګیو سیټ ، د اتومات کولو لپاره Qt (د IoT پلي کولو په شمول) او نور ډیر څه. د Qt ټیم په ایمبیډ شوي سیسټمونو کې د Qt کارولو په اړه فعال و ، نو کتابتونونه خورا د تنظیم وړ دي. په هرصورت، تر دې وروستیو پورې، لږو خلکو د مایکرو کنټرولرونو ته د Qt پورټ کولو په اړه فکر کاوه، شاید ځکه چې دا کار ستونزمن ښکاري - Qt لوی دی، MCUs کوچني دي.

له بلې خوا، دا مهال مایکرو کنټرولرونه شتون لري چې د ملټي میډیا سره کار کولو لپاره ډیزاین شوي او د لومړي پینټیم څخه غوره دي. شاوخوا یو کال دمخه، د Qt بلاګ ښکاره شو پوسته. پراختیا کونکو د RTEMS OS لپاره د Qt بندر جوړ کړ، او د stm32f7 په ډیری بورډونو کې د ویجټونو سره مثالونه پیل کړل. دا زموږ سره علاقه درلوده. دا د پام وړ و، او پراختیا کونکي پخپله د دې په اړه لیکي، چې Qt په STM32F7-Discovery کې ورو دی. موږ حیران وو چې ایا موږ کولی شو د ایمبکس لاندې Qt چل کړو، او نه یوازې ویجټ رسم کړو، مګر یو انیمیشن چلوو.

Qt 4.8 د اوږدې مودې لپاره ایمبکس ته لیږدول شوی، نو موږ پریکړه وکړه چې دا یې هڅه وکړو. موږ د حرکت بلاکس غوښتنلیک غوره کړ - د پسرلي حرکت یوه بیلګه.

په QEMU کې د Qt حرکت بلاکونهد Qt پورټینګ STM32 ته

د پیل کولو لپاره، موږ 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 په قضیه کې، دا معلومه شوه چې دا خورا ورو کار کوي.

د Qt پورټینګ STM32 ته

له همدې امله ، موږ پریکړه وکړه چې دا په دې ډول ترسره کړو - لومړی موږ عکس QSPI ته کاپي کړو ، بیا یې په SDRAM کې بار کړو او له هغه ځایه یې اجرا کړو. د SDRAM څخه دا یو څه ګړندی شو ، مګر لاهم د QEMU څخه لرې.

د Qt پورټینګ STM32 ته

بیا، دلته یو نظر شتون درلود چې یو فلوټینګ ټکی شامل کړي - په هرصورت، Qt په حرکت کې د چوکونو همغږۍ ځینې محاسبې کوي. موږ هڅه وکړه، مګر دلته موږ کوم ښکاره سرعت ترلاسه نه کړ، که څه هم دننه مقالې د Qt پراختیا کونکو ادعا وکړه چې FPU په ټچ سکرین کې د "رایګ کولو حرکت" لپاره سرعت کې د پام وړ زیاتوالی ورکوي. په حرکت بلاکونو کې ممکن د پام وړ لږ د تیري نقطې محاسبې شتون ولري ، او دا په ځانګړي مثال پورې اړه لري.

ترټولو مؤثر نظر دا و چې چوکاټ بفر له 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 په لاره اچولو بریالي شو! د کار پیچلتیا، زموږ په نظر، یو څه مبالغه ده. په طبیعي ډول ، تاسو اړتیا لرئ د مایکرو کنټرولر ځانګړتیاوې په پام کې ونیسئ او په عمومي ډول د کمپیوټر سیسټمونو جوړښت باندې پوه شئ. د اصلاح کولو پایلې پیژندل شوي حقیقت ته اشاره کوي چې د کمپیوټر سیسټم کې خنډ پروسیسر نه دی، مګر حافظه.

سږکال به موږ په فیستیوال کې برخه واخلو ټیک ټرین. هلته به موږ تاسو ته په ډیر تفصیل سره ووایو او Qt، OpenCV په مایکرو کنټرولرونو او زموږ نورې لاسته راوړنې به وښیو.

سرچینه: www.habr.com

Add a comment