2024-10-15 22:25:54 +02:00
/*
* FreeRTOS Kernel V10 .3 .1
* Copyright ( C ) 2020 Amazon . com , Inc . or its affiliates . All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a copy of
* this software and associated documentation files ( the " Software " ) , to deal in
* the Software without restriction , including without limitation the rights to
* use , copy , modify , merge , publish , distribute , sublicense , and / or sell copies of
* the Software , and to permit persons to whom the Software is furnished to do so ,
* subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY , FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER
* IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
*
* http : //www.FreeRTOS.org
* http : //aws.amazon.com/freertos
*
* 1 tab = = 4 spaces !
*/
# ifndef STACK_MACROS_H
# define STACK_MACROS_H
# ifndef _MSC_VER /* Visual Studio doesn't support #warning. */
# warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in future released.
# endif
/*
* Call the stack overflow hook function if the stack of the task being swapped
* out is currently overflowed , or looks like it might have overflowed in the
* past .
*
* Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check
* the current stack state only - comparing the current top of stack value to
* the stack limit . Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1
* will also cause the last few stack bytes to be checked to ensure the value
* to which the bytes were set when the task was created have not been
* overwritten . Note this second test does not guarantee that an overflowed
* stack will always be recognised .
*/
/*-----------------------------------------------------------*/
# if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )
/* Only the current stack state is to be checked. */
# define taskCHECK_FOR_STACK_OVERFLOW() \
{ \
/* Is the currently saved stack pointer within the stack limit? */ \
if ( pxCurrentTCB - > pxTopOfStack < = pxCurrentTCB - > pxStack ) \
{ \
vApplicationStackOverflowHook ( ( TaskHandle_t ) pxCurrentTCB , pxCurrentTCB - > pcTaskName ) ; \
} \
}
# endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
/*-----------------------------------------------------------*/
# if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) )
/* Only the current stack state is to be checked. */
# define taskCHECK_FOR_STACK_OVERFLOW() \
{ \
\
/* Is the currently saved stack pointer within the stack limit? */ \
if ( pxCurrentTCB - > pxTopOfStack > = pxCurrentTCB - > pxEndOfStack ) \
{ \
vApplicationStackOverflowHook ( ( TaskHandle_t ) pxCurrentTCB , pxCurrentTCB - > pcTaskName ) ; \
} \
}
# endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
/*-----------------------------------------------------------*/
# if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
# define taskCHECK_FOR_STACK_OVERFLOW() \
{ \
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB - > pxStack ; \
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5 ; \
\
if ( ( pulStack [ 0 ] ! = ulCheckValue ) | | \
( pulStack [ 1 ] ! = ulCheckValue ) | | \
( pulStack [ 2 ] ! = ulCheckValue ) | | \
( pulStack [ 3 ] ! = ulCheckValue ) ) \
{ \
vApplicationStackOverflowHook ( ( TaskHandle_t ) pxCurrentTCB , pxCurrentTCB - > pcTaskName ) ; \
} \
}
# endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
/*-----------------------------------------------------------*/
# if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
# define taskCHECK_FOR_STACK_OVERFLOW() \
{ \
int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB - > pxEndOfStack ; \
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 } ; \
\
\
pcEndOfStack - = sizeof ( ucExpectedStackBytes ) ; \
\
/* Has the extremity of the task stack ever been written over? */ \
if ( memcmp ( ( void * ) pcEndOfStack , ( void * ) ucExpectedStackBytes , sizeof ( ucExpectedStackBytes ) ) ! = 0 ) \
{ \
vApplicationStackOverflowHook ( ( TaskHandle_t ) pxCurrentTCB , pxCurrentTCB - > pcTaskName ) ; \
} \
}
# endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
/*-----------------------------------------------------------*/
/* Remove stack overflow macro if not being used. */
# ifndef taskCHECK_FOR_STACK_OVERFLOW
# define taskCHECK_FOR_STACK_OVERFLOW()
# endif
# endif /* STACK_MACROS_H */