Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world. And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download (registration required) various documents highlighting:

System Workbench for STM32


"printf("line: %d \n", __LINE__);" does not work on System Workbench

I add some”printf(“line: %d \n”, LINE);” in the example code. The code works fine on the STM32F469I-Disco, but I can’t find any information output in the console of System Workbench. Is there something I need to do? Or this is not how it works?

I guess that you never have printf works before on the board, do you?

If you wish your printf shows on you debug console, that means you need setting to enable your semihosting on your code, your build settings and your debugger settings.



Thank you! Now I can see printf works, but.....

When I “Run” the code, the discovery board just die as there is no error information.
When I “Debug” the code, it can run well for a while and I can see the printf information. However, I will see the following information after a while...

No source available for “_swiwrite() at 0x8000516”

Semihosting is on.
Error: jtag status contains invalid mode value - communication failure
Warn : target STM32F469.cpu is not halted
Polling target STM32F469.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 100ms
Info : Previous state query failed, trying to reconnect
Polling target STM32F469.cpu failed, trying to reexamine
Info : STM32F469.cpu: hardware has 6 breakpoints, 4 watchpoints

Any comments will be appreciated.


OK. It looks that you need to learn how to search around to find information you need.
Basically the ARM semihosting need to have the debugger semihosting channel connected, or the firmware will hanging. The best practice to deal this issue is to wrap your printf with a compiler option for debugging, and undefine this compiler option while build for release/Run.
I’m using my spare time to do the research to try to find a better way to deal this issue, aka. detect the status of debugger’s semihosting channel connection, and then to send the data over or drop them. The progress is quite slow and I don’t think I can make it soon.


I’ve tried using semihosting in the past and ran into similar problems - crashes the target if no debugger is connected, along with the fact that I/O blocks and is SLOW.

My personal preference is to use a free USART channel for debug I/O. The trick in doing this is that you need a decent USART I/O library (preferably one that supports nonblocking, buffered operation) and need to know how to create and set up (at a minimum) the _read() and _write() functions that will redirect stdin/stdout/stderr output to the USART.