This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

StackOverflow Hook in Keil RTX

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

 

Parents
  • 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?

Reply
  • 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?

Children
No data