پورٽنگ 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 هڪ ڊگهي وقت تائين ايمباڪس ڏانهن پورٽ ڪيو ويو آهي، تنهنڪري اسان ان تي ڪوشش ڪرڻ جو فيصلو ڪيو. اسان چونڊيو موو بلاڪس ايپليڪيشن - اسپرنگي اينيميشن جو هڪ مثال.

QT moveblocks QEMU تيپورٽنگ Qt ڏانهن STM32

شروع ڪرڻ لاءِ، اسان Qt ترتيب ڏيون ٿا، جيڪڏھن ممڪن ھجي، گھٽ ۾ گھٽ اجزاء جي سيٽ سان، جيڪا اينيميشن کي سپورٽ ڪرڻ لاءِ گھربل آھي. ھن لاء ھڪڙو اختيار آھي "-qconfig minimal,small, medium...". اهو ڪيترن ئي ميڪروز سان Qt کان هڪ ترتيب واري فائل کي ڳنڍيندو آهي - ڇا کي فعال ڪرڻ / ڇا کي غير فعال ڪرڻ. ھن اختيار کان پوء، اسان ٻين جھنڊن کي ترتيب ڏيڻ ۾ شامل ڪندا آھيون جيڪڏھن اسان ڪنھن ٻئي شيء کي غير فعال ڪرڻ چاھيون ٿا. هتي اسان جو هڪ مثال آهي تشڪيل.

Qt ڪم ڪرڻ لاءِ، توھان کي OS مطابقت واري پرت شامل ڪرڻ جي ضرورت آھي. ھڪڙو طريقو آھي QPA (Qt پليٽ فارم خلاصو) کي لاڳو ڪرڻ. اسان Qt ۾ شامل تيار ڪيل fb_base پلگ ان کي بنياد بڻايو، جنهن جي بنياد تي لينڪس لاءِ QPA ڪم ڪري ٿو. نتيجو هڪ ننڍڙو پلگ ان آهي جنهن کي emboxfb سڏيو ويندو آهي، جيڪو Qt مهيا ڪري ٿو ايمباڪس جي فريم بفر سان، ۽ پوءِ اهو بغير ڪنهن ٻاهرين مدد جي اتي اچي ٿو.

اهو آهي جيڪو هڪ پلگ ان ٺاهڻ جهڙو آهي

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 رام
  • 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 بائيٽ آهي. اهو هڪ اهم تيز رفتار ڏنو، شايد سڀ کان وڌيڪ قابل ذڪر، انيميشن لڳ ڀڳ هموار ٿي وئي.

جديد اصلاح لاءِ ايمباڪس ڪوڊ کي رام مان ۽ Qt ڪوڊ کي SDRAM مان هلائڻو هو. ائين ڪرڻ لاءِ، اسان پهريان، هميشه وانگر، مستقل طور تي ايمباڪس کي Qt ​​سان ڳنڍيون ٿا، پر اسان لائبريري جي ٽيڪسٽ، روڊيٽا، ڊيٽا ۽ بي ايس ايس سيگمينٽ کي 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 moveblocks QSPI کان SDRAM ۾ فريم بفر سان تمام سٺو ڪم ڪري ٿو، ۽ رڪاوٽ بلڪل فريم بفر جي سائيز هئي! ظاهري طور تي، شروعاتي "سلائڊ شو" تي قابو پائڻ لاء، فريم بفر جي سائيز ۾ معمولي گھٽتائي جي ڪري 2-گنا تيز رفتار ڪافي هئي. پر اهو ممڪن نه هو ته صرف ايمباڪس ڪوڊ کي مختلف تيز ياداشتن ڏانهن منتقل ڪندي (اسپيڊ اپ 2 نه، پر اٽڪل 1.5 ڀيرا).

پاڻ کي ڪيئن آزمايو

جيڪڏھن توھان وٽ آھي STM32F7-Discovery، توھان ھلائي سگھوٿا Qt ھيٺان Embox پاڻ. توهان پڙهي سگهو ٿا ته اهو ڪيئن آهي اسان جي ويب سائيٽ تي وڪي.

ٿڪل

نتيجي طور، اسان شروع ڪرڻ ۾ منظم ڪيو Qt! ڪم جي پيچيدگي، اسان جي راء ۾، ڪجهه حد تائين مبالغو آهي. قدرتي طور، توهان کي اڪائونٽ ۾ microcontrollers جي خاصيتن ۽ عام طور تي ڪمپيوٽر سسٽم جي فن تعمير کي سمجهڻ جي ضرورت آهي. اصلاح جا نتيجا معروف حقيقت ڏانهن اشارو ڪن ٿا ته ڪمپيوٽنگ سسٽم ۾ رڪاوٽ پروسيسر نه آهي، پر ياداشت.

هن سال اسان فيشن ۾ شرڪت ڪنداسين ٽيڪ ٽرين. اتي اسان توهان کي وڌيڪ تفصيل سان ٻڌائينداسين ۽ ڏيکارينداسين Qt، OpenCV تي مائڪرو ڪنٽرولرز ۽ اسان جون ٻيون ڪاميابيون.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو