1 | /*
|
---|
2 | * FreeRTOS Kernel V10.3.1
|
---|
3 | * Copyright (C) 2020 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.
|
---|
14 | *
|
---|
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
---|
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
---|
17 | * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
---|
18 | * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
---|
19 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
---|
20 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
---|
21 | *
|
---|
22 | * http://www.FreeRTOS.org
|
---|
23 | * http://aws.amazon.com/freertos
|
---|
24 | *
|
---|
25 | * 1 tab == 4 spaces!
|
---|
26 | */
|
---|
27 |
|
---|
28 | /*-----------------------------------------------------------
|
---|
29 | * Portable layer API. Each function must be defined for each port.
|
---|
30 | *----------------------------------------------------------*/
|
---|
31 |
|
---|
32 | #ifndef PORTABLE_H
|
---|
33 | #define PORTABLE_H
|
---|
34 |
|
---|
35 | /* Each FreeRTOS port has a unique portmacro.h header file. Originally a
|
---|
36 | pre-processor definition was used to ensure the pre-processor found the correct
|
---|
37 | portmacro.h file for the port being used. That scheme was deprecated in favour
|
---|
38 | of setting the compiler's include path such that it found the correct
|
---|
39 | portmacro.h file - removing the need for the constant and allowing the
|
---|
40 | portmacro.h file to be located anywhere in relation to the port being used.
|
---|
41 | Purely for reasons of backward compatibility the old method is still valid, but
|
---|
42 | to make it clear that new projects should not use it, support for the port
|
---|
43 | specific constants has been moved into the deprecated_definitions.h header
|
---|
44 | file. */
|
---|
45 | #include "deprecated_definitions.h"
|
---|
46 |
|
---|
47 | /* If portENTER_CRITICAL is not defined then including deprecated_definitions.h
|
---|
48 | did not result in a portmacro.h header file being included - and it should be
|
---|
49 | included here. In this case the path to the correct portmacro.h header file
|
---|
50 | must be set in the compiler's include path. */
|
---|
51 | #ifndef portENTER_CRITICAL
|
---|
52 | #include "portmacro.h"
|
---|
53 | #endif
|
---|
54 |
|
---|
55 | #if portBYTE_ALIGNMENT == 32
|
---|
56 | #define portBYTE_ALIGNMENT_MASK ( 0x001f )
|
---|
57 | #endif
|
---|
58 |
|
---|
59 | #if portBYTE_ALIGNMENT == 16
|
---|
60 | #define portBYTE_ALIGNMENT_MASK ( 0x000f )
|
---|
61 | #endif
|
---|
62 |
|
---|
63 | #if portBYTE_ALIGNMENT == 8
|
---|
64 | #define portBYTE_ALIGNMENT_MASK ( 0x0007 )
|
---|
65 | #endif
|
---|
66 |
|
---|
67 | #if portBYTE_ALIGNMENT == 4
|
---|
68 | #define portBYTE_ALIGNMENT_MASK ( 0x0003 )
|
---|
69 | #endif
|
---|
70 |
|
---|
71 | #if portBYTE_ALIGNMENT == 2
|
---|
72 | #define portBYTE_ALIGNMENT_MASK ( 0x0001 )
|
---|
73 | #endif
|
---|
74 |
|
---|
75 | #if portBYTE_ALIGNMENT == 1
|
---|
76 | #define portBYTE_ALIGNMENT_MASK ( 0x0000 )
|
---|
77 | #endif
|
---|
78 |
|
---|
79 | #ifndef portBYTE_ALIGNMENT_MASK
|
---|
80 | #error "Invalid portBYTE_ALIGNMENT definition"
|
---|
81 | #endif
|
---|
82 |
|
---|
83 | #ifndef portNUM_CONFIGURABLE_REGIONS
|
---|
84 | #define portNUM_CONFIGURABLE_REGIONS 1
|
---|
85 | #endif
|
---|
86 |
|
---|
87 | #ifndef portHAS_STACK_OVERFLOW_CHECKING
|
---|
88 | #define portHAS_STACK_OVERFLOW_CHECKING 0
|
---|
89 | #endif
|
---|
90 |
|
---|
91 | #ifndef portARCH_NAME
|
---|
92 | #define portARCH_NAME NULL
|
---|
93 | #endif
|
---|
94 |
|
---|
95 | #ifdef __cplusplus
|
---|
96 | extern "C" {
|
---|
97 | #endif
|
---|
98 |
|
---|
99 | #include "mpu_wrappers.h"
|
---|
100 |
|
---|
101 | /*
|
---|
102 | * Setup the stack of a new task so it is ready to be placed under the
|
---|
103 | * scheduler control. The registers have to be placed on the stack in
|
---|
104 | * the order that the port expects to find them.
|
---|
105 | *
|
---|
106 | */
|
---|
107 | #if( portUSING_MPU_WRAPPERS == 1 )
|
---|
108 | #if( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
---|
109 | StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
---|
110 | #else
|
---|
111 | StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
---|
112 | #endif
|
---|
113 | #else
|
---|
114 | #if( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
---|
115 | StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
---|
116 | #else
|
---|
117 | StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
---|
118 | #endif
|
---|
119 | #endif
|
---|
120 |
|
---|
121 | /* Used by heap_5.c to define the start address and size of each memory region
|
---|
122 | that together comprise the total FreeRTOS heap space. */
|
---|
123 | typedef struct HeapRegion
|
---|
124 | {
|
---|
125 | uint8_t *pucStartAddress;
|
---|
126 | size_t xSizeInBytes;
|
---|
127 | } HeapRegion_t;
|
---|
128 |
|
---|
129 | /* Used to pass information about the heap out of vPortGetHeapStats(). */
|
---|
130 | typedef struct xHeapStats
|
---|
131 | {
|
---|
132 | size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */
|
---|
133 | size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
|
---|
134 | size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
|
---|
135 | size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */
|
---|
136 | size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */
|
---|
137 | size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */
|
---|
138 | size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */
|
---|
139 | } HeapStats_t;
|
---|
140 |
|
---|
141 | /*
|
---|
142 | * Used to define multiple heap regions for use by heap_5.c. This function
|
---|
143 | * must be called before any calls to pvPortMalloc() - not creating a task,
|
---|
144 | * queue, semaphore, mutex, software timer, event group, etc. will result in
|
---|
145 | * pvPortMalloc being called.
|
---|
146 | *
|
---|
147 | * pxHeapRegions passes in an array of HeapRegion_t structures - each of which
|
---|
148 | * defines a region of memory that can be used as the heap. The array is
|
---|
149 | * terminated by a HeapRegions_t structure that has a size of 0. The region
|
---|
150 | * with the lowest start address must appear first in the array.
|
---|
151 | */
|
---|
152 | void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;
|
---|
153 |
|
---|
154 | /*
|
---|
155 | * Returns a HeapStats_t structure filled with information about the current
|
---|
156 | * heap state.
|
---|
157 | */
|
---|
158 | void vPortGetHeapStats( HeapStats_t *pxHeapStats );
|
---|
159 |
|
---|
160 | /*
|
---|
161 | * Map to the memory management routines required for the port.
|
---|
162 | */
|
---|
163 | void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;
|
---|
164 | void vPortFree( void *pv ) PRIVILEGED_FUNCTION;
|
---|
165 | void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;
|
---|
166 | size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;
|
---|
167 | size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION;
|
---|
168 |
|
---|
169 | /*
|
---|
170 | * Setup the hardware ready for the scheduler to take control. This generally
|
---|
171 | * sets up a tick interrupt and sets timers for the correct tick frequency.
|
---|
172 | */
|
---|
173 | BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION;
|
---|
174 |
|
---|
175 | /*
|
---|
176 | * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so
|
---|
177 | * the hardware is left in its original condition after the scheduler stops
|
---|
178 | * executing.
|
---|
179 | */
|
---|
180 | void vPortEndScheduler( void ) PRIVILEGED_FUNCTION;
|
---|
181 |
|
---|
182 | /*
|
---|
183 | * The structures and methods of manipulating the MPU are contained within the
|
---|
184 | * port layer.
|
---|
185 | *
|
---|
186 | * Fills the xMPUSettings structure with the memory region information
|
---|
187 | * contained in xRegions.
|
---|
188 | */
|
---|
189 | #if( portUSING_MPU_WRAPPERS == 1 )
|
---|
190 | struct xMEMORY_REGION;
|
---|
191 | void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;
|
---|
192 | #endif
|
---|
193 |
|
---|
194 | #ifdef __cplusplus
|
---|
195 | }
|
---|
196 | #endif
|
---|
197 |
|
---|
198 | #endif /* PORTABLE_H */
|
---|
199 |
|
---|