diff --git a/os/ports/GCC/ARMCMx/chcore_v6m.c b/os/ports/GCC/ARMCMx/chcore_v6m.c index 162348385..1e4371c10 100644 --- a/os/ports/GCC/ARMCMx/chcore_v6m.c +++ b/os/ports/GCC/ARMCMx/chcore_v6m.c @@ -116,16 +116,9 @@ void _port_switch_from_isr(void) { #if !defined(__DOXYGEN__) __attribute__((naked)) #endif -void port_switch(Thread *ntp, Thread *otp) { +void _port_switch(Thread *ntp, Thread *otp) { register struct intctx *r13 asm ("r13"); - /* Stack overflow check, if enabled.*/ -#if CH_DBG_ENABLE_STACK_CHECK - if ((void *)(r13 - 1) < (void *)(otp + 1)) - asm volatile ("movs r0, #0 \n\t" - "b chDbgPanic"); -#endif /* CH_DBG_ENABLE_STACK_CHECK */ - PUSH_CONTEXT(r13); otp->p_ctx.r13 = r13; diff --git a/os/ports/GCC/ARMCMx/chcore_v6m.h b/os/ports/GCC/ARMCMx/chcore_v6m.h index d495e1f5c..518eba855 100644 --- a/os/ports/GCC/ARMCMx/chcore_v6m.h +++ b/os/ports/GCC/ARMCMx/chcore_v6m.h @@ -88,7 +88,7 @@ struct intctx { * reduce this value to zero when compiling with optimizations. */ #ifndef IDLE_THREAD_STACK_SIZE -#define IDLE_THREAD_STACK_SIZE 8 +#define IDLE_THREAD_STACK_SIZE 16 #endif /** @@ -206,11 +206,32 @@ struct intctx { #define port_wait_for_interrupt() #endif +/** + * @brief Performs a context switch between two threads. + * @details This is the most critical code in any port, this function + * is responsible for the context switch between 2 threads. + * @note The implementation of this code affects directly the context + * switch performance so optimize here as much as you can. + * + * @param[in] ntp the thread to be switched in + * @param[in] otp the thread to be switched out + */ +#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) +#define port_switch(ntp, otp) _port_switch(ntp, otp) +#else +#define port_switch(ntp, otp) { \ + register struct intctx *r13 asm ("r13"); \ + if ((void *)(r13 - 1) < (void *)(otp + 1)) \ + chDbgPanic("stack overflow"); \ + _port_switch(ntp, otp); \ +} +#endif + #ifdef __cplusplus extern "C" { #endif void port_halt(void); - void port_switch(Thread *ntp, Thread *otp); + void _port_switch(Thread *ntp, Thread *otp); void _port_irq_epilogue(regarm_t lr); void _port_switch_from_isr(void); void _port_thread_start(void); diff --git a/os/ports/IAR/ARMCMx/chcore_v6m.h b/os/ports/IAR/ARMCMx/chcore_v6m.h index 39d19d390..2b8ae6266 100644 --- a/os/ports/IAR/ARMCMx/chcore_v6m.h +++ b/os/ports/IAR/ARMCMx/chcore_v6m.h @@ -88,7 +88,7 @@ struct intctx { * reduce this value to zero when compiling with optimizations. */ #ifndef IDLE_THREAD_STACK_SIZE -#define IDLE_THREAD_STACK_SIZE 8 +#define IDLE_THREAD_STACK_SIZE 16 #endif /** diff --git a/os/ports/RVCT/ARMCMx/chcore_v6m.h b/os/ports/RVCT/ARMCMx/chcore_v6m.h index 51d8a4d1c..a02709dfe 100644 --- a/os/ports/RVCT/ARMCMx/chcore_v6m.h +++ b/os/ports/RVCT/ARMCMx/chcore_v6m.h @@ -88,7 +88,7 @@ struct intctx { * reduce this value to zero when compiling with optimizations. */ #ifndef IDLE_THREAD_STACK_SIZE -#define IDLE_THREAD_STACK_SIZE 8 +#define IDLE_THREAD_STACK_SIZE 16 #endif /** diff --git a/readme.txt b/readme.txt index 6feb78802..b9c4fd9c0 100644 --- a/readme.txt +++ b/readme.txt @@ -69,6 +69,9 @@ ***************************************************************************** *** 2.2.3 *** +- FIX: Fixed insufficient idle thread stack in Cortex-M0-GCC port + (bug 3226671). +- FIX: Fixed stack checking in Cortex-M0-GCC port (bug 3226657). - FIX: Fixed wrong checks in PAL driver (bug 3224681). - FIX: Fixed wrong checks in I/O Queues (bug 3219197). - FIX: Fixed invalid assertion in adcConvert() (bug 3205410).