Ejecución de una aplicación Linux en MCU STM32
Se espera cada vez más funcionalidad de los sistemas integrados para productos inteligentes. Esto se puede lograr fácilmente con Linux, que ofrece software para cada caso que desee. Pero Linux requiere recursos de hardware bastante grandes, sobre todo memoria, por lo que la plataforma de destino normalmente será bastante cara y tendrá un alto consumo de energía. Por otro lado, los microcontroladores modernos (MCU) tienen muchos recursos que son suficientes para muchas tareas inteligentes. Al utilizar un sistema operativo en tiempo real (RTOS) como Embox RTOS, que permite el uso de software Linux en todas partes, incluidas las MCU, los desarrolladores pueden desarrollar más fácilmente dispositivos inteligentes que son menos costosos y consumen menos energía.
En este artículo, discutimos el lanzamiento de una aplicación Qt básica en una MCU incorporada que ejecuta Embox RTOS. Usamos dos placas basadas en Cortex-M7 de un solo núcleo (216MHz):STM32F746g-Discovery y STM32F769i-Discovery, que tienen pantallas táctiles con resolución de pantalla de 480 × 272 y 800 × 480, respectivamente.
Hace algún tiempo logramos lanzar un ejemplo estándar de Qt "moveblocks" en STM32F746-Discovery [Nota 1]. Sin embargo, queríamos ir más allá y lanzar un ejemplo con una pantalla táctil. Elegimos otro ejemplo estándar, "mosaicos animados". Es un ejemplo bastante bueno que se ve genial incluso en computadoras de escritorio. Es interactivo, por lo tanto, podemos usar una pantalla táctil y también parece una animación 3D.
Queríamos saber si la MCU STM32 puede proporcionar un rendimiento suficiente. No estábamos seguros de si la velocidad de la CPU sería suficiente para que la escena de renderizado fuera fluida, ya que, como descubrimos, incluso la actualización de la pantalla para una pantalla de 800 × 480 es una operación costosa [Nota 2].
Edificio
En primer lugar, creemos nuestra aplicación como parte de Embox. La forma más sencilla de hacer esto es compilar la aplicación para QEMU, que es un emulador de código abierto. Usar QEMU significa que no necesitamos ocuparnos del consumo de memoria en este caso. Esto nos ayudará a asegurarnos de que todos los componentes necesarios estén disponibles. Cuando los "mosaicos animados" comenzaron en QEMU, agregamos fácilmente los componentes necesarios a los archivos de configuración para STM32.
Primer lanzamiento en el tablero de destino
Comenzamos con éxito los "mosaicos animados" en nuestra placa de destino STM32F746G-Discovery, pero notamos que solo se dibujó la mitad superior de la pantalla. Por supuesto, podríamos intentar resolver el problema depurando inmediatamente en la placa, pero hay una manera más fácil:primero podemos iniciar y depurar el ejemplo en el entorno Linux.
Depurando en el host
Para ejecutar este ejemplo y depurar su aplicación, necesita la propia biblioteca Qt, así como QVFB, que es una aplicación Qt que proporciona una pantalla virtual. Puede compilar QVFB como se describe en la documentación oficial.
Luego, puede iniciar QVFB con las resoluciones de pantalla requeridas (480 × 272 para STM32F746G-Discovery):
./qvfb -ancho 480 -altura 272 -nocursor
También debe crear la biblioteca Qt con un perfil incrustado, es decir, con la opción "-embedded". Esta opción está diseñada para ejecutar Qt sin X11 o entornos gráficos existentes, en su lugar se utilizará QWS (Qt Windowing System). También deshabilitamos algunas otras opciones y módulos innecesarios. La línea de configuración resultante fue la siguiente:
./configure -opensource -confirm-license -debug \ -embedded -qt-gfx-qvfb -qvfb \ -no-javascript-jit -no-script -no-scripttools \ -no-qt3support -no -webkit -nomake demos -nomake ejemplos
Finalmente, construyamos y comencemos con "mosaicos animados". La etapa de compilación es la habitual para Qt ( qmake; make; ). Debe especificar QVFB como pantalla al iniciar la aplicación:
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
Tenemos la misma imagen en la mitad superior de la pantalla. Encontramos en el código fuente (examples / animation / animatedtiles / main.cpp) que la aplicación comienza con “view-> show ()”, eso significa que no está en el modo de pantalla completa. Después de eso, estábamos completamente convencidos de que la única mitad superior de la pantalla se usaba para mostrar la aplicación. Modificamos un poco el código de los "mosaicos animados", agregando la opción "-pantalla completa".
Lanzamiento en STM32F746-discovery
Construimos nuestra aplicación modificada en Embox y verificamos que se ejecutara correctamente en QEMU. Pero cuando estábamos lanzando la aplicación en la placa de destino, recibimos el error "Memoria insuficiente". Significa que el tamaño del montón en nuestra configuración no es suficiente para la aplicación. Decidimos utilizar herramientas de desarrollo enriquecidas en Linux para resolver el problema, es decir, estimar el tamaño de pila requerido.
Habíamos comenzado nuestra aplicación con valgrind. Valgrind es una herramienta para depurar y generar perfiles de memoria, Massif es un generador de perfiles de montón (es parte de Valgrind).
$ valgrind --tool =massif --massif-out-file =animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen $ ms_print animatedtiles.massif> animatedtiles.out
Y descubrió que la aplicación necesitaba un tamaño de pila de aproximadamente 2,7 MB.
Configuramos el tamaño del montón en 3 MB en la configuración de Embox y comenzamos nuestra demostración nuevamente. Se estaba ejecutando con éxito en el modo de pantalla completa.
Lanzamiento en STM32F769I-Discovery.
También queríamos probar el ejemplo en una placa similar pero con una pantalla más grande. Este ejemplo utilizó el STM32F769I-Discovery con resoluciones de pantalla de 800 × 480. En este caso, requiere casi 1 MB solo para el framebuffer en modo de color de 16 bits (800x480x2 =768000), pero hay suficiente SDRAM externa (16 MB) en esta placa. Entonces solo tenemos que estimar el tamaño del montón.
Comenzamos QVFb con las nuevas resoluciones (800 × 480):
$. / qvfb -ancho 800 -altura 480 -nocursor &
Y usa valgrind como la vez anterior:
$ valgrind --tool =massif --massif-out-file =animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen $ ms_print animatedtiles.massif> animatedtiles.out
Descubrimos que necesita unos 6 MB. Habíamos configurado un tamaño de pila de 6 MB y los "tiempos animados" se lanzaron con éxito en la placa STM32F769I.
Figura 1:Ejemplo de mosaicos animados QT en el tablero STM32F769I-DISCOVERY bajo Embox RTOS. (Fuente:Embox)
Puede ver cómo funciona en este video (a continuación) y puede reproducir los resultados usted mismo como se describe en nuestra wiki de github.
Notas:
- https://habr.com/ru/company/embox/blog/459730/] (en ruso, pero también disponible en una traducción al inglés de terceros:https://sudonull.com/ post / 25508-Porting-Qt-to-STM32-Embox-Blog
- https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a


