Ny fandefasana ny Qt mankany STM32

Ny fandefasana ny Qt mankany STM32Salama Ao anatin'ny tetikasa izahay Embox nandefa Qt tamin'ny STM32F7-Discovery ary te hiresaka momba izany. Efa notantarainay teo aloha ny fomba nanombohanay OpenCV.

Qt dia rafitra cross-platform izay tsy ahitana singa grafika ihany, fa koa zavatra toy ny QtNetwork, andiana kilasy hiasa amin'ny angon-drakitra, Qt ho an'ny Automation (anisan'izany ny fampiharana IoT) sy ny maro hafa. Ny ekipan'ny Qt dia mavitrika amin'ny fampiasana Qt amin'ny rafitra napetraka, noho izany dia azo amboarina ny tranomboky. Na izany aza, hatramin'ny vao haingana, vitsy ny olona nieritreritra ny handefa Qt amin'ny microcontrollers, angamba satria toa sarotra ny asa toy izany - lehibe ny Qt, kely ny MCU.

Amin'ny lafiny iray, amin'izao fotoana izao dia misy microcontrollers natao hiasa amin'ny multimedia ary ambony noho ny Pentium voalohany. Herintaona teo ho eo izay no niseho ny bilaogy Qt lahatsoratra. Ny mpamorona dia nanao seranan-tsambo Qt ho an'ny RTEMS OS, ary namoaka ohatra miaraka amin'ny widgets amin'ny takelaka maromaro mandeha stm32f7. Nahaliana anay izany. Tsikaritra, ary ny mpamorona mihitsy no manoratra momba izany, fa ny Qt dia miadana amin'ny STM32F7-Discovery. Nanontany tena izahay raha afaka mihazakazaka Qt eo ambanin'ny Embox, ary tsy manao sary widget fotsiny, fa manao animation.

Qt 4.8 dia nafindra tany amin'ny Embox nandritra ny fotoana ela, ka nanapa-kevitra ny hanandrana azy io izahay. Nisafidy ny fampiharana moveblocks izahay - ohatra amin'ny animation springy.

Qt moveblocks amin'ny QEMUNy fandefasana ny Qt mankany STM32

Hanombohana, amboary ny Qt, raha azo atao, miaraka amin'ireo singa kely indrindra ilaina hanohanana ny animation. Mba hanaovana izany dia misy safidy "-qconfig minimal, small, medium ...". Izy io dia mampifandray rakitra fanamafisana avy amin'ny Qt miaraka amin'ny macros maro - inona no azo atao / inona no ho esorina. Aorian'ity safidy ity dia ampiana saina hafa amin'ny fanitsiana izahay raha te hanala zavatra hafa. Ity misy ohatra ny antsika fanahafana.

Mba hahafahan'ny Qt miasa dia mila manampy sosona mifanaraka amin'ny OS ianao. Fomba iray ny fampiharana ny QPA (Qt Platform Abstraction). Noraisinay ho fototry ny plugin fb_base efa vonona tafiditra ao amin'ny Qt, mifototra amin'ny fiasan'ny QPA ho an'ny Linux. Ny vokatr'izany dia plugin kely antsoina hoe emboxfb, izay manome Qt amin'ny Embox's framebuffer, ary avy eo dia misintona any tsy misy fanampiana avy any ivelany.

Toy izao ny endriky ny famoronana plugin

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

Ary toy izao no ho endriky ny famerenana indray

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

Vokatr'izany, miaraka amin'ny fanamafisana ny compiler ho an'ny haben'ny fahatsiarovana -Os, ny sarin'ny tranomboky dia 3.5 MB, izay mazava ho azy fa tsy mifanaraka amin'ny fahatsiarovana ny STM32F746. Araka ny efa nosoratanay tao amin'ny lahatsoratra hafa momba ny OpenCV, ity tabilao ity dia manana:

  • 1 MB ROM
  • 320 KB RAM
  • 8 MB SDRAM
  • 16 MB QSPI

Satria efa nampidirina tao amin'ny OpenCV ny fanohanana ny fanatanterahana ny code avy amin'ny QSPI, dia nanapa-kevitra ny hanomboka amin'ny fampidirana ny sary Embox c Qt manontolo ao amin'ny QSPI izahay. Ary hurray, nanomboka avy hatrany ny zava-drehetra avy amin'ny QSPI! Saingy tahaka ny tamin'ny OpenCV dia hita fa miadana loatra izy io.

Ny fandefasana ny Qt mankany STM32

Noho izany, nanapa-kevitra ny hanao izany izahay - voalohany dia mandika ny sary amin'ny QSPI, avy eo ampidiro ao amin'ny SDRAM ary tanterahana avy eo. Avy amin'ny SDRAM dia lasa haingana kokoa, fa mbola lavitra ny QEMU.

Ny fandefasana ny Qt mankany STM32

Manaraka izany dia nisy hevitra hampidirana teboka mitsingevana - na izany aza, ny Qt dia manao kajy sasantsasany amin'ny fandrindrana ny efamira amin'ny animation. Niezaka izahay, saingy teto dia tsy nahazo fanamafisam-peo hita, na dia tao anatin'ny lahatsoratra Nilaza ny mpamorona Qt fa ny FPU dia manome fisondrotana lehibe amin'ny hafainganam-pandeha ho an'ny "misintona animation" amin'ny efijery fikasihana. Mety ho kely kokoa ny kajy teboka mitsingevana amin'ny moveblocks, ary miankina amin'ny ohatra manokana izany.

Ny hevitra mahomby indrindra dia ny famindrana ny framebuffer avy amin'ny SDRAM mankany amin'ny fitadidiana anatiny. Mba hanaovana izany, dia nanao ny haben'ny efijery tsy 480x272, fa 272x272. Nampidinay ihany koa ny halalin'ny loko avy amin'ny A8R8G8B8 ho R5G6B5, ka nampihena ny haben'ny piksel iray avy amin'ny 4 ka hatramin'ny 2 bytes. Ny haben'ny framebuffer dia 272 * 272 * 2 = 147968 bytes. Izany dia nanome fanafainganana lehibe, angamba ny tena tsikaritra, ny sarimiaina dia nanjary saika malama.

Ny fanatsarana farany dia ny fampandehanana ny kaody Embox avy amin'ny RAM sy ny kaody Qt avy amin'ny SDRAM. Mba hanaovana izany, isika aloha, toy ny mahazatra, statically mampifandray Embox miaraka amin'ny Qt, fa mametraka ny lahatsoratra, rodata, data sy bss fizarana ao amin'ny trano famakiam-boky ao amin'ny QSPI mba handika izany avy eo amin'ny 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))

