Executando Qt em STM32. Parte 2. Agora com pseudo 3d e touchscreen

No projeto Embox , há algum tempo lançamos o Qt na plataforma STM32 . Um exemplo foi o aplicativo moveblocks, uma animação com quatro quadrados azuis que se movem pela tela. Queríamos mais, por exemplo, adicionar interatividade, porque uma tela sensível ao toque está disponível na placa. Escolhemos o aplicativo animatedtiles simplesmente porque também fica bem em um computador. Ao pressionar os botões virtuais, muitos ícones se movem suavemente pela tela, reunindo-se em várias formas. Além disso, parece bastante com animação 3D, e até tínhamos dúvidas se o microcontrolador daria conta dessa tarefa.



conjunto



Em primeiro lugar, começamos com a montagem. A maneira mais fácil de fazer isso é no emulador QEMU. lá tudo cabe exatamente da memória e, portanto, é fácil verificar se todos os componentes são suficientes para construir o aplicativo. Depois de verificar se todos os tecidos animados foram montados com sucesso, transferi-o facilmente para a configuração da prancha de que precisava.



Comece a bordo



O tamanho da tela para STM32F746G-Discovery é 480x272, quando o aplicativo foi iniciado, ele foi desenhado apenas na parte superior da tela. Naturalmente, queríamos descobrir qual era o problema. Claro, você pode começar a depurar diretamente na placa, mas há uma solução mais fácil. execute o aplicativo no Linux com as mesmas dimensões 480x272 com o framebuffer virtual QVFB.



Lançamento em Linux



Para rodar no Linux, precisamos de três partes do QVFB, da biblioteca Qt e do próprio aplicativo.



QVFB é um aplicativo regular que nos fornecerá uma tela virtual para o Qt rodar. Nós os coletamos conforme escrito na documentação oficial .



Inicie com o tamanho de tela desejado:



./qvfb -width 480 -height 272 -nocursor
      
      





Em seguida, construímos a biblioteca Qt incorporada, ou seja, Com a opção -embedded especificada. Também desativei vários módulos para acelerar a construção, no final a configuração ficou assim:



./configure -opensource -confirm-license -debug \
    -embedded -qt-gfx-qvfb -qvfb \
    -no-javascript-jit -no-script -no-scripttools \
    -no-qt3support -no-webkit -nomake demos -nomake examples
      
      





A seguir, construímos o aplicativo de tecidos animados (qmake + make). E lançamos o aplicativo compilado, apontando-o para nosso QVFB:



./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
      
      





Após o lançamento, vi que no Linux ele também desenha apenas em uma parte da tela. Modifiquei um pouco os desenhos animados adicionando a opção “-fullscreen”, quando especificada, o aplicativo inicia em modo de tela inteira.



Lançar no Embox



Usaremos o código-fonte modificado do aplicativo no Embox. Nós reconstruímos e corremos. O aplicativo não foi iniciado e o Qt ficou sem mensagens de memória. Observamos a configuração do Embox e descobrimos que o tamanho do heap está definido como 2 MB e claramente não é suficiente. Novamente, você pode tentar descobrir esse ponto diretamente na placa, mas vamos fazer isso confortavelmente no Linux.



Para fazer isso, inicie o aplicativo da seguinte maneira:



$ valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen
$ ms_print animatedtiles.massif > animatedtiles.out
      
      





No arquivo animatedtiles.out, vemos o valor máximo da ocupação de heap de cerca de 2,7 MB. Ótimo, agora você não precisa adivinhar, mas volte ao Embox e defina o tamanho do heap para 3 MB.



Têxteis animados lançados.



Inicie em STM32F769I-Discovery.



Vamos tentar complicar ainda mais a tarefa e rodar o mesmo exemplo em um microcontrolador semelhante, mas apenas com uma resolução de tela maior - STM32F769I-Discovery (800x480). Ou seja, agora o framebuffer exigirá 1,7 vezes mais memória (lembre-se de que o STM32F746G tem uma tela 480x272), mas isso é compensado pelo dobro do tamanho do SDRAM (16 MB contra 8 MB de SDRAM disponível para o STM32F746G).



Para estimar o tamanho do heap, como acima, primeiro execute Qvfb e nosso aplicativo Linux:



$ ./qvfb -width 800 -height 480 -nocursor &
$ valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen
$ ms_print animatedtiles.massif > animatedtiles.out
      
      





Observamos o consumo de memória no heap - cerca de 6 MB (quase o dobro do STM32F746G).



Resta definir o tamanho de heap desejado em mods.conf e reconstruir. O aplicativo foi iniciado imediatamente e sem problemas, como demonstrado neste pequeno vídeo





Tradicionalmente, você mesmo pode reproduzir os resultados. Como fazer isso está descrito em nosso wiki .



Este artigo foi publicado pela primeira vez em inglês em embedded.com .



All Articles