2013-04-13 19:54:02 +02:00
/*
2018-03-01 15:15:06 +01:00
* FreeRTOS Kernel V10 .0 .0
* Copyright ( C ) 2017 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 . If you wish to use our Amazon
* FreeRTOS name , please do so in a fair use way that does not cause confusion .
*
* 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 !
*/
2013-04-13 19:54:02 +02:00
# ifndef STACK_MACROS_H
# define STACK_MACROS_H
2018-03-01 15:15:06 +01:00
# 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
2013-04-13 19:54:02 +02:00
/*
* 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 .
*/
/*-----------------------------------------------------------*/
2018-03-01 15:15:06 +01:00
# if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )
2013-04-13 19:54:02 +02:00
/* Only the current stack state is to be checked. */
2018-03-01 15:15:06 +01:00
# define taskCHECK_FOR_STACK_OVERFLOW() \
2013-04-13 19:54:02 +02:00
{ \
/* Is the currently saved stack pointer within the stack limit? */ \
if ( pxCurrentTCB - > pxTopOfStack < = pxCurrentTCB - > pxStack ) \
{ \
2018-03-01 15:15:06 +01:00
vApplicationStackOverflowHook ( ( TaskHandle_t ) pxCurrentTCB , pxCurrentTCB - > pcTaskName ) ; \
2013-04-13 19:54:02 +02:00
} \
}
2018-03-01 15:15:06 +01:00
# endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
2013-04-13 19:54:02 +02:00
/*-----------------------------------------------------------*/
2018-03-01 15:15:06 +01:00
# if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) )
2013-04-13 19:54:02 +02:00
/* Only the current stack state is to be checked. */
2018-03-01 15:15:06 +01:00
# define taskCHECK_FOR_STACK_OVERFLOW() \
2013-04-13 19:54:02 +02:00
{ \
\
/* Is the currently saved stack pointer within the stack limit? */ \
if ( pxCurrentTCB - > pxTopOfStack > = pxCurrentTCB - > pxEndOfStack ) \
{ \
2018-03-01 15:15:06 +01:00
vApplicationStackOverflowHook ( ( TaskHandle_t ) pxCurrentTCB , pxCurrentTCB - > pcTaskName ) ; \
2013-04-13 19:54:02 +02:00
} \
}
# endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
/*-----------------------------------------------------------*/
# if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
2018-03-01 15:15:06 +01:00
# 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 ) ; \
} \
2013-04-13 19:54:02 +02:00
}
# endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
/*-----------------------------------------------------------*/
# if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
2018-03-01 15:15:06 +01:00
# 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 ) ; \
} \
2013-04-13 19:54:02 +02:00
}
# endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
/*-----------------------------------------------------------*/
2018-03-01 15:15:06 +01:00
/* Remove stack overflow macro if not being used. */
# ifndef taskCHECK_FOR_STACK_OVERFLOW
# define taskCHECK_FOR_STACK_OVERFLOW()
# endif
2013-04-13 19:54:02 +02:00
# endif /* STACK_MACROS_H */