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 .