Qt ወደ STM32 በማጓጓዝ ላይ

Qt ወደ STM32 በማጓጓዝ ላይእንደምን አረፈድክ እኛ በፕሮጀክቱ ውስጥ ነን ኢምቦክስ በ STM32F7-ግኝት ላይ Qt ጀምሯል እና ስለ እሱ ማውራት ይፈልጋል። ከዚህ በፊት እንዴት ማስጀመር እንደቻልን አስቀድመን ተናግረናል። OpenCV.

Qt ስዕላዊ ክፍሎችን ብቻ ሳይሆን እንደ QtNetwork፣ ከዳታቤዝ ጋር ለመስራት የክፍል ስብስብ፣ Qt አውቶሜሽን (የአይኦቲ ትግበራን ጨምሮ) እና ሌሎችንም የሚያካትት የመስቀል መድረክ ማዕቀፍ ነው። የQt ቡድን በተከተቱ ስርዓቶች ውስጥ Qt ን ስለመጠቀም ንቁ ነበር፣ ስለዚህ ቤተ-መጻሕፍቶቹ በጣም ሊዋቀሩ የሚችሉ ናቸው። ነገር ግን፣ እስከ ቅርብ ጊዜ ድረስ፣ ጥቂት ሰዎች Qtን ወደ ማይክሮ መቆጣጠሪያ ስለማስተላለፍ ያስቡ ነበር፣ ምክንያቱም እንዲህ ያለው ተግባር ከባድ ስለሚመስል - Qt ትልቅ ነው፣ MCUs ትንሽ ናቸው።

በሌላ በኩል, በአሁኑ ጊዜ ከመልቲሚዲያ ጋር ለመስራት የተነደፉ እና ከመጀመሪያው Pentiums የላቁ ማይክሮ መቆጣጠሪያ መሳሪያዎች አሉ. ከአንድ አመት በፊት የQt ብሎግ ታየ ፖስት. ገንቢዎቹ ለRTEMS OS የQt ወደብ ሠሩ፣ እና stm32f7 በሚሄዱ በርካታ ሰሌዳዎች ላይ መግብሮችን በመጠቀም ምሳሌዎችን አስጀምረዋል። ይህ እኛን አጓጉልን። የሚታይ ነበር, እና ገንቢዎች ራሳቸው ስለ እሱ ይጽፋሉ, Qt በ STM32F7-ግኝት ላይ ቀርፋፋ ነው. እኛ Qt በኤምቦክስ ስር ማስኬድ እንችል እንደሆነ እያሰብን ነበር፣ እና መግብርን መሳል ብቻ ሳይሆን አኒሜሽን ማስኬድ።

Qt 4.8 ወደ ኤምቦክስ ለረጅም ጊዜ ተላልፏል፣ ስለዚህ በእሱ ላይ ለመሞከር ወስነናል። የእንቅስቃሴ እገዳዎች መተግበሪያን መርጠናል - የፀደይ አኒሜሽን ምሳሌ።

Qt በ QEMU ላይ የሚያንቀሳቅሱ እገዳዎችQt ወደ STM32 በማጓጓዝ ላይ

ለመጀመር፣ Qt ን እናዋቅራለን፣ ከተቻለ፣ አኒሜሽን ለመደገፍ ከሚያስፈልጉት አነስተኛ ክፍሎች ስብስብ ጋር። ለዚህም "-qconfig minimal, ትንሽ, መካከለኛ..." አማራጭ አለ. ብዙ ማክሮዎች ጋር Qt ከ የማዋቀር ፋይል ያገናኛል - ምን ማንቃት / ምን ማሰናከል. ከዚህ አማራጭ በኋላ, ሌላ ነገር ማሰናከል ከፈለግን ሌሎች ባንዲራዎችን ወደ ውቅሩ እንጨምራለን. የእኛ ምሳሌ እዚህ አለ። ማዋቀር.

Qt እንዲሰራ የስርዓተ ክወና ተኳሃኝነት ንብርብር ማከል አለብህ። አንዱ መንገድ QPA (Qt Platform Abstraction) መተግበር ነው። በQt ውስጥ የተካተተውን ዝግጁ የሆነ fb_base ፕለጊን መሰረት አድርገን ወስደናል፣ በዚህ መሰረት QPA ለሊኑክስ ይሰራል። ውጤቱ emboxfb የሚባል ትንሽ ፕለጊን ነው፣ እሱም Qtን ከEmbox's framebuffer ጋር ያቀርባል፣ ከዚያም ያለምንም የውጭ እርዳታ ይስላል።

ተሰኪ መፍጠር ይህን ይመስላል

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;
}

በውጤቱም, የማህደረ ትውስታ መጠን -ኦስ ማጠናከሪያ ማመቻቸት በነቃ, የቤተ-መጽሐፍት ምስሉ 3.5 ሜባ ሆኖ ​​ተገኝቷል, ይህም ከ STM32F746 ዋና ማህደረ ትውስታ ጋር አይጣጣምም. ስለ OpenCV በሌላኛው ጽሑፋችን ላይ እንደጻፍነው፣ ይህ ሰሌዳ የሚከተለው አለው፡-

  • 1 ሜባ ሮም
  • 320 ኪባ ራም
  • 8 ሜባ SDRAM
  • 16 ሜባ QSPI

ከQSPI ኮድ የማስፈጸም ድጋፍ አስቀድሞ ወደ OpenCV ስለተጨመረ፣ ሙሉውን የEmbox c Qt ምስል ወደ QSPI በመጫን ለመጀመር ወስነናል። እና ቸኩይ፣ ሁሉም ነገር ወዲያውኑ ከQSPI ጀምሯል! ግን እንደ OpenCV ሁኔታ ፣ እሱ በጣም በዝግታ እንደሚሰራ ታየ።