Tamin'ny fanatanterahana ny kaody Embox avy amin'ny ROM, dia nahazo fanafainganana tsikaritra ihany koa izahay. Vokatr'izany, ny animation dia nivadika ho malefaka:


Amin'ny farany, raha manomana ny lahatsoratra sy manandrana ny Embox configurations samihafa, dia hita fa ny Qt moveblocks dia miasa tsara amin'ny QSPI miaraka amin'ny framebuffer ao amin'ny SDRAM, ary ny bottleneck dia mitovy amin'ny haben'ny framebuffer! Raha ny fahitana azy, mba handresena ny "slideshow" voalohany, dia ampy ny fanafainganana in-2 noho ny fampihenana ny haben'ny framebuffer. Saingy tsy azo atao ny manatratra izany vokatra izany amin'ny alΓ lan'ny famindrana ny code Embox amin'ny fahatsiarovana haingana isan-karazany (tsy 2 ny hafainganam-pandeha, fa in-1.5 eo ho eo).

Ahoana no hanandramana izany ny tenanao

Raha manana STM32F7-Discovery ianao dia azonao atao ny mampandeha ny Qt eo ambanin'ny Embox anao. Azonao atao ny mamaky ny fomba fanaovana izany ao amin'ny anay Wiki.

famaranana

Vokatr'izany dia nahavita nandefa Qt izahay! Ny fahasarotan'ny asa, araka ny hevitray, dia somary tafahoatra. Mazava ho azy, mila mandinika ny mombamomba ny microcontrollers ianao ary amin'ny ankapobeny dia mahatakatra ny maritrano ny rafitra informatika. Ny valin'ny optimization dia manondro ny zava-misy fantatra fa ny bottleneck amin'ny rafitra informatika dia tsy ny processeur, fa ny fahatsiarovana.

Amin'ity taona ity dia handray anjara amin'ny fetibe isika TechTrain. Ao no holazainay aminao amin'ny antsipiriany bebe kokoa ary hampiseho Qt, OpenCV momba ny microcontrollers sy ny zava-bitay hafa.

Source: www.habr.com

Add a comment