]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portmacro.h
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Source / portable / GCC / ARM7_LPC2000 / portmacro.h
1 /*\r
2  * FreeRTOS Kernel V10.3.0\r
3  * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 #ifndef PORTMACRO_H\r
29 #define PORTMACRO_H\r
30 \r
31 #ifdef __cplusplus\r
32 extern "C" {\r
33 #endif\r
34 \r
35 /*-----------------------------------------------------------\r
36  * Port specific definitions.\r
37  *\r
38  * The settings in this file configure FreeRTOS correctly for the\r
39  * given hardware and compiler.\r
40  *\r
41  * These settings should not be altered.\r
42  *-----------------------------------------------------------\r
43  */\r
44 \r
45 /* Type definitions. */\r
46 #define portCHAR                char\r
47 #define portFLOAT               float\r
48 #define portDOUBLE              double\r
49 #define portLONG                long\r
50 #define portSHORT               short\r
51 #define portSTACK_TYPE  uint32_t\r
52 #define portBASE_TYPE   portLONG\r
53 \r
54 typedef portSTACK_TYPE StackType_t;\r
55 typedef long BaseType_t;\r
56 typedef unsigned long UBaseType_t;\r
57 \r
58 #if( configUSE_16_BIT_TICKS == 1 )\r
59         typedef uint16_t TickType_t;\r
60         #define portMAX_DELAY ( TickType_t ) 0xffff\r
61 #else\r
62         typedef uint32_t TickType_t;\r
63         #define portMAX_DELAY ( TickType_t ) 0xffffffffUL\r
64 #endif\r
65 /*-----------------------------------------------------------*/\r
66 \r
67 /* Architecture specifics. */\r
68 #define portSTACK_GROWTH                        ( -1 )\r
69 #define portTICK_PERIOD_MS                      ( ( TickType_t ) 1000 / configTICK_RATE_HZ )\r
70 #define portBYTE_ALIGNMENT                      8\r
71 #define portNOP()                                       __asm volatile ( "NOP" );\r
72 /*-----------------------------------------------------------*/\r
73 \r
74 \r
75 /* Scheduler utilities. */\r
76 \r
77 /*\r
78  * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR\r
79  * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but\r
80  * are included here for efficiency.  An attempt to call one from\r
81  * THUMB mode code will result in a compile time error.\r
82  */\r
83 \r
84 #define portRESTORE_CONTEXT()                                                                                   \\r
85 {                                                                                                                                               \\r
86 extern volatile void * volatile pxCurrentTCB;                                                   \\r
87 extern volatile uint32_t ulCriticalNesting;                                     \\r
88                                                                                                                                                 \\r
89         /* Set the LR to the task stack. */                                                                     \\r
90         __asm volatile (                                                                                                        \\r
91         "LDR            R0, =pxCurrentTCB                                                               \n\t"   \\r
92         "LDR            R0, [R0]                                                                                \n\t"   \\r
93         "LDR            LR, [R0]                                                                                \n\t"   \\r
94                                                                                                                                                 \\r
95         /* The critical nesting depth is the first item on the stack. */        \\r
96         /* Load it into the ulCriticalNesting variable. */                                      \\r
97         "LDR            R0, =ulCriticalNesting                                                  \n\t"   \\r
98         "LDMFD  LR!, {R1}                                                                                       \n\t"   \\r
99         "STR            R1, [R0]                                                                                \n\t"   \\r
100                                                                                                                                                 \\r
101         /* Get the SPSR from the stack. */                                                                      \\r
102         "LDMFD  LR!, {R0}                                                                                       \n\t"   \\r
103         "MSR            SPSR, R0                                                                                \n\t"   \\r
104                                                                                                                                                 \\r
105         /* Restore all system mode registers for the task. */                           \\r
106         "LDMFD  LR, {R0-R14}^                                                                           \n\t"   \\r
107         "NOP                                                                                                            \n\t"   \\r
108                                                                                                                                                 \\r
109         /* Restore the return address. */                                                                       \\r
110         "LDR            LR, [LR, #+60]                                                                  \n\t"   \\r
111                                                                                                                                                 \\r
112         /* And return - correcting the offset in the LR to obtain the */        \\r
113         /* correct address. */                                                                                          \\r
114         "SUBS   PC, LR, #4                                                                                      \n\t"   \\r
115         );                                                                                                                                      \\r
116         ( void ) ulCriticalNesting;                                                                                     \\r
117         ( void ) pxCurrentTCB;                                                                                          \\r
118 }\r
119 /*-----------------------------------------------------------*/\r
120 \r
121 #define portSAVE_CONTEXT()                                                                                              \\r
122 {                                                                                                                                               \\r
123 extern volatile void * volatile pxCurrentTCB;                                                   \\r
124 extern volatile uint32_t ulCriticalNesting;                                     \\r
125                                                                                                                                                 \\r
126         /* Push R0 as we are going to use the register. */                                      \\r
127         __asm volatile (                                                                                                        \\r
128         "STMDB  SP!, {R0}                                                                                       \n\t"   \\r
129                                                                                                                                                 \\r
130         /* Set R0 to point to the task stack pointer. */                                        \\r
131         "STMDB  SP,{SP}^                                                                                        \n\t"   \\r
132         "NOP                                                                                                            \n\t"   \\r
133         "SUB    SP, SP, #4                                                                                      \n\t"   \\r
134         "LDMIA  SP!,{R0}                                                                                        \n\t"   \\r
135                                                                                                                                                 \\r
136         /* Push the return address onto the stack. */                                           \\r
137         "STMDB  R0!, {LR}                                                                                       \n\t"   \\r
138                                                                                                                                                 \\r
139         /* Now we have saved LR we can use it instead of R0. */                         \\r
140         "MOV    LR, R0                                                                                          \n\t"   \\r
141                                                                                                                                                 \\r
142         /* Pop R0 so we can save it onto the system mode stack. */                      \\r
143         "LDMIA  SP!, {R0}                                                                                       \n\t"   \\r
144                                                                                                                                                 \\r
145         /* Push all the system mode registers onto the task stack. */           \\r
146         "STMDB  LR,{R0-LR}^                                                                                     \n\t"   \\r
147         "NOP                                                                                                            \n\t"   \\r
148         "SUB    LR, LR, #60                                                                                     \n\t"   \\r
149                                                                                                                                                 \\r
150         /* Push the SPSR onto the task stack. */                                                        \\r
151         "MRS    R0, SPSR                                                                                        \n\t"   \\r
152         "STMDB  LR!, {R0}                                                                                       \n\t"   \\r
153                                                                                                                                                 \\r
154         "LDR    R0, =ulCriticalNesting                                                          \n\t"   \\r
155         "LDR    R0, [R0]                                                                                        \n\t"   \\r
156         "STMDB  LR!, {R0}                                                                                       \n\t"   \\r
157                                                                                                                                                 \\r
158         /* Store the new top of stack for the task. */                                          \\r
159         "LDR    R0, =pxCurrentTCB                                                                       \n\t"   \\r
160         "LDR    R0, [R0]                                                                                        \n\t"   \\r
161         "STR    LR, [R0]                                                                                        \n\t"   \\r
162         );                                                                                                                                      \\r
163         ( void ) ulCriticalNesting;                                                                                     \\r
164         ( void ) pxCurrentTCB;                                                                                          \\r
165 }\r
166 \r
167 extern void vTaskSwitchContext( void );\r
168 #define portYIELD_FROM_ISR()            vTaskSwitchContext()\r
169 #define portYIELD()                                     __asm volatile ( "SWI 0" )\r
170 /*-----------------------------------------------------------*/\r
171 \r
172 \r
173 /* Critical section management. */\r
174 \r
175 /*\r
176  * The interrupt management utilities can only be called from ARM mode.  When\r
177  * THUMB_INTERWORK is defined the utilities are defined as functions in\r
178  * portISR.c to ensure a switch to ARM mode.  When THUMB_INTERWORK is not\r
179  * defined then the utilities are defined as macros here - as per other ports.\r
180  */\r
181 \r
182 #ifdef THUMB_INTERWORK\r
183 \r
184         extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked));\r
185         extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked));\r
186 \r
187         #define portDISABLE_INTERRUPTS()        vPortDisableInterruptsFromThumb()\r
188         #define portENABLE_INTERRUPTS()         vPortEnableInterruptsFromThumb()\r
189 \r
190 #else\r
191 \r
192         #define portDISABLE_INTERRUPTS()                                                                                        \\r
193                 __asm volatile (                                                                                                                \\r
194                         "STMDB  SP!, {R0}               \n\t"   /* Push R0.                                             */      \\r
195                         "MRS    R0, CPSR                \n\t"   /* Get CPSR.                                    */      \\r
196                         "ORR    R0, R0, #0xC0   \n\t"   /* Disable IRQ, FIQ.                    */      \\r
197                         "MSR    CPSR, R0                \n\t"   /* Write back modified value.   */      \\r
198                         "LDMIA  SP!, {R0}                       " )     /* Pop R0.                                              */\r
199 \r
200         #define portENABLE_INTERRUPTS()                                                                                         \\r
201                 __asm volatile (                                                                                                                \\r
202                         "STMDB  SP!, {R0}               \n\t"   /* Push R0.                                             */      \\r
203                         "MRS    R0, CPSR                \n\t"   /* Get CPSR.                                    */      \\r
204                         "BIC    R0, R0, #0xC0   \n\t"   /* Enable IRQ, FIQ.                             */      \\r
205                         "MSR    CPSR, R0                \n\t"   /* Write back modified value.   */      \\r
206                         "LDMIA  SP!, {R0}                       " )     /* Pop R0.                                              */\r
207 \r
208 #endif /* THUMB_INTERWORK */\r
209 \r
210 extern void vPortEnterCritical( void );\r
211 extern void vPortExitCritical( void );\r
212 \r
213 #define portENTER_CRITICAL()            vPortEnterCritical();\r
214 #define portEXIT_CRITICAL()                     vPortExitCritical();\r
215 /*-----------------------------------------------------------*/\r
216 \r
217 /* Task function macros as described on the FreeRTOS.org WEB site. */\r
218 #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )\r
219 #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )\r
220 \r
221 #ifdef __cplusplus\r
222 }\r
223 #endif\r
224 \r
225 #endif /* PORTMACRO_H */\r
226 \r