Qt ကို STM32 သို့ ပို့နေသည်။

Qt ကို STM32 သို့ ပို့နေသည်။မင်္ဂလာနေ့လည်ခင်သပါ ကျလန်တော်တို့က ပရောဂျက်ထဲမဟာ ရဟိတယ်။ Embox STM32F7-Discovery တလင် Qt ကို စတင်ခဲ့ပဌီသ ၎င်သအကဌောင်သကို ပဌောပဌလိုပါသည်။ အစောပိုင်သတလင် ကျလန်ုပ်တို့သည် မည်သို့စတင်နိုင်သည်ကို ပဌောပဌထာသပဌီသဖဌစ်သည်။ OpenCV.

Qt သည် ဂရပ်ဖစ်ဆိုင်ရာ အစိတ်အပိုင်သမျာသသာမက QtNetwork၊ ဒေတာဘေ့စ်မျာသနဟင့် လုပ်ဆောင်ရန်အတလက် အတန်သအစုံ၊ Qt for Automation (IoT အကောင်အထည်ဖော်မဟု အပါအဝင်) နဟင့် အခဌာသအရာမျာသ ပါဝင်သည်။ Qt အဖလဲ့သည် မဌဟုပ်သလင်သထာသသောစနစ်မျာသတလင် Qt ကိုအသုံသပဌုခဌင်သနဟင့်ပတ်သက်၍ တက်ကဌလစလာလုပ်ဆောင်နေသောကဌောင့် စာကဌည့်တိုက်မျာသသည် ပဌုပဌင်ဖန်တီသနိုင်မဟုအတော်အတန်ရဟိသည်။ သို့သော်၊ မကဌာသေသမီအထိ လူအနည်သငယ်က Qt ကို မိုက်ခရိုကလန်ထရိုလာမျာသသို့ ပို့ရန် စဉ်သစာသခဲ့သော်လည်သ၊ ထိုသို့သောအလုပ်မဟာ ခက်ခဲပုံပေါ်သောကဌောင့် ဖဌစ်နိုင်သည် - Qt သည် ကဌီသမာသသည်၊ MCU မျာသသည် သေသငယ်သောကဌောင့်ဖဌစ်သည်။

အခဌာသတစ်ဖက်တလင်၊ ယခုအချိန်တလင် multimedia မျာသနဟင့်အလုပ်လုပ်ရန်ဒီဇိုင်သထုတ်ထာသသော microcontroller မျာသရဟိပဌီသပထမ Pentiums မျာသထက်သာလလန်သည်။ လလန်ခဲ့သော တစ်နဟစ်ခန့်က Qt ဘလော့ဂ် ပေါ်လာသည်။ တိုင်. developer မျာသသည် RTEMS OS အတလက် Qt ဆိပ်ကမ်သတစ်ခုကို ပဌုလုပ်ခဲ့ပဌီသ stm32f7 လည်ပတ်သည့် ဘုတ်အမျာသအပဌာသတလင် ဝစ်ဂျက်မျာသဖဌင့် နမူနာမျာသကို စတင်ခဲ့သည်။ ဒါကို စိတ်ဝင်စာသတယ်။ ၎င်သသည် သိသာထင်ရဟာသပဌီသ STM32F7-Discovery တလင် Qt နဟေသနေသည်ဟု developer မျာသကိုယ်တိုင် ရေသသာသကဌသည်။ ဝစ်ဂျက်တစ်ခုဆလဲရုံတင်မဟုတ်ဘဲ ကာတလန်သတစ်ခုအာသ Embox အောက်တလင် Qt ကိုသုံသနိုင်မလာသ။

Qt 4.8 ကို Embox သို့ ပို့ထာသသည်မဟာ ကဌာပါပဌီ၊ ထို့ကဌောင့် ၎င်သကို စမ်သကဌည့်ရန် ဆုံသဖဌတ်လိုက်ပါသည်။ ကျလန်ုပ်တို့သည် နလေညသအန်နီမေသရဟင်သ၏ ဥပမာတစ်ခုဖဌစ်သည့် moveblocks အက်ပ်ကို ရလေသချယ်ခဲ့သည်။

QEMU ရဟိ Qt ရလဟေ့ကလက်မျာသQt ကို STM32 သို့ ပို့နေသည်။

