portmacro.h
Go to the documentation of this file.
1 /*
2  * FreeRTOS Kernel V10.0.0
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of
6  * this software and associated documentation files (the "Software"), to deal in
7  * the Software without restriction, including without limitation the rights to
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9  * the Software, and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all
13  * copies or substantial portions of the Software. If you wish to use our Amazon
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * http://www.FreeRTOS.org
24  * http://aws.amazon.com/freertos
25  *
26  * 1 tab == 4 spaces!
27  */
28 
29 
30 #ifndef PORTMACRO_H
31 #define PORTMACRO_H
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 /*-----------------------------------------------------------
38  * Port specific definitions.
39  *
40  * The settings in this file configure FreeRTOS correctly for the
41  * given hardware and compiler.
42  *
43  * These settings should not be altered.
44  *-----------------------------------------------------------
45  */
46 
47 /* Type definitions. */
48 #define portCHAR char
49 #define portFLOAT float
50 #define portDOUBLE double
51 #define portLONG long
52 #define portSHORT short
53 #define portSTACK_TYPE uint32_t
54 #define portBASE_TYPE long
55 
57 typedef long BaseType_t;
58 typedef unsigned long UBaseType_t;
59 
60 #if( configUSE_16_BIT_TICKS == 1 )
61  typedef uint16_t TickType_t;
62  #define portMAX_DELAY ( TickType_t ) 0xffff
63 #else
64  typedef uint32_t TickType_t;
65  #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
66 
67  /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
68  not need to be guarded with a critical section. */
69  #define portTICK_TYPE_IS_ATOMIC 1
70 #endif
71 /*-----------------------------------------------------------*/
72 
73 /* Architecture specifics. */
74 #define portSTACK_GROWTH ( -1 )
75 #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
76 #define portBYTE_ALIGNMENT 8
77 /*-----------------------------------------------------------*/
78 
79 /* Scheduler utilities. */
80 #define portYIELD() \
81 { \
82  /* Set a PendSV to request a context switch. */ \
83  portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
84  \
85  /* Barriers are normally not required but do ensure the code is completely \
86  within the specified behaviour for the architecture. */ \
87  __asm volatile( "dsb" ::: "memory" ); \
88  __asm volatile( "isb" ); \
89 }
90 
91 #define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
92 #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
93 #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
94 #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
95 /*-----------------------------------------------------------*/
96 
97 /* Critical section management. */
98 extern void vPortEnterCritical( void );
99 extern void vPortExitCritical( void );
100 #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()
101 #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x)
102 #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
103 #define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)
104 #define portENTER_CRITICAL() vPortEnterCritical()
105 #define portEXIT_CRITICAL() vPortExitCritical()
106 
107 /*-----------------------------------------------------------*/
108 
109 /* Task function macros as described on the FreeRTOS.org WEB site. These are
110 not necessary for to use this port. They are defined so the common demo files
111 (which build with all the ports) will build. */
112 #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
113 #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
114 /*-----------------------------------------------------------*/
115 
116 /* Tickless idle/low power functionality. */
117 #ifndef portSUPPRESS_TICKS_AND_SLEEP
118  extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
119  #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
120 #endif
121 /*-----------------------------------------------------------*/
122 
123 /* Architecture specific optimisations. */
124 #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
125  #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
126 #endif
127 
128 #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
129 
130  /* Generic helper function. */
131  __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap )
132  {
133  uint8_t ucReturn;
134 
135  __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" );
136  return ucReturn;
137  }
138 
139  /* Check the configuration. */
140  #if( configMAX_PRIORITIES > 32 )
141  #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
142  #endif
143 
144  /* Store/clear the ready priorities in a bit map. */
145  #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
146  #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
147 
148  /*-----------------------------------------------------------*/
149 
150  #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) )
151 
152 #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
153 
154 /*-----------------------------------------------------------*/
155 
156 #ifdef configASSERT
157  void vPortValidateInterruptPriority( void );
158  #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority()
159 #endif
160 
161 /* portNOP() is not required by this port. */
162 #define portNOP()
163 
164 #define portINLINE __inline
165 
166 #ifndef portFORCE_INLINE
167  #define portFORCE_INLINE inline __attribute__(( always_inline))
168 #endif
169 
170 portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
171 {
172 uint32_t ulCurrentInterrupt;
173 BaseType_t xReturn;
174 
175  /* Obtain the number of the currently executing interrupt. */
176  __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
177 
178  if( ulCurrentInterrupt == 0 )
179  {
180  xReturn = pdFALSE;
181  }
182  else
183  {
184  xReturn = pdTRUE;
185  }
186 
187  return xReturn;
188 }
189 
190 /*-----------------------------------------------------------*/
191 
193 {
194 uint32_t ulNewBASEPRI;
195 
196  __asm volatile
197  (
198  " mov %0, %1 \n" \
199  " cpsid i \n" \
200  " msr basepri, %0 \n" \
201  " isb \n" \
202  " dsb \n" \
203  " cpsie i \n" \
204  :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
205  );
206 }
207 
208 /*-----------------------------------------------------------*/
209 
210 portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void )
211 {
212 uint32_t ulOriginalBASEPRI, ulNewBASEPRI;
213 
214  __asm volatile
215  (
216  " mrs %0, basepri \n" \
217  " mov %1, %2 \n" \
218  " cpsid i \n" \
219  " msr basepri, %1 \n" \
220  " isb \n" \
221  " dsb \n" \
222  " cpsie i \n" \
223  :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
224  );
225 
226  /* This return will not be reached but is necessary to prevent compiler
227  warnings. */
228  return ulOriginalBASEPRI;
229 }
230 /*-----------------------------------------------------------*/
231 
232 portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
233 {
234  __asm volatile
235  (
236  " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory"
237  );
238 }
239 /*-----------------------------------------------------------*/
240 
241 
242 #ifdef __cplusplus
243 }
244 #endif
245 
246 #endif /* PORTMACRO_H */
247 
#define pdTRUE
Definition: projdefs.h:46
static portFORCE_INLINE void vPortRaiseBASEPRI(void)
Definition: portmacro.h:192
static portFORCE_INLINE void vPortSetBASEPRI(uint32_t ulNewMaskValue)
Definition: portmacro.h:232
#define portSTACK_TYPE
Definition: portmacro.h:53
void vPortExitCritical(void)
Definition: port.c:409
unsigned long UBaseType_t
Definition: portmacro.h:58
void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime)
uint32_t TickType_t
Definition: portmacro.h:64
static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI(void)
Definition: portmacro.h:210
static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt(void)
Definition: portmacro.h:170
void vPortEnterCritical(void)
Definition: port.c:392
__attribute__((always_inline)) static inline uint8_t ucPortCountLeadingZeros(uint32_t ulBitmap)
Definition: portmacro.h:131
long BaseType_t
Definition: portmacro.h:57
#define portFORCE_INLINE
Definition: portmacro.h:167
#define pdFALSE
Definition: projdefs.h:45
#define configMAX_SYSCALL_INTERRUPT_PRIORITY
portSTACK_TYPE StackType_t
Definition: portmacro.h:56


inertial_sense_ros
Author(s):
autogenerated on Sun Feb 28 2021 03:17:58