Prusa MINI Firmware overview
portmacro.h
Go to the documentation of this file.
1 /*
2  FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
3  All rights reserved
4 
5  VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
6 
7  This file is part of the FreeRTOS distribution.
8 
9  FreeRTOS is free software; you can redistribute it and/or modify it under
10  the terms of the GNU General Public License (version 2) as published by the
11  Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
12 
13  ***************************************************************************
14  >>! NOTE: The modification to the GPL is included to allow you to !<<
15  >>! distribute a combined work that includes FreeRTOS without being !<<
16  >>! obliged to provide the source code for proprietary components !<<
17  >>! outside of the FreeRTOS kernel. !<<
18  ***************************************************************************
19 
20  FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
21  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
22  FOR A PARTICULAR PURPOSE. Full license text is available on the following
23  link: http://www.freertos.org/a00114.html
24 
25  ***************************************************************************
26  * *
27  * FreeRTOS provides completely free yet professionally developed, *
28  * robust, strictly quality controlled, supported, and cross *
29  * platform software that is more than just the market leader, it *
30  * is the industry's de facto standard. *
31  * *
32  * Help yourself get started quickly while simultaneously helping *
33  * to support the FreeRTOS project by purchasing a FreeRTOS *
34  * tutorial book, reference manual, or both: *
35  * http://www.FreeRTOS.org/Documentation *
36  * *
37  ***************************************************************************
38 
39  http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
40  the FAQ page "My application does not run, what could be wrong?". Have you
41  defined configASSERT()?
42 
43  http://www.FreeRTOS.org/support - In return for receiving this top quality
44  embedded software for free we request you assist our global community by
45  participating in the support forum.
46 
47  http://www.FreeRTOS.org/training - Investing in training allows your team to
48  be as productive as possible as early as possible. Now you can receive
49  FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
50  Ltd, and the world's leading authority on the world's leading RTOS.
51 
52  http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
53  including FreeRTOS+Trace - an indispensable productivity tool, a DOS
54  compatible FAT file system, and our tiny thread aware UDP/IP stack.
55 
56  http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
57  Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
58 
59  http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
60  Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
61  licenses offer ticketed support, indemnification and commercial middleware.
62 
63  http://www.SafeRTOS.com - High Integrity Systems also provide a safety
64  engineered and independently SIL3 certified version for use in safety and
65  mission critical applications that require provable dependability.
66 
67  1 tab == 4 spaces!
68 */
69 
70 
71 #ifndef PORTMACRO_H
72 #define PORTMACRO_H
73 
74 #ifdef __cplusplus
75 extern "C" {
76 #endif
77 
78 /*-----------------------------------------------------------
79  * Port specific definitions.
80  *
81  * The settings in this file configure FreeRTOS correctly for the
82  * given hardware and compiler.
83  *
84  * These settings should not be altered.
85  *-----------------------------------------------------------
86  */
87 
88 /* Type definitions. */
89 #define portCHAR char
90 #define portFLOAT float
91 #define portDOUBLE double
92 #define portLONG long
93 #define portSHORT short
94 #define portSTACK_TYPE uint32_t
95 #define portBASE_TYPE long
96 
98 typedef long BaseType_t;
99 typedef unsigned long UBaseType_t;
100 
101 #if( configUSE_16_BIT_TICKS == 1 )
102  typedef uint16_t TickType_t;
103  #define portMAX_DELAY ( TickType_t ) 0xffff
104 #else
105  typedef uint32_t TickType_t;
106  #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
107 
108  /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
109  not need to be guarded with a critical section. */
110  #define portTICK_TYPE_IS_ATOMIC 1
111 #endif
112 /*-----------------------------------------------------------*/
113 
114 /* Architecture specifics. */
115 #define portSTACK_GROWTH ( -1 )
116 #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
117 #define portBYTE_ALIGNMENT 8
118 /*-----------------------------------------------------------*/
119 
120 /* Scheduler utilities. */
121 #define portYIELD() \
122 { \
123  /* Set a PendSV to request a context switch. */ \
124  portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
125  \
126  /* Barriers are normally not required but do ensure the code is completely \
127  within the specified behaviour for the architecture. */ \
128  __asm volatile( "dsb" ); \
129  __asm volatile( "isb" ); \
130 }
131 
132 #define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
133 #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
134 #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
135 #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
136 /*-----------------------------------------------------------*/
137 
138 /* Critical section management. */
139 extern void vPortEnterCritical( void );
140 extern void vPortExitCritical( void );
141 #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()
142 #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x)
143 #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
144 #define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)
145 #define portENTER_CRITICAL() vPortEnterCritical()
146 #define portEXIT_CRITICAL() vPortExitCritical()
147 
148 /*-----------------------------------------------------------*/
149 
150 /* Task function macros as described on the FreeRTOS.org WEB site. These are
151 not necessary for to use this port. They are defined so the common demo files
152 (which build with all the ports) will build. */
153 #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
154 #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
155 /*-----------------------------------------------------------*/
156 
157 /* Tickless idle/low power functionality. */
158 #ifndef portSUPPRESS_TICKS_AND_SLEEP
159  extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
160  #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
161 #endif
162 /*-----------------------------------------------------------*/
163 
164 /* Architecture specific optimisations. */
165 #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
166  #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
167 #endif
168 
169 #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
170 
171  /* Generic helper function. */
172  __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap )
173  {
174  uint8_t ucReturn;
175 
176  __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
177  return ucReturn;
178  }
179 
180  /* Check the configuration. */
181  #if( configMAX_PRIORITIES > 32 )
182  #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.
183  #endif
184 
185  /* Store/clear the ready priorities in a bit map. */
186  #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
187  #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
188 
189  /*-----------------------------------------------------------*/
190 
191  #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) )
192 
193 #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
194 
195 /*-----------------------------------------------------------*/
196 
197 #ifdef configASSERT
198  void vPortValidateInterruptPriority( void );
199  #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority()
200 #endif
201 
202 /* portNOP() is not required by this port. */
203 #define portNOP()
204 
205 #define portINLINE __inline
206 
207 #ifndef portFORCE_INLINE
208  #define portFORCE_INLINE inline __attribute__(( always_inline))
209 #endif
210 
212 {
213 uint32_t ulCurrentInterrupt;
214 BaseType_t xReturn;
215 
216  /* Obtain the number of the currently executing interrupt. */
217  __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
218 
219  if( ulCurrentInterrupt == 0 )
220  {
221  xReturn = pdFALSE;
222  }
223  else
224  {
225  xReturn = pdTRUE;
226  }
227 
228  return xReturn;
229 }
230 
231 /*-----------------------------------------------------------*/
232 
234 {
235 uint32_t ulNewBASEPRI;
236 
237  __asm volatile
238  (
239  " mov %0, %1 \n" \
240  " msr basepri, %0 \n" \
241  " isb \n" \
242  " dsb \n" \
243  :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
244  );
245 }
246 
247 /*-----------------------------------------------------------*/
248 
249 portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void )
250 {
251 uint32_t ulOriginalBASEPRI, ulNewBASEPRI;
252 
253  __asm volatile
254  (
255  " mrs %0, basepri \n" \
256  " mov %1, %2 \n" \
257  " msr basepri, %1 \n" \
258  " isb \n" \
259  " dsb \n" \
260  :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
261  );
262 
263  /* This return will not be reached but is necessary to prevent compiler
264  warnings. */
265  return ulOriginalBASEPRI;
266 }
267 /*-----------------------------------------------------------*/
268 
269 portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
270 {
271  __asm volatile
272  (
273  " msr basepri, %0 " :: "r" ( ulNewMaskValue )
274  );
275 }
276 /*-----------------------------------------------------------*/
277 
278 
279 #ifdef __cplusplus
280 }
281 #endif
282 
283 #endif /* PORTMACRO_H */
listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE
#define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE(pxItem)
Definition: list.h:153
xPortStartScheduler
BaseType_t xPortStartScheduler(void)
Definition: port.c:312
xLIST_ITEM::xItemValue
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE configLIST_VOLATILE TickType_t xItemValue
Definition: list.h:184
listTEST_LIST_ITEM_INTEGRITY
#define listTEST_LIST_ITEM_INTEGRITY(pxItem)
Definition: list.h:156
xMINI_LIST_ITEM::pxNext
struct xLIST_ITEM *configLIST_VOLATILE pxNext
Definition: list.h:197
portMAX_DELAY
#define portMAX_DELAY
Definition: portmacro.h:106
task.h
xLIST
Definition: list.h:205
configCPU_CLOCK_HZ
#define configCPU_CLOCK_HZ
Definition: FreeRTOSConfig.h:108
__attribute__
__attribute__((always_inline)) static inline uint8_t ucPortCountLeadingZeros(uint32_t ulBitmap)
Definition: portmacro.h:172
eTaskConfirmSleepModeStatus
PRIVILEGED_FUNCTION eSleepModeStatus eTaskConfirmSleepModeStatus(void)
configASSERT
#define configASSERT(x)
Definition: FreeRTOSConfig.h:162
portNVIC_SYSTICK_INT_BIT
#define portNVIC_SYSTICK_INT_BIT
Definition: port.c:98
vListInitialise
void vListInitialise(List_t *const pxList)
Definition: list.c:79
portCORTEX_M7_r0p0_ID
#define portCORTEX_M7_r0p0_ID
Definition: port.c:108
xLIST_ITEM
Definition: list.h:181
__attribute__
__attribute__((weak))
Definition: port.c:671
portFORCE_INLINE
#define portFORCE_INLINE
Definition: portmacro.h:208
vPortRaiseBASEPRI
static portFORCE_INLINE void vPortRaiseBASEPRI(void)
Definition: portmacro.h:233
portENTER_CRITICAL
#define portENTER_CRITICAL()
Definition: portmacro.h:145
vPortExitCritical
void vPortExitCritical(void)
Definition: port.c:424
portEXIT_CRITICAL
#define portEXIT_CRITICAL()
Definition: portmacro.h:146
portPRIGROUP_SHIFT
#define portPRIGROUP_SHIFT
Definition: port.c:121
portCORTEX_M7_r0p1_ID
#define portCORTEX_M7_r0p1_ID
Definition: port.c:107
xPortIsInsideInterrupt
static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt(void)
Definition: portmacro.h:211
uxListRemove
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove)
Definition: list.c:212
xLIST::pxIndex
ListItem_t *configLIST_VOLATILE pxIndex
Definition: list.h:209
xMINI_LIST_ITEM::pxPrevious
struct xLIST_ITEM *configLIST_VOLATILE pxPrevious
Definition: list.h:198
portNVIC_PENDSV_PRI
#define portNVIC_PENDSV_PRI
Definition: port.c:110
vPortSetBASEPRI
static portFORCE_INLINE void vPortSetBASEPRI(uint32_t ulNewMaskValue)
Definition: portmacro.h:269
prvTaskExitError
static void prvTaskExitError(void)
Definition: port.c:259
NULL
#define NULL
Definition: usbd_def.h:53
vPortEnterCritical
void vPortEnterCritical(void)
Definition: port.c:407
portNVIC_SYSTICK_PRI
#define portNVIC_SYSTICK_PRI
Definition: port.c:111
portFPCCR
#define portFPCCR
Definition: port.c:127
portNVIC_SYSTICK_LOAD_REG
#define portNVIC_SYSTICK_LOAD_REG
Definition: port.c:94
vPortSuppressTicksAndSleep
void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime)
TickType_t
uint32_t TickType_t
Definition: portmacro.h:105
portCPUID
#define portCPUID
Definition: port.c:106
portNVIC_SYSTICK_ENABLE_BIT
#define portNVIC_SYSTICK_ENABLE_BIT
Definition: port.c:99
pdFALSE
#define pdFALSE
Definition: projdefs.h:86
xLIST_ITEM::pvContainer
void *configLIST_VOLATILE pvContainer
Definition: list.h:188
vListInsertEnd
void vListInsertEnd(List_t *const pxList, ListItem_t *const pxNewListItem)
Definition: list.c:116
UBaseType_t
unsigned long UBaseType_t
Definition: portmacro.h:99
xLIST_ITEM::pxPrevious
struct xLIST_ITEM *configLIST_VOLATILE pxPrevious
Definition: list.h:186
eAbortSleep
Definition: task.h:183
xPortPendSVHandler
void xPortPendSVHandler(void xPortSysTickHandler void)
Definition: port.c:169
portDISABLE_INTERRUPTS
#define portDISABLE_INTERRUPTS()
Definition: portmacro.h:143
vPortEndScheduler
void vPortEndScheduler(void)
Definition: port.c:399
portNVIC_PENDSVSET_BIT
#define portNVIC_PENDSVSET_BIT
Definition: portmacro.h:133
portMAX_8_BIT_VALUE
#define portMAX_8_BIT_VALUE
Definition: port.c:117
portSTACK_TYPE
#define portSTACK_TYPE
Definition: portmacro.h:94
StackType_t
portSTACK_TYPE StackType_t
Definition: portmacro.h:97
xLIST::xListEnd
MiniListItem_t xListEnd
Definition: list.h:210
xMINI_LIST_ITEM::xItemValue
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE configLIST_VOLATILE TickType_t xItemValue
Definition: list.h:196
portTASK_RETURN_ADDRESS
#define portTASK_RETURN_ADDRESS
Definition: port.c:152
vPortSVCHandler
void vPortSVCHandler(void)
Definition: port.c:273
xTaskIncrementTick
PRIVILEGED_FUNCTION BaseType_t xTaskIncrementTick(void)
Definition: tasks.c:2499
vListInsert
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem)
Definition: list.c:145
configSYSTICK_CLOCK_HZ
#define configSYSTICK_CLOCK_HZ
Definition: port.c:83
configMAX_SYSCALL_INTERRUPT_PRIORITY
#define configMAX_SYSCALL_INTERRUPT_PRIORITY
Definition: FreeRTOSConfig.h:157
uxCriticalNesting
static UBaseType_t uxCriticalNesting
Definition: port.c:157
xPortSysTickHandler
void xPortSysTickHandler(void)
Definition: port.c:493
TaskFunction_t
void(* TaskFunction_t)(void *)
Definition: projdefs.h:77
FreeRTOS.h
portNVIC_SYSTICK_CURRENT_VALUE_REG
#define portNVIC_SYSTICK_CURRENT_VALUE_REG
Definition: port.c:95
uint8_t
const uint8_t[]
Definition: 404_html.c:3
portMISSED_COUNTS_FACTOR
#define portMISSED_COUNTS_FACTOR
Definition: port.c:144
portVECTACTIVE_MASK
#define portVECTACTIVE_MASK
Definition: port.c:124
portNVIC_SYSPRI2_REG
#define portNVIC_SYSPRI2_REG
Definition: port.c:96
portNVIC_SYSTICK_CLK_BIT
#define portNVIC_SYSTICK_CLK_BIT
Definition: port.c:85
xLIST_ITEM::pxNext
struct xLIST_ITEM *configLIST_VOLATILE pxNext
Definition: list.h:185
portENABLE_INTERRUPTS
#define portENABLE_INTERRUPTS()
Definition: portmacro.h:144
listTEST_LIST_INTEGRITY
#define listTEST_LIST_INTEGRITY(pxList)
Definition: list.h:157
portINITIAL_XPSR
#define portINITIAL_XPSR
Definition: port.c:131
configPOST_SLEEP_PROCESSING
#define configPOST_SLEEP_PROCESSING(x)
Definition: FreeRTOS.h:716
portTOP_BIT_OF_BYTE
#define portTOP_BIT_OF_BYTE
Definition: port.c:118
vPortSetupTimerInterrupt
void vPortSetupTimerInterrupt(void)
BaseType_t
long BaseType_t
Definition: portmacro.h:98
pdTRUE
#define pdTRUE
Definition: projdefs.h:87
configPRE_SLEEP_PROCESSING
#define configPRE_SLEEP_PROCESSING(x)
Definition: FreeRTOS.h:712
xLIST::uxNumberOfItems
listFIRST_LIST_INTEGRITY_CHECK_VALUE configLIST_VOLATILE UBaseType_t uxNumberOfItems
Definition: list.h:208
portINITIAL_EXEC_RETURN
#define portINITIAL_EXEC_RETURN
Definition: port.c:132
portFIRST_USER_INTERRUPT_NUMBER
#define portFIRST_USER_INTERRUPT_NUMBER
Definition: port.c:114
configTICK_RATE_HZ
#define configTICK_RATE_HZ
Definition: FreeRTOSConfig.h:109
ulPortRaiseBASEPRI
static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI(void)
Definition: portmacro.h:249
portMAX_24_BIT_NUMBER
#define portMAX_24_BIT_NUMBER
Definition: port.c:135
vPortEnterCritical
void vPortEnterCritical(void)
Definition: port.c:407
listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
#define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE(pxItem)
Definition: list.h:152
vTaskStepTick
PRIVILEGED_FUNCTION void vTaskStepTick(const TickType_t xTicksToJump)
prvPortStartFirstTask
static void prvPortStartFirstTask(void)
Definition: port.c:292
listSET_LIST_INTEGRITY_CHECK_1_VALUE
#define listSET_LIST_INTEGRITY_CHECK_1_VALUE(pxList)
Definition: list.h:154
mtCOVERAGE_TEST_DELAY
#define mtCOVERAGE_TEST_DELAY()
Definition: FreeRTOS.h:752
portMAX_PRIGROUP_BITS
#define portMAX_PRIGROUP_BITS
Definition: port.c:119
pxPortInitialiseStack
PRIVILEGED_FUNCTION StackType_t * pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters)
vPortExitCritical
void vPortExitCritical(void)
Definition: port.c:424
list.h
portNVIC_IP_REGISTERS_OFFSET_16
#define portNVIC_IP_REGISTERS_OFFSET_16
Definition: port.c:115
portAIRCR_REG
#define portAIRCR_REG
Definition: port.c:116
portNVIC_INT_CTRL_REG
#define portNVIC_INT_CTRL_REG
Definition: portmacro.h:132
portASPEN_AND_LSPEN_BITS
#define portASPEN_AND_LSPEN_BITS
Definition: port.c:128
vPortEnableVFP
static void vPortEnableVFP(void)
Definition: port.c:689
portNVIC_SYSTICK_CTRL_REG
#define portNVIC_SYSTICK_CTRL_REG
Definition: port.c:93
portPRIORITY_GROUP_MASK
#define portPRIORITY_GROUP_MASK
Definition: port.c:120
listSET_LIST_INTEGRITY_CHECK_2_VALUE
#define listSET_LIST_INTEGRITY_CHECK_2_VALUE(pxList)
Definition: list.h:155
vListInitialiseItem
void vListInitialiseItem(ListItem_t *const pxItem)
Definition: list.c:104
portSTART_ADDRESS_MASK
#define portSTART_ADDRESS_MASK
Definition: port.c:139
const
#define const
Definition: zconf.h:230
portNVIC_SYSTICK_COUNT_FLAG_BIT
#define portNVIC_SYSTICK_COUNT_FLAG_BIT
Definition: port.c:100
mtCOVERAGE_TEST_MARKER
#define mtCOVERAGE_TEST_MARKER()
Definition: FreeRTOS.h:748