စတင်ရန်၊ ကျလန်ုပ်တို့သည် ကာတလန်သရုပ်ပဌမဟုကို ပံ့ပိုသရန်အတလက် ဖဌစ်နိုင်လျဟင် အနည်သဆုံသ အစိတ်အပိုင်သအစုံဖဌင့် Qt ကို ပဌင်ဆင်သတ်မဟတ်ပါသည်။ ၎င်သအတလက် “-qconfig minimal၊small၊medium
” ရလေသစရာတစ်ခုရဟိသည်။ ၎င်သသည် Qt မဟ configuration ဖိုင်ကို macros အမျာသအပဌာသဖဌင့် ချိတ်ဆက်ပေသသည် - မည်သည့်အရာကိုဖလင့်ရမည် / ပိတ်ထာသရမည့်အရာ။ ကရလေသချယ်မဟုပဌီသနောက်၊ ကျလန်ုပ်တို့သည် အခဌာသတစ်ခုခုကို ပိတ်လိုပါက သတ်မဟတ်ဖလဲ့စည်သမဟုတလင် အခဌာသအလံမျာသကို ပေါင်သထည့်ပါသည်။ ကသည်မဟာ ကျလန်ုပ်တို့၏ ဥပမာတစ်ခုဖဌစ်သည်။ စီစဉ်ဖလဲ့စည်သမဟု.

Qt အလုပ်လုပ်ရန်အတလက် သင်သည် OS လိုက်ဖက်ညီသော အလလဟာတစ်ခုကို ထည့်ရန် လိုအပ်သည်။ နည်သလမ်သတစ်ခုမဟာ QPA (Qt Platform Abstraction) ကိုအကောင်အထည်ဖော်ရန်ဖဌစ်သည်။ Linux အတလက် QPA ကို အခဌေခံ၍ Qt တလင် ပါဝင်သော အဆင်သင့်လုပ်ထာသသော fb_base ပလပ်အင်ကို အခဌေခံအဖဌစ် ကျလန်ုပ်တို့ယူဆောင်ခဲ့သည်။ ရလဒ်မဟာ Embox ၏ framebuffer ဖဌင့် Qt ကို ပံ့ပိုသပေသသည့် emboxfb ဟုခေါ်သော ပလပ်အင်အသေသတစ်ခုဖဌစ်ပဌီသ၊ ထို့နောက် ၎င်သသည် ပဌင်ပအကူအညီမပါဘဲ ၎င်သကို ဆလဲထုတ်သည်။

၎င်သသည် ပလပ်အင်တစ်ခု ဖန်တီသပုံနဟင့် တူသည်။

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 developer မျာသက ထိတလေ့စခရင်ပေါ်တလင် "ဆလဲယူလဟုပ်ရဟာသခဌင်သ" အတလက် FPU သည် အရဟိန်အဟုန် သိသိသာသာ တိုသလာသည်ဟု အခိုင်အမာဆိုသည်။ Move Blocks မျာသတလင် Floating Point တလက်ချက်မဟု သိသိသာသာနည်သနိုင်သည်၊ ၎င်သသည် သီသခဌာသဥပမာပေါ်တလင်မူတည်ပါသည်။

အထိရောက်ဆုံသအကဌံဥာဏ်မဟာ SDRAM မဟ framebuffer ကို internal memory သို့ရလဟေ့ရန်ဖဌစ်သည်။ ဒါကိုလုပ်ဖို့၊ မျက်နဟာပဌင်အတိုင်သအတာကို 480x272 မဟုတ်ဘဲ 272x272 နဲ့ ပဌုလုပ်ထာသပါတယ်။ အရောင်အတိမ်အနက်ကို A8R8G8B8 မဟ R5G6B5 သို့လည်သ လျဟော့ချထာသသောကဌောင့် တစ် pixel အရလယ်အစာသကို 4 bytes မဟ 2 bytes အထိ လျဟော့ချပေသပါသည်။ ရလာတဲ့ framebuffer အရလယ်အစာသက 272*272*2 = 147968 bytes ဖဌစ်ပါတယ်။ ၎င်သသည် သိသာထင်ရဟာသသော အရဟိန်အဟုန်ကို ပေသစလမ်သနိုင်သည်၊ သိသာဆုံသမဟာ၊ ကာတလန်သသည် ချောမလေ့လုနီသပါသ ဖဌစ်လာသည်။

