LabWired permite probar firmware compilado en placas MCU simuladas (CPU y periféricos)

LabWired, el proyecto de Andrii Shylenko, es un núcleo de simulación de firmware para MCU con licencia MIT que ejecuta firmware compilado sobre CPUs y periféricos modelados, captura la salida de la UART y de los buses y el estado de los registros, y permite ejecutar comprobaciones repetibles en CI.

El simulador cubre los núcleos Arm Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7 y Cortex-M33, la arquitectura RISC-V y los núcleos Xtensa LX6 y LX7 (presentes en algunos ESP32). Su principal ventaja es que acelera las pruebas de firmware, ya que hacerlas sobre placas reales resulta lento: hay que tener el hardware preparado, flashear el firmware en cada iteración y, cuando algo falla, el desarrollador solo ve un LED apagado y ningún rastro de lo ocurrido. Si un proyecto de firmware debe soportar varias placas, el problema se multiplica enseguida.

Simulador de placas MCU LabWired

El proyecto se diferencia de un emulador de CPU o MCU por dos motivos principales:

  1. Se modela la placa completa, no solo el chip. También se simulan sensores, pantallas y dispositivos de bus, de modo que es posible inspeccionar el tráfico I2C, el tramado SPI o lo que se le pidió dibujar a un panel.
  2. El Fidelity Ledger documenta en qué puntos el modelo se queda corto y dónde el simulador sustituye al hardware real, de forma que se sabe exactamente dónde «hace trampa» LabWired en cada plataforma soportada: STM32L476, RP2040, nRF52840, ESP32, etc.

Interfaz de línea de comandos de LabWired

LabWired es ante todo una aplicación de línea de comandos, y Andrii compartió un ejemplo en el que PlatformIO compila un firmware de pruebas con Unity para un nRF52840 virtual y después LabWired lo ejecuta sin necesidad de placa ni de J-Link. Ejecutó el siguiente comando en un equipo Linux:

Las tres pruebas pasaron en 1,18 segundos, mucho más rápido que sobre hardware real. El ejemplo y la corrección están documentados en una incidencia de GitHub.

Si se trata de una aplicación de terminal, ¿por qué aparece una captura de una aplicación web al principio del artículo? Porque existe un «Browser Playground» en el que se puede experimentar con una placa NUCLEO-L476RG simulada conectada a un sensor ultrasónico, una pantalla Nokia y un analizador lógico.

El código fuente en Rust de LabWired Core está disponible en GitHub. Se puede invocar desde un terminal, desde la CI o desde un agente de programación con IA. El directorio de ejemplos contiene más de 200 configuraciones de placas que pueden utilizarse para las pruebas. También se puede consultar la matriz de validación para ver la lista de placas y periféricos soportados. Para el desarrollo se utilizó Claude Code, aunque al parecer sobre todo para la integración con el Model Context Protocol (MCP).

Parte del código es de código abierto y parte no, tal como se explica en GitHub:

Este repositorio alberga el simulador principal y sus recursos de validación: la ejecución de CPU, bus, memoria, periféricos y dispositivos externos; los descriptores de chips y sistemas; la CLI, el ejecutor de pruebas, los adaptadores de depuración y las herramientas de instantáneas y trazas; y los metadatos de validación de objetivos de hardware. La interfaz de la aplicación, el comportamiento del Playground alojado y las superficies de producto quedan fuera de este paquete.

El sitio web incluye además una página de precios. Se puede integrar todo por cuenta propia o contratar planes con «LabWired AI Tokens» si se necesita su infraestructura para las pruebas.

Precios de LabWired

Traducido del artículo en inglés «LabWired allows engineers to test compiled firmware on simulated MCU boards (CPU and peripherals)» de Jean-Luc Aufranc (CNXSoft).