184 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|     FreeRTOS V7.3.0 - Copyright (C) 2012 Real Time Engineers Ltd.
 | |
| 
 | |
|     FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT 
 | |
|     http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | |
| 
 | |
|     ***************************************************************************
 | |
|      *                                                                       *
 | |
|      *    FreeRTOS tutorial books are available in pdf and paperback.        *
 | |
|      *    Complete, revised, and edited pdf reference manuals are also       *
 | |
|      *    available.                                                         *
 | |
|      *                                                                       *
 | |
|      *    Purchasing FreeRTOS documentation will not only help you, by       *
 | |
|      *    ensuring you get running as quickly as possible and with an        *
 | |
|      *    in-depth knowledge of how to use FreeRTOS, it will also help       *
 | |
|      *    the FreeRTOS project to continue with its mission of providing     *
 | |
|      *    professional grade, cross platform, de facto standard solutions    *
 | |
|      *    for microcontrollers - completely free of charge!                  *
 | |
|      *                                                                       *
 | |
|      *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *
 | |
|      *                                                                       *
 | |
|      *    Thank you for using FreeRTOS, and thank you for your support!      *
 | |
|      *                                                                       *
 | |
|     ***************************************************************************
 | |
| 
 | |
| 
 | |
|     This file is part of the FreeRTOS distribution.
 | |
| 
 | |
|     FreeRTOS is free software; you can redistribute it and/or modify it under
 | |
|     the terms of the GNU General Public License (version 2) as published by the
 | |
|     Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
 | |
|     >>>NOTE<<< The modification to the GPL is included to allow you to
 | |
|     distribute a combined work that includes FreeRTOS without being obliged to
 | |
|     provide the source code for proprietary components outside of the FreeRTOS
 | |
|     kernel.  FreeRTOS is distributed in the hope that it will be useful, but
 | |
|     WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | |
|     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | |
|     more details. You should have received a copy of the GNU General Public
 | |
|     License and the FreeRTOS license exception along with FreeRTOS; if not it
 | |
|     can be viewed here: http://www.freertos.org/a00114.html and also obtained
 | |
|     by writing to Richard Barry, contact details for whom are available on the
 | |
|     FreeRTOS WEB site.
 | |
| 
 | |
|     1 tab == 4 spaces!
 | |
|     
 | |
|     ***************************************************************************
 | |
|      *                                                                       *
 | |
|      *    Having a problem?  Start by reading the FAQ "My application does   *
 | |
|      *    not run, what could be wrong?"                                     *
 | |
|      *                                                                       *
 | |
|      *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | |
|      *                                                                       *
 | |
|     ***************************************************************************
 | |
| 
 | |
|     
 | |
|     http://www.FreeRTOS.org - Documentation, training, latest versions, license 
 | |
|     and contact details.  
 | |
|     
 | |
|     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | |
|     including FreeRTOS+Trace - an indispensable productivity tool.
 | |
| 
 | |
|     Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 
 | |
|     the code with commercial support, indemnification, and middleware, under 
 | |
|     the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also
 | |
|     provide a safety engineered and independently SIL3 certified version under 
 | |
|     the SafeRTOS brand: http://www.SafeRTOS.com.
 | |
| */
 | |
| 
 | |
| #ifndef STACK_MACROS_H
 | |
| #define STACK_MACROS_H
 | |
| 
 | |
| /*
 | |
|  * 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 == 0 )
 | |
| 
 | |
| 	/* FreeRTOSConfig.h is not set to check for stack overflows. */
 | |
| 	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()
 | |
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()
 | |
| 
 | |
| #endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */
 | |
| /*-----------------------------------------------------------*/
 | |
| 
 | |
| #if( configCHECK_FOR_STACK_OVERFLOW == 1 )
 | |
| 
 | |
| 	/* FreeRTOSConfig.h is only set to use the first method of
 | |
| 	overflow checking. */
 | |
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()
 | |
| 
 | |
| #endif
 | |
| /*-----------------------------------------------------------*/
 | |
| 
 | |
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) )
 | |
| 
 | |
| 	/* Only the current stack state is to be checked. */
 | |
| 	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\
 | |
| 	{																									\
 | |
| 		/* Is the currently saved stack pointer within the stack limit? */								\
 | |
| 		if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack )										\
 | |
| 		{																								\
 | |
| 			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\
 | |
| 		}																								\
 | |
| 	}
 | |
| 
 | |
| #endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */
 | |
| /*-----------------------------------------------------------*/
 | |
| 
 | |
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) )
 | |
| 
 | |
| 	/* Only the current stack state is to be checked. */
 | |
| 	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\
 | |
| 	{																									\
 | |
| 																										\
 | |
| 		/* Is the currently saved stack pointer within the stack limit? */								\
 | |
| 		if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack )									\
 | |
| 		{																								\
 | |
| 			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\
 | |
| 		}																								\
 | |
| 	}
 | |
| 
 | |
| #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
 | |
| /*-----------------------------------------------------------*/
 | |
| 
 | |
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
 | |
| 
 | |
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()																								\
 | |
| 	{																																			\
 | |
| 	static const unsigned char 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 };	\
 | |
| 																																				\
 | |
| 																																				\
 | |
| 		/* Has the extremity of the task stack ever been written over? */																		\
 | |
| 		if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 )					\
 | |
| 		{																																		\
 | |
| 			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );											\
 | |
| 		}																																		\
 | |
| 	}
 | |
| 
 | |
| #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
 | |
| /*-----------------------------------------------------------*/
 | |
| 
 | |
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
 | |
| 
 | |
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()																								\
 | |
| 	{																																			\
 | |
| 	char *pcEndOfStack = ( char * ) pxCurrentTCB->pxEndOfStack;																					\
 | |
| 	static const unsigned char 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( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );											\
 | |
| 		}																																		\
 | |
| 	}
 | |
| 
 | |
| #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
 | |
| /*-----------------------------------------------------------*/
 | |
| 
 | |
| #endif /* STACK_MACROS_H */
 | |
| 
 | 
