Hello,
I m using Keil RTX on STM32F411. My IDE is Keil too.
I have a task to maintain and upgrade previous code where RTX is being used.
I need to debug a Stack Overflow (seen in System and Thread Viewer) and for that I need to identify the first overflow event to dig in that thread.
We can learn about hooks in freeRTOS here: https://www.youtube.com/watch?v=vBoP4Q6rf5g&list=PLnMKNibPkDnFeFV4eBfDQ9e5IrGL_dx1Q&index=20
The idea of having a callback when a Stack Overflow event happens is great.
Can some one give me a Tip, how to implement Hook in RTX or any approach to deal with Stack Overflow in RTX?
Another question is, I see a lot of Stack Overflows in " System and Thread Viewer" but would expect my System to fail totally, but instead the majority (not all) of Threads keep running.
I mean, this code shouldn't be running, one stack overflow would be enough to ruin the application. Is " System and Thread Viewer" info reliable?
br
I assume you are using RTX5 and not the older version 4.
If you set OS_STACK_CHECK at build time, then on any context switch, RTX will check that the thread that is being de-scheduled has not gone off the end of its stack. Of course in some respects, that check is too late. You really want the system to alert you to the first instruction that blows the stack. You could try using the MPU (if your cpu has it, it is optional) and use it to make non-writable the memory area below your thread stack(s). You'd need to have a very clear picture of the memory layout of the system, but you can get that from the linker script (scatter file).
Another trick I have used is where the idler thread simply enumerates all threads and calls osThreadGetStackSpace for each, maintaining a list of minimum values and printing each time a thread lowers its space remaining. You could print to SWO or some other channel.Of course, the idler only runs when all real threads are asleep/blocked, so again this technique won't show you the MOST space used by any thread, but will give clues as to when a thread approaches using all of its allocated space.
I fully agree with tobermory and I would also enable 'Stack Watermarking'. With this option, the debugger 'sees' the total stack consumption of a thread and not just at the time a thread is switched.