One API, many targets
Write against hal.h. The build system picks the port directory — no #ifdef soup in shared code, ever.
The same C source file runs as a native host process and as MCU firmware. Only the port layer changes — selected at build time, invisible to application code.
#include "hal/hal.h"
int main(void) { lpl_gpio_init(); lpl_gpio_set_mode(LPL_PIN_A0, LPL_GPIO_OUTPUT);
while (1) { lpl_gpio_write(LPL_PIN_A0, LPL_GPIO_HIGH); lpl_delay_ms(500); lpl_gpio_write(LPL_PIN_A0, LPL_GPIO_LOW); lpl_delay_ms(500); }}# Run on the host — no hardware neededmake TARGET=host examples./build/host/blinky
# Cross-compile for STM32L4 and flashmake TARGET=stm32l4 examplesst-flash write build/stm32l4/blinky.bin 0x8000000
One API, many targets
Write against hal.h. The build system picks the port directory — no #ifdef soup in shared code, ever.
Test without hardware
All logic runs as plain host processes. The POSIX port is the primary CI target. Hardware is never a prerequisite.
Live dashboard
Visualize GPIO, UART, ADC, and the simulation bus in real time from a web dashboard.
No overhead
C11. No dynamic allocation. No vendor SDKs in shared code. No feature added “just in case.”