Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial Internet of Things >> Integrado

Executando um aplicativo Linux em MCUs STM32


Mais e mais funcionalidades são esperadas de sistemas embarcados para produtos inteligentes. Isso pode ser facilmente alcançado com o Linux, que oferece software para cada caso que você desejar. Mas o Linux requer recursos de hardware bastante grandes, principalmente memória, de modo que a plataforma de destino normalmente será bastante cara e terá alto consumo de energia. Por outro lado, os microcontroladores modernos (MCUs) têm muitos recursos que são suficientes para muitas tarefas inteligentes. Usando um sistema operacional em tempo real (RTOS) como o Embox RTOS, que permite o uso de software Linux em qualquer lugar, incluindo MCUs, os desenvolvedores podem desenvolver mais facilmente dispositivos inteligentes que são menos caros e consomem menos energia.

Neste artigo, discutimos o lançamento de um aplicativo Qt básico em um MCU integrado executando o RTOS da Embox. Usamos duas placas baseadas em Cortex-M7 de núcleo único (216 MHz):STM32F746g-Discovery e STM32F769i-Discovery, que possuem telas sensíveis ao toque com resolução de 480 × 272 e 800 × 480, respectivamente.

Algum tempo atrás, conseguimos lançar um exemplo padrão de 'moveblocks' em STM32F746-Discovery [Nota 1]. No entanto, queríamos ir mais longe e lançar um exemplo com uma tela sensível ao toque. Escolhemos outro exemplo padrão, ‘animados’. É um exemplo bastante bom que fica bem até em desktops. É interativo, portanto, podemos usar uma tela sensível ao toque e também se parece com uma animação 3D.

Queríamos saber se o STM32 MCU pode fornecer desempenho suficiente. Não tínhamos certeza se a velocidade da CPU seria suficiente para que a cena de renderização fosse suave, já que, como descobrimos, mesmo a atualização da tela para uma tela de 800 × 480 é uma operação cara [Nota 2].

Edifício

Em primeiro lugar, vamos construir nosso aplicativo como parte do Embox. A maneira mais simples de fazer isso é construir o aplicativo para QEMU, que é um emulador de código aberto. Usar o QEMU significa que não precisamos cuidar do consumo de memória neste caso. Isso nos ajudará a ter certeza de que todos os componentes necessários estão disponíveis. Quando ‘animados’ começou no QEMU, nós adicionamos facilmente os componentes necessários para configurar os arquivos para o STM32.

Primeiro lançamento no alvo

Iniciamos com sucesso os ‘desenhos animados’ em nossa placa-alvo STM32F746G-Discovery, mas notamos que apenas a metade superior da tela foi desenhada. Claro, poderíamos tentar resolver o problema depurando imediatamente na placa, mas há uma maneira mais fácil:podemos iniciar e depurar o exemplo no ambiente Linux primeiro.

Depurando no host

Para executar este exemplo e depurar seu aplicativo, você precisa da própria biblioteca Qt e também do QVFB, que é um aplicativo Qt que fornece uma tela virtual. Você pode construir o QVFB conforme descrito na documentação oficial.

Em seguida, você pode iniciar o QVFB com as resoluções de tela necessárias (480 × 272 para STM32F746G-Discovery):
   ./qvfb -width 480 -height 272 -nocursor   

Você também deve construir a biblioteca Qt com um perfil embutido, ou seja, com a opção ‘-embedded’. Esta opção foi projetada para rodar Qt sem X11 ou ambientes gráficos existentes, QWS (Qt Windowing System) será usado em seu lugar. Além disso, desabilitamos algumas outras opções e módulos desnecessários. A linha de configuração resultante foi a seguinte:
  ./configure -opensource -confirm-license -debug \ -embedded -qt-gfx-qvfb -qvfb \ -no-javascript-jit -no-script -no-scripttools \ -no-qt3support -no -webkit -nomake demos -exemplos de nomake  

Por fim, vamos construir e começar "animados". O estágio de construção é como de costume para o Qt ( qmake; make; ) Você deve especificar QVFB como uma exibição ao iniciar o aplicativo:
   ./examples/animation/animatedtiles/animatedtiles -qws -exibir QVFb:0   

