Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: frdm_k64f_freertos_lib
src/include/StackMacros.h@0:62cd296ba2a7, 2017-05-31 (annotated)
- Committer:
- fep
- Date:
- Wed May 31 02:27:10 2017 +0000
- Revision:
- 0:62cd296ba2a7
FreeRTOS v9.0.0 for Cortex-M4F (FRDM-K64F and others...)
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| fep | 0:62cd296ba2a7 | 1 | /* |
| fep | 0:62cd296ba2a7 | 2 | FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. |
| fep | 0:62cd296ba2a7 | 3 | All rights reserved |
| fep | 0:62cd296ba2a7 | 4 | |
| fep | 0:62cd296ba2a7 | 5 | VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. |
| fep | 0:62cd296ba2a7 | 6 | |
| fep | 0:62cd296ba2a7 | 7 | This file is part of the FreeRTOS distribution. |
| fep | 0:62cd296ba2a7 | 8 | |
| fep | 0:62cd296ba2a7 | 9 | FreeRTOS is free software; you can redistribute it and/or modify it under |
| fep | 0:62cd296ba2a7 | 10 | the terms of the GNU General Public License (version 2) as published by the |
| fep | 0:62cd296ba2a7 | 11 | Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. |
| fep | 0:62cd296ba2a7 | 12 | |
| fep | 0:62cd296ba2a7 | 13 | *************************************************************************** |
| fep | 0:62cd296ba2a7 | 14 | >>! NOTE: The modification to the GPL is included to allow you to !<< |
| fep | 0:62cd296ba2a7 | 15 | >>! distribute a combined work that includes FreeRTOS without being !<< |
| fep | 0:62cd296ba2a7 | 16 | >>! obliged to provide the source code for proprietary components !<< |
| fep | 0:62cd296ba2a7 | 17 | >>! outside of the FreeRTOS kernel. !<< |
| fep | 0:62cd296ba2a7 | 18 | *************************************************************************** |
| fep | 0:62cd296ba2a7 | 19 | |
| fep | 0:62cd296ba2a7 | 20 | FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY |
| fep | 0:62cd296ba2a7 | 21 | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| fep | 0:62cd296ba2a7 | 22 | FOR A PARTICULAR PURPOSE. Full license text is available on the following |
| fep | 0:62cd296ba2a7 | 23 | link: http://www.freertos.org/a00114.html |
| fep | 0:62cd296ba2a7 | 24 | |
| fep | 0:62cd296ba2a7 | 25 | *************************************************************************** |
| fep | 0:62cd296ba2a7 | 26 | * * |
| fep | 0:62cd296ba2a7 | 27 | * FreeRTOS provides completely free yet professionally developed, * |
| fep | 0:62cd296ba2a7 | 28 | * robust, strictly quality controlled, supported, and cross * |
| fep | 0:62cd296ba2a7 | 29 | * platform software that is more than just the market leader, it * |
| fep | 0:62cd296ba2a7 | 30 | * is the industry's de facto standard. * |
| fep | 0:62cd296ba2a7 | 31 | * * |
| fep | 0:62cd296ba2a7 | 32 | * Help yourself get started quickly while simultaneously helping * |
| fep | 0:62cd296ba2a7 | 33 | * to support the FreeRTOS project by purchasing a FreeRTOS * |
| fep | 0:62cd296ba2a7 | 34 | * tutorial book, reference manual, or both: * |
| fep | 0:62cd296ba2a7 | 35 | * http://www.FreeRTOS.org/Documentation * |
| fep | 0:62cd296ba2a7 | 36 | * * |
| fep | 0:62cd296ba2a7 | 37 | *************************************************************************** |
| fep | 0:62cd296ba2a7 | 38 | |
| fep | 0:62cd296ba2a7 | 39 | http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading |
| fep | 0:62cd296ba2a7 | 40 | the FAQ page "My application does not run, what could be wrong?". Have you |
| fep | 0:62cd296ba2a7 | 41 | defined configASSERT()? |
| fep | 0:62cd296ba2a7 | 42 | |
| fep | 0:62cd296ba2a7 | 43 | http://www.FreeRTOS.org/support - In return for receiving this top quality |
| fep | 0:62cd296ba2a7 | 44 | embedded software for free we request you assist our global community by |
| fep | 0:62cd296ba2a7 | 45 | participating in the support forum. |
| fep | 0:62cd296ba2a7 | 46 | |
| fep | 0:62cd296ba2a7 | 47 | http://www.FreeRTOS.org/training - Investing in training allows your team to |
| fep | 0:62cd296ba2a7 | 48 | be as productive as possible as early as possible. Now you can receive |
| fep | 0:62cd296ba2a7 | 49 | FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers |
| fep | 0:62cd296ba2a7 | 50 | Ltd, and the world's leading authority on the world's leading RTOS. |
| fep | 0:62cd296ba2a7 | 51 | |
| fep | 0:62cd296ba2a7 | 52 | http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, |
| fep | 0:62cd296ba2a7 | 53 | including FreeRTOS+Trace - an indispensable productivity tool, a DOS |
| fep | 0:62cd296ba2a7 | 54 | compatible FAT file system, and our tiny thread aware UDP/IP stack. |
| fep | 0:62cd296ba2a7 | 55 | |
| fep | 0:62cd296ba2a7 | 56 | http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. |
| fep | 0:62cd296ba2a7 | 57 | Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. |
| fep | 0:62cd296ba2a7 | 58 | |
| fep | 0:62cd296ba2a7 | 59 | http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High |
| fep | 0:62cd296ba2a7 | 60 | Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS |
| fep | 0:62cd296ba2a7 | 61 | licenses offer ticketed support, indemnification and commercial middleware. |
| fep | 0:62cd296ba2a7 | 62 | |
| fep | 0:62cd296ba2a7 | 63 | http://www.SafeRTOS.com - High Integrity Systems also provide a safety |
| fep | 0:62cd296ba2a7 | 64 | engineered and independently SIL3 certified version for use in safety and |
| fep | 0:62cd296ba2a7 | 65 | mission critical applications that require provable dependability. |
| fep | 0:62cd296ba2a7 | 66 | |
| fep | 0:62cd296ba2a7 | 67 | 1 tab == 4 spaces! |
| fep | 0:62cd296ba2a7 | 68 | */ |
| fep | 0:62cd296ba2a7 | 69 | |
| fep | 0:62cd296ba2a7 | 70 | #ifndef STACK_MACROS_H |
| fep | 0:62cd296ba2a7 | 71 | #define STACK_MACROS_H |
| fep | 0:62cd296ba2a7 | 72 | |
| fep | 0:62cd296ba2a7 | 73 | /* |
| fep | 0:62cd296ba2a7 | 74 | * Call the stack overflow hook function if the stack of the task being swapped |
| fep | 0:62cd296ba2a7 | 75 | * out is currently overflowed, or looks like it might have overflowed in the |
| fep | 0:62cd296ba2a7 | 76 | * past. |
| fep | 0:62cd296ba2a7 | 77 | * |
| fep | 0:62cd296ba2a7 | 78 | * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check |
| fep | 0:62cd296ba2a7 | 79 | * the current stack state only - comparing the current top of stack value to |
| fep | 0:62cd296ba2a7 | 80 | * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 |
| fep | 0:62cd296ba2a7 | 81 | * will also cause the last few stack bytes to be checked to ensure the value |
| fep | 0:62cd296ba2a7 | 82 | * to which the bytes were set when the task was created have not been |
| fep | 0:62cd296ba2a7 | 83 | * overwritten. Note this second test does not guarantee that an overflowed |
| fep | 0:62cd296ba2a7 | 84 | * stack will always be recognised. |
| fep | 0:62cd296ba2a7 | 85 | */ |
| fep | 0:62cd296ba2a7 | 86 | |
| fep | 0:62cd296ba2a7 | 87 | /*-----------------------------------------------------------*/ |
| fep | 0:62cd296ba2a7 | 88 | |
| fep | 0:62cd296ba2a7 | 89 | #if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) |
| fep | 0:62cd296ba2a7 | 90 | |
| fep | 0:62cd296ba2a7 | 91 | /* Only the current stack state is to be checked. */ |
| fep | 0:62cd296ba2a7 | 92 | #define taskCHECK_FOR_STACK_OVERFLOW() \ |
| fep | 0:62cd296ba2a7 | 93 | { \ |
| fep | 0:62cd296ba2a7 | 94 | /* Is the currently saved stack pointer within the stack limit? */ \ |
| fep | 0:62cd296ba2a7 | 95 | if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ |
| fep | 0:62cd296ba2a7 | 96 | { \ |
| fep | 0:62cd296ba2a7 | 97 | vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ |
| fep | 0:62cd296ba2a7 | 98 | } \ |
| fep | 0:62cd296ba2a7 | 99 | } |
| fep | 0:62cd296ba2a7 | 100 | |
| fep | 0:62cd296ba2a7 | 101 | #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ |
| fep | 0:62cd296ba2a7 | 102 | /*-----------------------------------------------------------*/ |
| fep | 0:62cd296ba2a7 | 103 | |
| fep | 0:62cd296ba2a7 | 104 | #if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) |
| fep | 0:62cd296ba2a7 | 105 | |
| fep | 0:62cd296ba2a7 | 106 | /* Only the current stack state is to be checked. */ |
| fep | 0:62cd296ba2a7 | 107 | #define taskCHECK_FOR_STACK_OVERFLOW() \ |
| fep | 0:62cd296ba2a7 | 108 | { \ |
| fep | 0:62cd296ba2a7 | 109 | \ |
| fep | 0:62cd296ba2a7 | 110 | /* Is the currently saved stack pointer within the stack limit? */ \ |
| fep | 0:62cd296ba2a7 | 111 | if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ |
| fep | 0:62cd296ba2a7 | 112 | { \ |
| fep | 0:62cd296ba2a7 | 113 | vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ |
| fep | 0:62cd296ba2a7 | 114 | } \ |
| fep | 0:62cd296ba2a7 | 115 | } |
| fep | 0:62cd296ba2a7 | 116 | |
| fep | 0:62cd296ba2a7 | 117 | #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ |
| fep | 0:62cd296ba2a7 | 118 | /*-----------------------------------------------------------*/ |
| fep | 0:62cd296ba2a7 | 119 | |
| fep | 0:62cd296ba2a7 | 120 | #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) |
| fep | 0:62cd296ba2a7 | 121 | |
| fep | 0:62cd296ba2a7 | 122 | #define taskCHECK_FOR_STACK_OVERFLOW() \ |
| fep | 0:62cd296ba2a7 | 123 | { \ |
| fep | 0:62cd296ba2a7 | 124 | const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ |
| fep | 0:62cd296ba2a7 | 125 | const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ |
| fep | 0:62cd296ba2a7 | 126 | \ |
| fep | 0:62cd296ba2a7 | 127 | if( ( pulStack[ 0 ] != ulCheckValue ) || \ |
| fep | 0:62cd296ba2a7 | 128 | ( pulStack[ 1 ] != ulCheckValue ) || \ |
| fep | 0:62cd296ba2a7 | 129 | ( pulStack[ 2 ] != ulCheckValue ) || \ |
| fep | 0:62cd296ba2a7 | 130 | ( pulStack[ 3 ] != ulCheckValue ) ) \ |
| fep | 0:62cd296ba2a7 | 131 | { \ |
| fep | 0:62cd296ba2a7 | 132 | vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ |
| fep | 0:62cd296ba2a7 | 133 | } \ |
| fep | 0:62cd296ba2a7 | 134 | } |
| fep | 0:62cd296ba2a7 | 135 | |
| fep | 0:62cd296ba2a7 | 136 | #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ |
| fep | 0:62cd296ba2a7 | 137 | /*-----------------------------------------------------------*/ |
| fep | 0:62cd296ba2a7 | 138 | |
| fep | 0:62cd296ba2a7 | 139 | #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) |
| fep | 0:62cd296ba2a7 | 140 | |
| fep | 0:62cd296ba2a7 | 141 | #define taskCHECK_FOR_STACK_OVERFLOW() \ |
| fep | 0:62cd296ba2a7 | 142 | { \ |
| fep | 0:62cd296ba2a7 | 143 | int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ |
| fep | 0:62cd296ba2a7 | 144 | static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ |
| fep | 0:62cd296ba2a7 | 145 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ |
| fep | 0:62cd296ba2a7 | 146 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ |
| fep | 0:62cd296ba2a7 | 147 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ |
| fep | 0:62cd296ba2a7 | 148 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ |
| fep | 0:62cd296ba2a7 | 149 | \ |
| fep | 0:62cd296ba2a7 | 150 | \ |
| fep | 0:62cd296ba2a7 | 151 | pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ |
| fep | 0:62cd296ba2a7 | 152 | \ |
| fep | 0:62cd296ba2a7 | 153 | /* Has the extremity of the task stack ever been written over? */ \ |
| fep | 0:62cd296ba2a7 | 154 | if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ |
| fep | 0:62cd296ba2a7 | 155 | { \ |
| fep | 0:62cd296ba2a7 | 156 | vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ |
| fep | 0:62cd296ba2a7 | 157 | } \ |
| fep | 0:62cd296ba2a7 | 158 | } |
| fep | 0:62cd296ba2a7 | 159 | |
| fep | 0:62cd296ba2a7 | 160 | #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ |
| fep | 0:62cd296ba2a7 | 161 | /*-----------------------------------------------------------*/ |
| fep | 0:62cd296ba2a7 | 162 | |
| fep | 0:62cd296ba2a7 | 163 | /* Remove stack overflow macro if not being used. */ |
| fep | 0:62cd296ba2a7 | 164 | #ifndef taskCHECK_FOR_STACK_OVERFLOW |
| fep | 0:62cd296ba2a7 | 165 | #define taskCHECK_FOR_STACK_OVERFLOW() |
| fep | 0:62cd296ba2a7 | 166 | #endif |
| fep | 0:62cd296ba2a7 | 167 | |
| fep | 0:62cd296ba2a7 | 168 | |
| fep | 0:62cd296ba2a7 | 169 | |
| fep | 0:62cd296ba2a7 | 170 | #endif /* STACK_MACROS_H */ |
| fep | 0:62cd296ba2a7 | 171 | |
| fep | 0:62cd296ba2a7 | 172 |