Semihosting is a mechanism that enables code running on the target device to communicate and use the Input/Output of the host computer.



Firstly, to enable semihosting, you need to remove stubs (-lnosys and -specs=nosys.specs flags) from a development platform, and use the semihosted version of the syscalls (adding --specs=rdimon.specs and -lrdimon to the compiler).

Secondly, you need to override the test_testing_command and configure a tool that will redirect test results to the I/O.


In this example, we run a simple test_dummy test on the ST Nucleo L152RE board from the ST STM32 development platform.

The configuration is done in extra script using Advanced Scripting. The example uses Unity testing framework and the Custom unity_config.h.

See the source code and complete PlatformIO project.


We use the pio test command to run the tests.

> pio test

Verbose mode can be enabled via `-v, --verbose` option
Collected 1 tests

Processing test_dummy in nucleo_l1521re environment
Info : clock speed 300 kHz
Info : STLINK V2J29M18 (API v2) VID:PID 0483:374B
Info : Target voltage: 3.272727
Info : stm32l1.cpu: Cortex-M3 r2p0 processor detected
Info : stm32l1.cpu: target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32l1.cpu on 3333
Info : Listening on port 3333 for gdb connections
semihosting is enabled
Info : Unable to match requested speed 300 kHz, using 240 kHz
Info : Unable to match requested speed 300 kHz, using 240 kHz
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
test/test_dummy/test_main.c:19: test_dummy    [PASSED]
-------------------- nucleo_l1521re:test_dummy [PASSED] Took 5.43 seconds --------------------

===================================== SUMMARY =====================================
Environment     Test        Status    Duration
--------------  ----------  --------  ------------
nucleo_l1521re  test_dummy  PASSED    00:00:05.433
==================== 1 test cases: 1 succeeded in 00:00:05.433 ====================