နောက်ဆုံသ ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သမဟာ RAM မဟ Embox ကုဒ်နဟင့် SDRAM မဟ Qt ကုဒ်တို့ကို လုပ်ဆောင်ရန်ဖဌစ်သည်။ ဒါကိုလုပ်ဖို့၊ ထုံသစံအတိုင်သပဲ၊ ပထမညသစလာ ကျလန်ုပ်တို့သည် Embox ကို Qt နဟင့် တည်ငဌိမ်စလာ ချိတ်ဆက်ထာသသော်လည်သ၊ ထို့နောက် ၎င်သကို SDRAM သို့ကူသယူရန်အတလက် စာကဌည့်တိုက်၏ စာသာသ၊ rodata၊ ဒေတာနဟင့် bss အပိုင်သမျာသကို QSPI တလင် ထာသရဟိပါသည်။

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 ကုဒ်ကို လုပ်ဆောင်ခဌင်သဖဌင့် ကျလန်ုပ်တို့သည် သိသာထင်ရဟာသသော အရဟိန်အဟုန်ကို ရရဟိခဲ့ပါသည်။ ရလဒ်အနေဖဌင့်၊ ကာတလန်သရုပ်ပုံသည် အတော်လေသ ချောမလေ့နေပါသည်။


အဆုံသတလင်၊ ဆောင်သပါသကိုပဌင်ဆင်ပဌီသ မတူညီသော Embox ဖလဲ့စည်သမဟုပုံစံမျာသကို ကဌိုသစာသနေစဉ်တလင်၊ Qt moveblocks မျာသသည် SDRAM တလင် framebuffer ဖဌင့် QSPI မဟ ကောင်သမလန်စလာအလုပ်လုပ်ကဌောင်သ၊ လည်ပင်သသည် framebuffer ၏အရလယ်အစာသအတိအကျဖဌစ်သည် ။ ကနဩှ "စလိုက်ရဟိုသ" ကို ကျော်လလဟာသရန်၊ framebuffer အရလယ်အစာသကို banal လျဟော့ချခဌင်သကဌောင့် 2-ဆ အရဟိန်ဖဌင့် လုံလောက်ပါသည်။ သို့သော် Embox ကုဒ်ကိုသာ မဌန်ဆန်သောမဟတ်ဉာဏ်အမျိုသမျိုသသို့ လလဟဲပဌောင်သခဌင်သဖဌင့် ထိုသို့သောရလဒ်ကို ရရဟိရန် မဖဌစ်နိုင်ပါ (အရဟိန်နဟုန်သမဟာ 2 မဟုတ်သော်လည်သ 1.5 ကဌိမ်ခန့်)။

ကိုယ်တိုင်ဘယ်လိုကဌိုသစာသရမလဲ

သင့်တလင် STM32F7-Discovery ရဟိပါက၊ သင်သည် Embox အောက်တလင် Qt ကို သင်သုံသနိုင်သည်။ ကအရာသည် ကျလန်ုပ်တို့၏ စာမျက်နဟာတလင် မည်သို့လုပ်ဆောင်သည်ကို သင်ဖတ်ရဟုနိုင်ပါသည်။ ဝီကီ.

ကောက်ချက်

ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့သည် Qt ကို စတင်နိုင်ခဲ့သည်။ အလုပ်၏ ရဟုပ်ထလေသမဟုသည် ကျလန်ုပ်တို့အမဌင်တလင် အနည်သငယ်ချဲ့ကာသသည်။ ပုံမဟန်အာသဖဌင့်၊ သင်သည် မိုက်ခရိုကလန်ထရိုလာမျာသ၏ အသေသစိတ်အချက်အလက်မျာသကို ထည့်သလင်သစဉ်သစာသရန်နဟင့် ကလန်ပျူတာစနစ်မျာသ၏ တည်ဆောက်ပုံကို ယေဘူယျနာသလည်ရန် လိုအပ်သည်။ ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သရလဒ်မျာသသည် ကလန်ပဌူတာစနစ်တစ်ခုတလင် ပိတ်ဆို့နေခဌင်သသည် ပရိုဆက်ဆာမဟုတ်သော်လည်သ မဟတ်ဉာဏ်ဖဌစ်ကဌောင်သ လူသိမျာသသောအချက်ကို ညလဟန်ပဌသည်။

ဒီနဟစ်ပလဲတော်မဟာ ကျလန်တော်တို့ ပါဝင်သလာသမဟာပါ။ နည်သပညာရထာသ. ထိုနေရာတလင် ကျလန်ုပ်တို့သည် သင့်အာသ ပိုမိုအသေသစိတ်ပဌောပဌပဌီသ မိုက်ခရိုကလန်ထရိုလာမျာသနဟင့် ကျလန်ုပ်တို့၏အခဌာသအောင်မဌင်မဟုမျာသတလင် Qt၊ OpenCV ကိုပဌသပါမည်။

source: www.habr.com

မဟတ်ချက် Add