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 also have a legacy project using RTX4. See below where I basically ported thread stack api routines from RTOS2/RTX5 to RTX4, it may prove useful to you. Be aware that you are accessing essentially private parts of the RTX kernel directly.
/* mimic osThreadGetStackSize() from the RTOS2 api (as implemented by RTX5) */uint32_t threadGetStackSize( osThreadId t ) { P_TCB tcb = (P_TCB)t; return tcb->priv_stack ? (uint32_t) tcb->priv_stack : 0;}/* mimic osThreadGetStackSpace() from the RTOS2 api */uint32_t threadGetStackSpace( osThreadId t ) { /* No stack watermarking? Then no info on stack usage */ if( (os_stackinfo & (1 << 28)) == 0 ) return 0; const uint32_t* stack; uint32_t space, limit; P_TCB tcb = (P_TCB)t; stack = tcb->stack; limit = tcb->priv_stack ? tcb->priv_stack : (uint32_t)&__StackTop; if( *stack++ == MAGIC_WORD ) { for( space = 4U; space < limit; space += 4U ) if( *stack++ != MAGIC_PATTERN ) break; } else { space = 0U; } return space;}
Hmm, how to format this as code block?