mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
stack-overflow-check: Introduce portGET_CURRENT_TOP_OF_STACK macro
When MPU wrapper v2 is used, the task's context is stored in TCB and `pxTopOfStack`` member of TCB points to the context location in TCB. We, therefore, need to read PSP to find the task's current top of stack. Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com> Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
parent
029545f4ad
commit
3f23eab8c7
|
@ -93,6 +93,10 @@
|
||||||
#define portBASE_TYPE_EXIT_CRITICAL() taskEXIT_CRITICAL()
|
#define portBASE_TYPE_EXIT_CRITICAL() taskEXIT_CRITICAL()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef portGET_CURRENT_TOP_OF_STACK
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { pxCurrentTopOfStack = ( StackType_t * ) pxCurrentTCB->pxTopOfStack; }
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef configSTACK_DEPTH_TYPE
|
#ifndef configSTACK_DEPTH_TYPE
|
||||||
#define configSTACK_DEPTH_TYPE StackType_t
|
#define configSTACK_DEPTH_TYPE StackType_t
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,9 +57,13 @@
|
||||||
|
|
||||||
/* Only the current stack state is to be checked. */
|
/* Only the current stack state is to be checked. */
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
|
StackType_t * pxCurrentTopOfStack; \
|
||||||
|
portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \
|
||||||
|
\
|
||||||
/* Is the currently saved stack pointer within the stack limit? */ \
|
/* Is the currently saved stack pointer within the stack limit? */ \
|
||||||
if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \
|
if( pxCurrentTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \
|
||||||
{ \
|
{ \
|
||||||
char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \
|
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \
|
||||||
|
@ -73,10 +77,13 @@
|
||||||
|
|
||||||
/* Only the current stack state is to be checked. */
|
/* Only the current stack state is to be checked. */
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
|
StackType_t * pxCurrentTopOfStack; \
|
||||||
|
portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \
|
||||||
\
|
\
|
||||||
/* Is the currently saved stack pointer within the stack limit? */ \
|
/* Is the currently saved stack pointer within the stack limit? */ \
|
||||||
if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \
|
if( pxCurrentTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \
|
||||||
{ \
|
{ \
|
||||||
char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \
|
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \
|
||||||
|
@ -89,11 +96,14 @@
|
||||||
#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
|
#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
|
||||||
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \
|
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \
|
||||||
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5U; \
|
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5U; \
|
||||||
|
StackType_t * pxCurrentTopOfStack; \
|
||||||
|
portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \
|
||||||
\
|
\
|
||||||
if( ( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) || \
|
if( ( pxCurrentTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) || \
|
||||||
( pulStack[ 0 ] != ulCheckValue ) || \
|
( pulStack[ 0 ] != ulCheckValue ) || \
|
||||||
( pulStack[ 1 ] != ulCheckValue ) || \
|
( pulStack[ 1 ] != ulCheckValue ) || \
|
||||||
( pulStack[ 2 ] != ulCheckValue ) || \
|
( pulStack[ 2 ] != ulCheckValue ) || \
|
||||||
|
@ -110,18 +120,20 @@
|
||||||
#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
|
#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
|
||||||
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \
|
int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \
|
||||||
static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \
|
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \
|
||||||
\
|
StackType_t * pxCurrentTopOfStack; \
|
||||||
|
portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \
|
||||||
\
|
\
|
||||||
pcEndOfStack -= sizeof( ucExpectedStackBytes ); \
|
pcEndOfStack -= sizeof( ucExpectedStackBytes ); \
|
||||||
\
|
\
|
||||||
if( ( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) || \
|
if( ( pxCurrentTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) || \
|
||||||
( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) ) \
|
( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) ) \
|
||||||
{ \
|
{ \
|
||||||
char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -217,6 +217,11 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
#error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When MPU wrapper v2 is used, the task's context is stored in TCB and
|
||||||
|
* pxTopOfStack member of TCB points to the context location in TCB. We,
|
||||||
|
* therefore, need to read PSP to find the task's current top of stack. */
|
||||||
|
#define portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ) { __asm volatile ( "mrs %0, psp" : "=r" ( pxCurrentTopOfStack ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief System call stack.
|
* @brief System call stack.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue