]> begriffs open source - freertos/blob - portable/GCC/ARM_CA9/portmacro.h
Style: uncrustify kernel files
[freertos] / portable / GCC / ARM_CA9 / portmacro.h
1 /*\r
2  * FreeRTOS Kernel V10.3.1\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 given hardware\r
39  * 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     long\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     typedef uint32_t         TickType_t;\r
59     #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL\r
60 \r
61 /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do\r
62  * not need to be guarded with a critical section. */\r
63     #define portTICK_TYPE_IS_ATOMIC    1\r
64 \r
65 /*-----------------------------------------------------------*/\r
66 \r
67 /* Hardware 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 \r
72 /*-----------------------------------------------------------*/\r
73 \r
74 /* Task utilities. */\r
75 \r
76 /* Called at the end of an ISR that can cause a context switch. */\r
77     #define portEND_SWITCHING_ISR( xSwitchRequired ) \\r
78     {                                                \\r
79         extern uint32_t ulPortYieldRequired;         \\r
80                                                      \\r
81         if( xSwitchRequired != pdFALSE )             \\r
82         {                                            \\r
83             ulPortYieldRequired = pdTRUE;            \\r
84         }                                            \\r
85     }\r
86 \r
87     #define portYIELD_FROM_ISR( x )    portEND_SWITCHING_ISR( x )\r
88     #define portYIELD()                __asm volatile ( "SWI 0" ::: "memory" );\r
89 \r
90 \r
91 /*-----------------------------------------------------------\r
92 * Critical section control\r
93 *----------------------------------------------------------*/\r
94 \r
95     extern void vPortEnterCritical( void );\r
96     extern void vPortExitCritical( void );\r
97     extern uint32_t ulPortSetInterruptMask( void );\r
98     extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );\r
99     extern void vPortInstallFreeRTOSVectorTable( void );\r
100 \r
101 /* These macros do not globally disable/enable interrupts.  They do mask off\r
102  * interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */\r
103     #define portENTER_CRITICAL()                      vPortEnterCritical();\r
104     #define portEXIT_CRITICAL()                       vPortExitCritical();\r
105     #define portDISABLE_INTERRUPTS()                  ulPortSetInterruptMask()\r
106     #define portENABLE_INTERRUPTS()                   vPortClearInterruptMask( 0 )\r
107     #define portSET_INTERRUPT_MASK_FROM_ISR()         ulPortSetInterruptMask()\r
108     #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    vPortClearInterruptMask( x )\r
109 \r
110 /*-----------------------------------------------------------*/\r
111 \r
112 /* Task function macros as described on the FreeRTOS.org WEB site.  These are\r
113  * not required for this port but included in case common demo code that uses these\r
114  * macros is used. */\r
115     #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )\r
116     #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )\r
117 \r
118 /* Prototype of the FreeRTOS tick handler.  This must be installed as the\r
119  * handler for whichever peripheral is used to generate the RTOS tick. */\r
120     void FreeRTOS_Tick_Handler( void );\r
121 \r
122 /* If configUSE_TASK_FPU_SUPPORT is set to 1 (or left undefined) then tasks are\r
123  * created without an FPU context and must call vPortTaskUsesFPU() to give\r
124  * themselves an FPU context before using any FPU instructions.  If\r
125  * configUSE_TASK_FPU_SUPPORT is set to 2 then all tasks will have an FPU context\r
126  * by default. */\r
127     #if ( configUSE_TASK_FPU_SUPPORT != 2 )\r
128         void vPortTaskUsesFPU( void );\r
129     #else\r
130 \r
131 /* Each task has an FPU context already, so define this function away to\r
132  * nothing to prevent it being called accidentally. */\r
133         #define vPortTaskUsesFPU()\r
134     #endif\r
135     #define portTASK_USES_FLOATING_POINT()    vPortTaskUsesFPU()\r
136 \r
137     #define portLOWEST_INTERRUPT_PRIORITY           ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL )\r
138     #define portLOWEST_USABLE_INTERRUPT_PRIORITY    ( portLOWEST_INTERRUPT_PRIORITY - 1UL )\r
139 \r
140 /* Architecture specific optimisations. */\r
141     #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION\r
142         #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1\r
143     #endif\r
144 \r
145     #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1\r
146 \r
147 /* Store/clear the ready priorities in a bit map. */\r
148         #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )\r
149         #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )\r
150 \r
151 /*-----------------------------------------------------------*/\r
152 \r
153         #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) )\r
154 \r
155     #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */\r
156 \r
157     #ifdef configASSERT\r
158         void vPortValidateInterruptPriority( void );\r
159         #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()\r
160     #endif /* configASSERT */\r
161 \r
162     #define portNOP()                                         __asm volatile ( "NOP" )\r
163     #define portINLINE    __inline\r
164 \r
165     #ifdef __cplusplus\r
166         } /* extern C */\r
167     #endif\r
168 \r
169 \r
170 /* The number of bits to shift for an interrupt priority is dependent on the\r
171  * number of bits implemented by the interrupt controller. */\r
172     #if configUNIQUE_INTERRUPT_PRIORITIES == 16\r
173         #define portPRIORITY_SHIFT            4\r
174         #define portMAX_BINARY_POINT_VALUE    3\r
175     #elif configUNIQUE_INTERRUPT_PRIORITIES == 32\r
176         #define portPRIORITY_SHIFT            3\r
177         #define portMAX_BINARY_POINT_VALUE    2\r
178     #elif configUNIQUE_INTERRUPT_PRIORITIES == 64\r
179         #define portPRIORITY_SHIFT            2\r
180         #define portMAX_BINARY_POINT_VALUE    1\r
181     #elif configUNIQUE_INTERRUPT_PRIORITIES == 128\r
182         #define portPRIORITY_SHIFT            1\r
183         #define portMAX_BINARY_POINT_VALUE    0\r
184     #elif configUNIQUE_INTERRUPT_PRIORITIES == 256\r
185         #define portPRIORITY_SHIFT            0\r
186         #define portMAX_BINARY_POINT_VALUE    0\r
187     #else /* if configUNIQUE_INTERRUPT_PRIORITIES == 16 */\r
188         #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting.  configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware\r
189     #endif /* if configUNIQUE_INTERRUPT_PRIORITIES == 16 */\r
190 \r
191 /* Interrupt controller access addresses. */\r
192     #define portICCPMR_PRIORITY_MASK_OFFSET                      ( 0x04 )\r
193     #define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET              ( 0x0C )\r
194     #define portICCEOIR_END_OF_INTERRUPT_OFFSET                  ( 0x10 )\r
195     #define portICCBPR_BINARY_POINT_OFFSET                       ( 0x08 )\r
196     #define portICCRPR_RUNNING_PRIORITY_OFFSET                   ( 0x14 )\r
197 \r
198     #define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS       ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET )\r
199     #define portICCPMR_PRIORITY_MASK_REGISTER                    ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) )\r
200     #define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS    ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET )\r
201     #define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS        ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET )\r
202     #define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS            ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET )\r
203     #define portICCBPR_BINARY_POINT_REGISTER                     ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) )\r
204     #define portICCRPR_RUNNING_PRIORITY_REGISTER                 ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) )\r
205 \r
206     #define portMEMORY_BARRIER()    __asm volatile ( "" ::: "memory" )\r
207 \r
208 #endif /* PORTMACRO_H */\r