Contenidos relacionados:
- Uso de Linux con aplicaciones críticas:¿como mezclar aceite y agua?
- ¿Por qué el proyecto Yocto para mi proyecto de IoT?
- Anticipar la necesidad de experiencia en Linux de grado automotriz
- MCU habilita Linux para IoT industrial
- La plataforma de código abierto apunta a IoT con Linux integrado
- Controladores de dispositivos Linux integrados:comprensión de su función
- Actualizaciones de OTA para Embedded Linux, parte 1:Fundamentos e implementación
- Cómo instalar un servidor web integrado seguro en un dispositivo WiFi de $ 3
- Domine el ciclo de vida interminable del desarrollo de software de los sistemas conectados, o lo dominará a usted
Para obtener más información sobre Embedded, suscríbase al boletín informativo semanal por correo electrónico de Embedded.
Incrustado
- Aplicación del niobio en estomatología
- Una guía para la computación en la nube en Linux
- Alojamiento en la nube de Linux Vs Alojamiento en la nube de Windows
- Clasificación de tintes por aplicación
- ST lanza la serie de microprocesadores STM32MP1 con distribución de Linux
- El IC de administración de energía es compatible con la familia de procesadores de aplicaciones
- Telemetría del sensor 2.0.1
- Java 10 - Intercambio de datos de clase
- ¿Qué es Running Bond?
- ¿Gestión de clústeres en PLCnext?
- Aplicación Java en PLCnext Control