Qt ወደ STM32 በማጓጓዝ ላይ

ስለዚህ, በዚህ መንገድ ለማድረግ ወስነናል - መጀመሪያ ምስሉን ወደ QSPI እንገለብጣለን, ከዚያም ወደ SDRAM ጫን እና ከዚያ እንፈጽማለን. ከኤስዲራም ትንሽ ፈጣን ሆነ፣ነገር ግን አሁንም ከQEMU ይርቃል።

Qt ወደ STM32 በማጓጓዝ ላይ

ቀጥሎ, ተንሳፋፊ ነጥብ ማካተት አንድ ሐሳብ ነበር - በኋላ ሁሉ, Qt አኒሜሽን ውስጥ ካሬዎች መጋጠሚያዎች አንዳንድ ስሌቶች ያደርጋል. ሞክረን ነበር፣ ግን እዚህ ምንም እንኳን የሚታይ ፍጥነት አላገኘንም። ጽሑፍ የQt ገንቢዎች FPU በንክኪ ስክሪን ላይ “አኒሜሽን ለመጎተት” ከፍተኛ የፍጥነት ጭማሪ እንደሚሰጥ ተናግረዋል። በእንቅስቃሴ እገዳዎች ውስጥ በጣም ያነሰ የተንሳፋፊ ነጥብ ስሌቶች ሊኖሩ ይችላሉ ፣ እና ይህ በልዩ ምሳሌ ላይ የተመሠረተ ነው።

በጣም ውጤታማው ሀሳብ ፍሬም ቋት ከ SDRAM ወደ ውስጣዊ ማህደረ ትውስታ ማንቀሳቀስ ነበር። ይህንን ለማድረግ, የስክሪን መለኪያዎችን 480x272 ሳይሆን 272x272 አደረግን. እንዲሁም የቀለም ጥልቀትን ከ A8R8G8B8 ወደ R5G6B5 ዝቅ አድርገናል፣ በዚህም የአንድ ፒክሰል መጠን ከ4 ወደ 2 ባይት ቀንሷል። የተገኘው ፍሬምበፈር መጠን 272 * 272 * 2 = 147968 ባይት ነው። ይህ ጉልህ የሆነ ማፋጠን ሰጠ፣ ምናልባትም በጣም በሚገርም ሁኔታ አኒሜሽኑ ለስላሳ ሆነ።

የቅርብ ጊዜ ማመቻቸት የኢምቦክስ ኮድን ከ RAM እና Qt ኮድ ከ SDRAM ማስኬድ ነበር። ይህንን ለማድረግ፣ መጀመሪያ እንደተለመደው ኢምቦክስን ከQt ጋር በስታቲስቲክስ እናገናኘዋለን፣ ነገር ግን የላይብረሪውን ጽሑፍ፣ ሮዳታ፣ ዳታ እና ቢኤስኤስ ክፍሎችን ወደ SDRAM ለመቅዳት በ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))

የኤምቦክስ ኮድን ከሮም በማስፈጸም፣ እንዲሁም ጉልህ የሆነ ማጣደፍ አግኝተናል። በዚህ ምክንያት አኒሜሽኑ በጣም ለስላሳ ሆነ-


በመጨረሻ ፣ ጽሑፉን በማዘጋጀት እና የተለያዩ የ Embox ውቅሮችን በሚሞክሩበት ጊዜ ፣ ​​Qt moveblocks ከ QSPI በ SDRAM ውስጥ ካለው ፍሬምbuffer ጋር በጥሩ ሁኔታ እንደሚሠሩ ተገለጠ ፣ እና ማነቆው በትክክል የፍሬምቡፈር መጠን ነበር! በግልጽ ለማየት እንደሚቻለው, የመጀመሪያውን "ስላይድ ትዕይንት" ለማሸነፍ, ባለ 2 ጊዜ ማፋጠን በፍሬምቡፈር መጠን ላይ ባናል በመቀነሱ ምክንያት በቂ ነበር. ነገር ግን የ Embox ኮድን ወደ ተለያዩ ፈጣን ትውስታዎች (ፍጥነቱ 2 ሳይሆን 1.5 ጊዜ ያህል) በማስተላለፍ እንዲህ አይነት ውጤት ማምጣት አልተቻለም።

እራስዎን እንዴት እንደሚሞክሩ

አንድ STM32F7-ግኝት ካለዎት, አንተ ራስህ Embox ስር Qt ማሄድ ይችላሉ. ይህ እንዴት እንደሚደረግ በእኛ ላይ ማንበብ ይችላሉ ዊኪ.

መደምደሚያ

በዚህም ምክንያት Qt ን ለመጀመር ችለናል! የሥራው ውስብስብነት, በእኛ አስተያየት, በመጠኑ የተጋነነ ነው. በተፈጥሮ ፣ የማይክሮ ተቆጣጣሪዎችን ልዩ ሁኔታዎች ግምት ውስጥ ማስገባት እና በአጠቃላይ የኮምፒተር ስርዓቶችን ስነ-ህንፃ መረዳት ያስፈልግዎታል። የማሻሻያ ውጤቶቹ በኮምፒዩተር ሲስተም ውስጥ ያለው ማነቆ ፕሮሰሰር ሳይሆን የማስታወስ ችሎታ መሆኑን የሚያመለክት ነው።

በዚህ ዓመት በበዓሉ ላይ እንሳተፋለን የቴክኖሎጂ ባቡር. እዚያም የበለጠ በዝርዝር እንነግርዎታለን እና Qt ፣ OpenCV በማይክሮ መቆጣጠሪያ እና ሌሎች ስኬቶቻችንን እናሳያለን።

ምንጭ: hab.com

አስተያየት ያክሉ