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 */
 | ||
|  | 
 |