Obtivemos a mesma imagem na metade superior da tela. Descobrimos no código-fonte (examples / animation / animatedtiles / main.cpp) que o aplicativo começa com “view-> show ()”, o que significa que não está no modo de tela inteira. Depois disso, ficamos totalmente convencidos de que a única metade superior da tela era usada para exibir o aplicativo. Modificamos um pouco o código de ‘animatedtiles’, adicionando a opção ‘-fullscreen’.

Lançando em STM32F746-discovery

Construímos nosso aplicativo modificado no Embox e verificamos se ele foi executado com êxito no QEMU. Mas quando estávamos iniciando o aplicativo na placa de destino, recebemos o erro “Out Of Memory”. Isso significa que o tamanho do heap em nossa configuração não é suficiente para o aplicativo. Decidimos usar ferramentas ricas de desenvolvimento no Linux para resolver o problema, ou seja, estimar o tamanho de heap necessário.

Começamos nosso aplicativo com valgrind. Valgrind é uma ferramenta para depuração de memória e criação de perfil, Massif é um profiler de heap (é uma parte do Valgrind).
   $ valgrind --tool =massif --massif-out-file =animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen   $ ms_print animatedtiles.massif> animatedtiles.out   

E descobri que o aplicativo precisava de um tamanho de heap de cerca de 2,7 MB.

Configuramos o tamanho do heap para 3 MB na configuração da Embox e iniciamos nossa demonstração novamente. Ele foi executado com sucesso no modo de tela inteira.

Lançando em STM32F769I-Discovery.

Também queríamos experimentar o exemplo em uma placa semelhante, mas com uma tela maior. Este exemplo usou o STM32F769I-Discovery com resoluções de tela de 800 × 480. Neste caso, ele requer quase 1 MB apenas para o framebuffer no modo de cores de 16 bits (800x480x2 =768000), mas há SDRAM externo suficiente (16 MB) nesta placa. Portanto, só temos que estimar o tamanho da pilha.

Começamos o QVFb com as novas resoluções (800 × 480):
  $. / qvfb -width 800 -height 480 -nocursor & 

E use valgrind como da vez anterior:
  $ valgrind --tool =massif --massif-out-file =animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen $ ms_print animatedtiles.massif> animatedtiles.out  

Descobrimos que ele precisa de cerca de 6 MB. Tínhamos configurado o tamanho de heap de 6 MB e "tempos animados" lançados com sucesso na placa STM32F769I.


Figura 1:Exemplo de animações QT na placa STM32F769I-DISCOVERY sob Embox RTOS. (Fonte:Embox)

Você pode ver como funciona neste vídeo (abaixo) e pode reproduzir os resultados você mesmo conforme descrito em nosso github wiki.

Notas:

  1. https://habr.com/ru/company/embox/blog/459730/] (em russo, mas também disponível em uma tradução de terceiros para o inglês:https://sudonull.com/ post / 25508-Porting-Qt-to-STM32-Embox-Blog
  2. https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a

Anton Bondarev é o fundador da Embox RTOS. Anton se formou na Saint Petersburg Electrotechnical University (LETI) em 2003 com um mestrado em engenharia elétrica e cursou pós-graduação na Saint-Petersburg State University com especialização em engenharia de software. Ele tem mais de 20 anos em programação embarcada e de sistema. Alexander Kalmuk é cofundador da Embox RTOS. Alexander se formou na Saint-Petersburg State University em 2014 com mestrado em matemática e engenharia de software e fez cursos de pós-graduação na Saint-Petersburg State University com especialização em teoria de controle. Ele tem mais de 10 anos em programação de sistemas embarcados.

Conteúdos Relacionados:

Para obter mais informações sobre o Embedded, assine o boletim informativo semanal da Embedded por e-mail.



Integrado

  1. Um guia para computação em nuvem no Linux
  2. Hospedagem em nuvem Linux Vs hospedagem em nuvem Windows
  3. Classificação de corantes por aplicação
  4. ST lança a série de microprocessadores STM32MP1 com distribuição Linux
  5. IC de gerenciamento de energia compatível com a família de processadores de aplicativos
  6. Telemetria do Sensor 2.0.1
  7. Java 10 - Compartilhamento de dados de classe
  8. O que é título corrente?
  9. Clustermangement no PLCnext?
  10. Aplicação Java no PLCnext Control