diff options
Diffstat (limited to 'lib/chibios/demos/various/RT-ARMCM4-USELIB/rt/ch.h')
-rw-r--r-- | lib/chibios/demos/various/RT-ARMCM4-USELIB/rt/ch.h | 1629 |
1 files changed, 1629 insertions, 0 deletions
diff --git a/lib/chibios/demos/various/RT-ARMCM4-USELIB/rt/ch.h b/lib/chibios/demos/various/RT-ARMCM4-USELIB/rt/ch.h new file mode 100644 index 000000000..066afb260 --- /dev/null +++ b/lib/chibios/demos/various/RT-ARMCM4-USELIB/rt/ch.h | |||
@@ -0,0 +1,1629 @@ | |||
1 | /* | ||
2 | ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014, | ||
3 | 2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio. | ||
4 | |||
5 | This file is part of ChibiOS. | ||
6 | |||
7 | ChibiOS is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation version 3 of the License. | ||
10 | |||
11 | ChibiOS is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | #include <stddef.h> | ||
21 | #include <stdint.h> | ||
22 | #include <stdbool.h> | ||
23 | |||
24 | #include "cmparams.h" | ||
25 | |||
26 | #define CH_H | ||
27 | #define _CHIBIOS_RT_ | ||
28 | #define CH_KERNEL_STABLE 0 | ||
29 | #define CH_KERNEL_VERSION "6.0.0" | ||
30 | #define CH_KERNEL_MAJOR 6 | ||
31 | #define CH_KERNEL_MINOR 0 | ||
32 | #define CH_KERNEL_PATCH 0 | ||
33 | #define FALSE 0 | ||
34 | #define TRUE 1 | ||
35 | #define CHCONF_H | ||
36 | #define _CHIBIOS_RT_CONF_ | ||
37 | #define _CHIBIOS_RT_CONF_VER_6_0_ | ||
38 | #define CH_CFG_ST_RESOLUTION 32 | ||
39 | #define CH_CFG_ST_FREQUENCY 1000 | ||
40 | #define CH_CFG_INTERVALS_SIZE 32 | ||
41 | #define CH_CFG_TIME_TYPES_SIZE 32 | ||
42 | #define CH_CFG_ST_TIMEDELTA 0 | ||
43 | #define CH_CFG_TIME_QUANTUM 0 | ||
44 | #define CH_CFG_MEMCORE_SIZE 0 | ||
45 | #define CH_CFG_NO_IDLE_THREAD FALSE | ||
46 | #define CH_CFG_OPTIMIZE_SPEED TRUE | ||
47 | #define CH_CFG_USE_TM TRUE | ||
48 | #define CH_CFG_USE_REGISTRY TRUE | ||
49 | #define CH_CFG_USE_WAITEXIT TRUE | ||
50 | #define CH_CFG_USE_SEMAPHORES TRUE | ||
51 | #define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE | ||
52 | #define CH_CFG_USE_MUTEXES TRUE | ||
53 | #define CH_CFG_USE_MUTEXES_RECURSIVE FALSE | ||
54 | #define CH_CFG_USE_CONDVARS TRUE | ||
55 | #define CH_CFG_USE_CONDVARS_TIMEOUT TRUE | ||
56 | #define CH_CFG_USE_EVENTS TRUE | ||
57 | #define CH_CFG_USE_EVENTS_TIMEOUT TRUE | ||
58 | #define CH_CFG_USE_MESSAGES TRUE | ||
59 | #define CH_CFG_USE_MESSAGES_PRIORITY FALSE | ||
60 | #define CH_CFG_USE_MAILBOXES TRUE | ||
61 | #define CH_CFG_USE_MEMCORE TRUE | ||
62 | #define CH_CFG_USE_HEAP TRUE | ||
63 | #define CH_CFG_USE_MEMPOOLS TRUE | ||
64 | #define CH_CFG_USE_OBJ_FIFOS TRUE | ||
65 | #define CH_CFG_USE_PIPES TRUE | ||
66 | #define CH_CFG_USE_DYNAMIC TRUE | ||
67 | #define CH_CFG_USE_FACTORY TRUE | ||
68 | #define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 | ||
69 | #define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE | ||
70 | #define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE | ||
71 | #define CH_CFG_FACTORY_SEMAPHORES TRUE | ||
72 | #define CH_CFG_FACTORY_MAILBOXES TRUE | ||
73 | #define CH_CFG_FACTORY_OBJ_FIFOS TRUE | ||
74 | #define CH_CFG_FACTORY_PIPES TRUE | ||
75 | #define CH_DBG_STATISTICS FALSE | ||
76 | #define CH_DBG_SYSTEM_STATE_CHECK FALSE | ||
77 | #define CH_DBG_ENABLE_CHECKS FALSE | ||
78 | #define CH_DBG_ENABLE_ASSERTS FALSE | ||
79 | #define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED | ||
80 | #define CH_DBG_TRACE_BUFFER_SIZE 128 | ||
81 | #define CH_DBG_ENABLE_STACK_CHECK FALSE | ||
82 | #define CH_DBG_FILL_THREADS FALSE | ||
83 | #define CH_DBG_THREADS_PROFILING FALSE | ||
84 | #define CH_CFG_SYSTEM_EXTRA_FIELDS | ||
85 | #define CH_CFG_SYSTEM_INIT_HOOK() { } | ||
86 | #define CH_CFG_THREAD_EXTRA_FIELDS | ||
87 | #define CH_CFG_THREAD_INIT_HOOK(tp) { } | ||
88 | #define CH_CFG_THREAD_EXIT_HOOK(tp) { } | ||
89 | #define CH_CFG_CONTEXT_SWITCH_HOOK(ntp,otp) { } | ||
90 | #define CH_CFG_IRQ_PROLOGUE_HOOK() { } | ||
91 | #define CH_CFG_IRQ_EPILOGUE_HOOK() { } | ||
92 | #define CH_CFG_IDLE_ENTER_HOOK() { } | ||
93 | #define CH_CFG_IDLE_LEAVE_HOOK() { } | ||
94 | #define CH_CFG_IDLE_LOOP_HOOK() { } | ||
95 | #define CH_CFG_SYSTEM_TICK_HOOK() { } | ||
96 | #define CH_CFG_SYSTEM_HALT_HOOK(reason) { } | ||
97 | #define CH_CFG_TRACE_HOOK(tep) { } | ||
98 | #define CHCHECKS_H | ||
99 | #define CHLICENSE_H | ||
100 | #define CH_FEATURES_BASIC 0 | ||
101 | #define CH_FEATURES_INTERMEDIATE 1 | ||
102 | #define CH_FEATURES_FULL 2 | ||
103 | #define CH_DEPLOY_UNLIMITED -1 | ||
104 | #define CH_DEPLOY_NONE 0 | ||
105 | #define CH_LICENSE_GPL 0 | ||
106 | #define CH_LICENSE_GPL_EXCEPTION 1 | ||
107 | #define CH_LICENSE_COMMERCIAL_FREE 2 | ||
108 | #define CH_LICENSE_COMMERCIAL_DEV_1000 3 | ||
109 | #define CH_LICENSE_COMMERCIAL_DEV_5000 4 | ||
110 | #define CH_LICENSE_COMMERCIAL_FULL 5 | ||
111 | #define CH_LICENSE_COMMERCIAL_RUNTIME 6 | ||
112 | #define CH_LICENSE_PARTNER 7 | ||
113 | #define CHCUSTOMER_H | ||
114 | #define CH_CUSTOMER_ID_STRING "Santa, North Pole" | ||
115 | #define CH_CUSTOMER_ID_CODE "xxxx-yyyy" | ||
116 | #define CH_LICENSE CH_LICENSE_GPL | ||
117 | #define CH_CUSTOMER_LIC_RT TRUE | ||
118 | #define CH_CUSTOMER_LIC_NIL TRUE | ||
119 | #define CH_CUSTOMER_LIC_OSLIB TRUE | ||
120 | #define CH_CUSTOMER_LIC_EX TRUE | ||
121 | #define CH_CUSTOMER_LIC_PORT_CM0 TRUE | ||
122 | #define CH_CUSTOMER_LIC_PORT_CM3 TRUE | ||
123 | #define CH_CUSTOMER_LIC_PORT_CM4 TRUE | ||
124 | #define CH_CUSTOMER_LIC_PORT_CM7 TRUE | ||
125 | #define CH_CUSTOMER_LIC_PORT_ARM79 TRUE | ||
126 | #define CH_CUSTOMER_LIC_PORT_E200Z0 TRUE | ||
127 | #define CH_CUSTOMER_LIC_PORT_E200Z2 TRUE | ||
128 | #define CH_CUSTOMER_LIC_PORT_E200Z3 TRUE | ||
129 | #define CH_CUSTOMER_LIC_PORT_E200Z4 TRUE | ||
130 | #define CH_LICENSE_TYPE_STRING "GNU General Public License 3 (GPL3)" | ||
131 | #define CH_LICENSE_ID_STRING "N/A" | ||
132 | #define CH_LICENSE_ID_CODE "N/A" | ||
133 | #define CH_LICENSE_MODIFIABLE_CODE TRUE | ||
134 | #define CH_LICENSE_FEATURES CH_FEATURES_FULL | ||
135 | #define CH_LICENSE_MAX_DEPLOY CH_DEPLOY_UNLIMITED | ||
136 | #define CHRESTRICTIONS_H | ||
137 | void chSysHalt(const char *reason); | ||
138 | #define CHTYPES_H | ||
139 | typedef uint32_t rtcnt_t; | ||
140 | typedef uint64_t rttime_t; | ||
141 | typedef uint32_t syssts_t; | ||
142 | typedef uint8_t tmode_t; | ||
143 | typedef uint8_t tstate_t; | ||
144 | typedef uint8_t trefs_t; | ||
145 | typedef uint8_t tslices_t; | ||
146 | typedef uint32_t tprio_t; | ||
147 | typedef int32_t msg_t; | ||
148 | typedef int32_t eventid_t; | ||
149 | typedef uint32_t eventmask_t; | ||
150 | typedef uint32_t eventflags_t; | ||
151 | typedef int32_t cnt_t; | ||
152 | typedef uint32_t ucnt_t; | ||
153 | #define ROMCONST const | ||
154 | #define NOINLINE __attribute__((noinline)) | ||
155 | #define PORT_THD_FUNCTION(tname,arg) void tname(void *arg) | ||
156 | #define PACKED_VAR __attribute__((packed)) | ||
157 | #define ALIGNED_VAR(n) __attribute__((aligned(n))) | ||
158 | #define SIZEOF_PTR 4 | ||
159 | #define REVERSE_ORDER 1 | ||
160 | #define CHSYSTYPES_H | ||
161 | typedef struct ch_thread thread_t; | ||
162 | typedef thread_t * thread_reference_t; | ||
163 | typedef struct ch_threads_list threads_list_t; | ||
164 | typedef struct ch_threads_queue threads_queue_t; | ||
165 | typedef struct ch_ready_list ready_list_t; | ||
166 | typedef void (*vtfunc_t)(void *p); | ||
167 | typedef struct ch_virtual_timer virtual_timer_t; | ||
168 | typedef struct ch_virtual_timers_list virtual_timers_list_t; | ||
169 | typedef struct ch_system_debug system_debug_t; | ||
170 | typedef struct ch_system ch_system_t; | ||
171 | #define __CH_STRINGIFY(a) #a | ||
172 | #define CHDEBUG_H | ||
173 | #define CH_DBG_STACK_FILL_VALUE 0x55 | ||
174 | #define _dbg_enter_lock() | ||
175 | #define _dbg_leave_lock() | ||
176 | #define _dbg_check_disable() | ||
177 | #define _dbg_check_suspend() | ||
178 | #define _dbg_check_enable() | ||
179 | #define _dbg_check_lock() | ||
180 | #define _dbg_check_unlock() | ||
181 | #define _dbg_check_lock_from_isr() | ||
182 | #define _dbg_check_unlock_from_isr() | ||
183 | #define _dbg_check_enter_isr() | ||
184 | #define _dbg_check_leave_isr() | ||
185 | #define chDbgCheckClassI() | ||
186 | #define chDbgCheckClassS() | ||
187 | #define chDbgCheck(c) do { if (CH_DBG_ENABLE_CHECKS != FALSE) { if (!(c)) { chSysHalt(__func__); } } } while (false) | ||
188 | #define chDbgAssert(c,r) do { if (CH_DBG_ENABLE_ASSERTS != FALSE) { if (!(c)) { chSysHalt(__func__); } } } while (false) | ||
189 | #define CHTIME_H | ||
190 | #define TIME_IMMEDIATE ((sysinterval_t)0) | ||
191 | #define TIME_INFINITE ((sysinterval_t)-1) | ||
192 | #define TIME_MAX_INTERVAL ((sysinterval_t)-2) | ||
193 | #define TIME_MAX_SYSTIME ((systime_t)-1) | ||
194 | typedef uint32_t systime_t; | ||
195 | typedef uint32_t sysinterval_t; | ||
196 | typedef uint32_t time_secs_t; | ||
197 | typedef uint32_t time_msecs_t; | ||
198 | typedef uint32_t time_usecs_t; | ||
199 | typedef uint64_t time_conv_t; | ||
200 | #define TIME_S2I(secs) ((sysinterval_t)((time_conv_t)(secs) * (time_conv_t)CH_CFG_ST_FREQUENCY)) | ||
201 | #define TIME_MS2I(msecs) ((sysinterval_t)((((time_conv_t)(msecs) * (time_conv_t)CH_CFG_ST_FREQUENCY) + (time_conv_t)999) / (time_conv_t)1000)) | ||
202 | #define TIME_US2I(usecs) ((sysinterval_t)((((time_conv_t)(usecs) * (time_conv_t)CH_CFG_ST_FREQUENCY) + (time_conv_t)999999) / (time_conv_t)1000000)) | ||
203 | #define TIME_I2S(interval) (time_secs_t)(((time_conv_t)(interval) + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY) | ||
204 | #define TIME_I2MS(interval) (time_msecs_t)((((time_conv_t)(interval) * (time_conv_t)1000) + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY) | ||
205 | #define TIME_I2US(interval) (time_msecs_t)((((time_conv_t)(interval) * (time_conv_t)1000000) + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY) | ||
206 | static inline sysinterval_t chTimeS2I(time_secs_t secs) { | ||
207 | time_conv_t ticks; | ||
208 | ticks = (time_conv_t)secs * (time_conv_t)CH_CFG_ST_FREQUENCY; | ||
209 | chDbgAssert(ticks <= (time_conv_t)TIME_MAX_INTERVAL, | ||
210 | "conversion overflow"); | ||
211 | return (sysinterval_t)ticks; | ||
212 | } | ||
213 | static inline sysinterval_t chTimeMS2I(time_msecs_t msec) { | ||
214 | time_conv_t ticks; | ||
215 | ticks = (((time_conv_t)msec * (time_conv_t)CH_CFG_ST_FREQUENCY) + | ||
216 | (time_conv_t)999) / (time_conv_t)1000; | ||
217 | chDbgAssert(ticks <= (time_conv_t)TIME_MAX_INTERVAL, | ||
218 | "conversion overflow"); | ||
219 | return (sysinterval_t)ticks; | ||
220 | } | ||
221 | static inline sysinterval_t chTimeUS2I(time_usecs_t usec) { | ||
222 | time_conv_t ticks; | ||
223 | ticks = (((time_conv_t)usec * (time_conv_t)CH_CFG_ST_FREQUENCY) + | ||
224 | (time_conv_t)999999) / (time_conv_t)1000000; | ||
225 | chDbgAssert(ticks <= (time_conv_t)TIME_MAX_INTERVAL, | ||
226 | "conversion overflow"); | ||
227 | return (sysinterval_t)ticks; | ||
228 | } | ||
229 | static inline time_secs_t chTimeI2S(sysinterval_t interval) { | ||
230 | time_conv_t secs; | ||
231 | secs = ((time_conv_t)interval + | ||
232 | (time_conv_t)CH_CFG_ST_FREQUENCY - | ||
233 | (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY; | ||
234 | chDbgAssert(secs < (time_conv_t)((time_secs_t)-1), | ||
235 | "conversion overflow"); | ||
236 | return (time_secs_t)secs; | ||
237 | } | ||
238 | static inline time_msecs_t chTimeI2MS(sysinterval_t interval) { | ||
239 | time_conv_t msecs; | ||
240 | msecs = (((time_conv_t)interval * (time_conv_t)1000) + | ||
241 | (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / | ||
242 | (time_conv_t)CH_CFG_ST_FREQUENCY; | ||
243 | chDbgAssert(msecs < (time_conv_t)((time_msecs_t)-1), | ||
244 | "conversion overflow"); | ||
245 | return (time_msecs_t)msecs; | ||
246 | } | ||
247 | static inline time_usecs_t chTimeI2US(sysinterval_t interval) { | ||
248 | time_conv_t usecs; | ||
249 | usecs = (((time_conv_t)interval * (time_conv_t)1000000) + | ||
250 | (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / | ||
251 | (time_conv_t)CH_CFG_ST_FREQUENCY; | ||
252 | chDbgAssert(usecs <= (time_conv_t)((time_usecs_t)-1), | ||
253 | "conversion overflow"); | ||
254 | return (time_usecs_t)usecs; | ||
255 | } | ||
256 | static inline systime_t chTimeAddX(systime_t systime, | ||
257 | sysinterval_t interval) { | ||
258 | return systime + (systime_t)interval; | ||
259 | } | ||
260 | static inline sysinterval_t chTimeDiffX(systime_t start, systime_t end) { | ||
261 | return (sysinterval_t)((systime_t)(end - start)); | ||
262 | } | ||
263 | static inline bool chTimeIsInRangeX(systime_t time, | ||
264 | systime_t start, | ||
265 | systime_t end) { | ||
266 | return (bool)((systime_t)((systime_t)time - (systime_t)start) < | ||
267 | (systime_t)((systime_t)end - (systime_t)start)); | ||
268 | } | ||
269 | #define CHALIGN_H | ||
270 | #define MEM_ALIGN_MASK(a) ((size_t)(a) - 1U) | ||
271 | #define MEM_ALIGN_PREV(p,a) ((size_t)(p) & ~MEM_ALIGN_MASK(a)) | ||
272 | #define MEM_ALIGN_NEXT(p,a) MEM_ALIGN_PREV((size_t)(p) + MEM_ALIGN_MASK(a), (a)) | ||
273 | #define MEM_IS_ALIGNED(p,a) (((size_t)(p) & MEM_ALIGN_MASK(a)) == 0U) | ||
274 | #define MEM_IS_VALID_ALIGNMENT(a) (((size_t)(a) != 0U) && (((size_t)(a) & ((size_t)(a) - 1U)) == 0U)) | ||
275 | #define CHCORE_H | ||
276 | #define PORT_ARCHITECTURE_ARM | ||
277 | #define PORT_COMPILER_NAME "GCC " __VERSION__ | ||
278 | #define PORT_USE_ALT_TIMER FALSE | ||
279 | typedef void *regarm_t; | ||
280 | typedef uint64_t stkalign_t; | ||
281 | struct port_context { | ||
282 | struct port_intctx *sp; | ||
283 | }; | ||
284 | #define CORTEX_PRIORITY_LEVELS (1U << CORTEX_PRIORITY_BITS) | ||
285 | #define CORTEX_MINIMUM_PRIORITY (CORTEX_PRIORITY_LEVELS - 1) | ||
286 | #define CORTEX_MAXIMUM_PRIORITY 0U | ||
287 | #define CORTEX_PRIO_MASK(n) ((n) << (8U - (unsigned)CORTEX_PRIORITY_BITS)) | ||
288 | #define PORT_IRQ_IS_VALID_PRIORITY(n) (((n) >= 0U) && ((n) < CORTEX_PRIORITY_LEVELS)) | ||
289 | #define PORT_IRQ_IS_VALID_KERNEL_PRIORITY(n) (((n) >= CORTEX_MAX_KERNEL_PRIORITY) && ((n) < CORTEX_PRIORITY_LEVELS)) | ||
290 | #define MPU_H | ||
291 | #define MPU_TYPE_SEPARATED (1U << 0U) | ||
292 | #define MPU_TYPE_DREGION(n) (((n) >> 8U) & 255U) | ||
293 | #define MPU_TYPE_IREGION(n) (((n) >> 16U) & 255U) | ||
294 | #define MPU_CTRL_ENABLE (1U << 0U) | ||
295 | #define MPU_CTRL_HFNMIENA (1U << 1U) | ||
296 | #define MPU_CTRL_PRIVDEFENA (1U << 2U) | ||
297 | #define MPU_RNR_REGION_MASK (255U << 0U) | ||
298 | #define MPU_RNR_REGION(n) ((n) << 0U) | ||
299 | #define MPU_RBAR_REGION_MASK (15U << 0U) | ||
300 | #define MPU_RBAR_REGION(n) ((n) << 0U) | ||
301 | #define MPU_RBAR_VALID (1U << 4U) | ||
302 | #define MPU_RBAR_ADDR_MASK 0xFFFFFFE0U | ||
303 | #define MPU_RBAR_ADDR(n) ((n) << 5U) | ||
304 | #define MPU_RASR_ENABLE (1U << 0U) | ||
305 | #define MPU_RASR_SIZE_MASK (31U << 1U) | ||
306 | #define MPU_RASR_SIZE(n) ((n) << 1U) | ||
307 | #define MPU_RASR_SIZE_32 MPU_RASR_SIZE(4U) | ||
308 | #define MPU_RASR_SIZE_64 MPU_RASR_SIZE(5U) | ||
309 | #define MPU_RASR_SIZE_128 MPU_RASR_SIZE(6U) | ||
310 | #define MPU_RASR_SIZE_256 MPU_RASR_SIZE(7U) | ||
311 | #define MPU_RASR_SIZE_512 MPU_RASR_SIZE(8U) | ||
312 | #define MPU_RASR_SIZE_1K MPU_RASR_SIZE(9U) | ||
313 | #define MPU_RASR_SIZE_2K MPU_RASR_SIZE(10U) | ||
314 | #define MPU_RASR_SIZE_4K MPU_RASR_SIZE(11U) | ||
315 | #define MPU_RASR_SIZE_8K MPU_RASR_SIZE(12U) | ||
316 | #define MPU_RASR_SIZE_16K MPU_RASR_SIZE(13U) | ||
317 | #define MPU_RASR_SIZE_32K MPU_RASR_SIZE(14U) | ||
318 | #define MPU_RASR_SIZE_64K MPU_RASR_SIZE(15U) | ||
319 | #define MPU_RASR_SIZE_128K MPU_RASR_SIZE(16U) | ||
320 | #define MPU_RASR_SIZE_256K MPU_RASR_SIZE(17U) | ||
321 | #define MPU_RASR_SIZE_512K MPU_RASR_SIZE(18U) | ||
322 | #define MPU_RASR_SIZE_1M MPU_RASR_SIZE(19U) | ||
323 | #define MPU_RASR_SIZE_2M MPU_RASR_SIZE(20U) | ||
324 | #define MPU_RASR_SIZE_4M MPU_RASR_SIZE(21U) | ||
325 | #define MPU_RASR_SIZE_8M MPU_RASR_SIZE(22U) | ||
326 | #define MPU_RASR_SIZE_16M MPU_RASR_SIZE(23U) | ||
327 | #define MPU_RASR_SIZE_32M MPU_RASR_SIZE(24U) | ||
328 | #define MPU_RASR_SIZE_64M MPU_RASR_SIZE(25U) | ||
329 | #define MPU_RASR_SIZE_128M MPU_RASR_SIZE(26U) | ||
330 | #define MPU_RASR_SIZE_256M MPU_RASR_SIZE(27U) | ||
331 | #define MPU_RASR_SIZE_512M MPU_RASR_SIZE(28U) | ||
332 | #define MPU_RASR_SIZE_1G MPU_RASR_SIZE(29U) | ||
333 | #define MPU_RASR_SIZE_2G MPU_RASR_SIZE(30U) | ||
334 | #define MPU_RASR_SIZE_4G MPU_RASR_SIZE(31U) | ||
335 | #define MPU_RASR_SRD_MASK (255U << 8U) | ||
336 | #define MPU_RASR_SRD(n) ((n) << 8U) | ||
337 | #define MPU_RASR_SRD_ALL (0U << 8U) | ||
338 | #define MPU_RASR_SRD_DISABLE_SUB0 (1U << 8U) | ||
339 | #define MPU_RASR_SRD_DISABLE_SUB1 (2U << 8U) | ||
340 | #define MPU_RASR_SRD_DISABLE_SUB2 (4U << 8U) | ||
341 | #define MPU_RASR_SRD_DISABLE_SUB3 (8U << 8U) | ||
342 | #define MPU_RASR_SRD_DISABLE_SUB4 (16U << 8U) | ||
343 | #define MPU_RASR_SRD_DISABLE_SUB5 (32U << 8U) | ||
344 | #define MPU_RASR_SRD_DISABLE_SUB6 (64U << 8U) | ||
345 | #define MPU_RASR_SRD_DISABLE_SUB7 (128U << 8U) | ||
346 | #define MPU_RASR_ATTR_B (1U << 16U) | ||
347 | #define MPU_RASR_ATTR_C (1U << 17U) | ||
348 | #define MPU_RASR_ATTR_S (1U << 18U) | ||
349 | #define MPU_RASR_ATTR_TEX_MASK (7U << 19U) | ||
350 | #define MPU_RASR_ATTR_TEX(n) ((n) << 19U) | ||
351 | #define MPU_RASR_ATTR_AP_MASK (7U << 24U) | ||
352 | #define MPU_RASR_ATTR_AP(n) ((n) << 24U) | ||
353 | #define MPU_RASR_ATTR_AP_NA_NA (0U << 24U) | ||
354 | #define MPU_RASR_ATTR_AP_RW_NA (1U << 24U) | ||
355 | #define MPU_RASR_ATTR_AP_RW_RO (2U << 24U) | ||
356 | #define MPU_RASR_ATTR_AP_RW_RW (3U << 24U) | ||
357 | #define MPU_RASR_ATTR_AP_RO_NA (5U << 24U) | ||
358 | #define MPU_RASR_ATTR_AP_RO_RO (6U << 24U) | ||
359 | #define MPU_RASR_ATTR_XN (1U << 28U) | ||
360 | #define MPU_RASR_ATTR_STRONGLY_ORDERED (MPU_RASR_ATTR_TEX(0)) | ||
361 | #define MPU_RASR_ATTR_SHARED_DEVICE (MPU_RASR_ATTR_TEX(0) | MPU_RASR_ATTR_B) | ||
362 | #define MPU_RASR_ATTR_CACHEABLE_WT_NWA (MPU_RASR_ATTR_TEX(0) | MPU_RASR_ATTR_C) | ||
363 | #define MPU_RASR_ATTR_CACHEABLE_WB_NWA (MPU_RASR_ATTR_TEX(0) | MPU_RASR_ATTR_B | MPU_RASR_ATTR_C) | ||
364 | #define MPU_RASR_ATTR_NON_CACHEABLE (MPU_RASR_ATTR_TEX(1)) | ||
365 | #define MPU_RASR_ATTR_CACHEABLE_WB_WA (MPU_RASR_ATTR_TEX(1) | MPU_RASR_ATTR_B | MPU_RASR_ATTR_C) | ||
366 | #define MPU_RASR_ATTR_NON_SHARED_DEVICE (MPU_RASR_ATTR_TEX(2)) | ||
367 | #define MPU_REGION_0 0U | ||
368 | #define MPU_REGION_1 1U | ||
369 | #define MPU_REGION_2 2U | ||
370 | #define MPU_REGION_3 3U | ||
371 | #define MPU_REGION_4 4U | ||
372 | #define MPU_REGION_5 5U | ||
373 | #define MPU_REGION_6 6U | ||
374 | #define MPU_REGION_7 7U | ||
375 | #define mpuEnable(ctrl) { MPU->CTRL = ((uint32_t)ctrl) | MPU_CTRL_ENABLE; SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; } | ||
376 | #define mpuDisable() { SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; MPU->CTRL = 0; } | ||
377 | #define mpuConfigureRegion(region,addr,attribs) { MPU->RNR = ((uint32_t)region); MPU->RBAR = ((uint32_t)addr); MPU->RASR = ((uint32_t)attribs); } | ||
378 | #define mpuSetRegionAddress(region,addr) { MPU->RNR = ((uint32_t)region); MPU->RBAR = ((uint32_t)addr); } | ||
379 | #define CHCORE_V7M_H | ||
380 | #define PORT_SUPPORTS_RT TRUE | ||
381 | #define PORT_NATURAL_ALIGN sizeof (void *) | ||
382 | #define PORT_STACK_ALIGN sizeof (stkalign_t) | ||
383 | #define PORT_WORKING_AREA_ALIGN (PORT_ENABLE_GUARD_PAGES == TRUE ? 32U : PORT_STACK_ALIGN) | ||
384 | #define CORTEX_BASEPRI_DISABLED 0U | ||
385 | #define PORT_ENABLE_GUARD_PAGES FALSE | ||
386 | #define PORT_USE_MPU_REGION MPU_REGION_7 | ||
387 | #define PORT_IDLE_THREAD_STACK_SIZE 16 | ||
388 | #define PORT_INT_REQUIRED_STACK 64 | ||
389 | #define CORTEX_ENABLE_WFI_IDLE FALSE | ||
390 | #define CORTEX_SIMPLIFIED_PRIORITY FALSE | ||
391 | #define CORTEX_PRIORITY_SVCALL (CORTEX_MAXIMUM_PRIORITY + 1U) | ||
392 | #define CORTEX_PRIGROUP_INIT (7 - CORTEX_PRIORITY_BITS) | ||
393 | #define PORT_GUARD_PAGE_SIZE 0U | ||
394 | #define PORT_ARCHITECTURE_ARM_v7ME | ||
395 | #define PORT_ARCHITECTURE_NAME "ARMv7E-M" | ||
396 | #define PORT_CORE_VARIANT_NAME "Cortex-M4" | ||
397 | #define PORT_INFO "Advanced kernel mode" | ||
398 | #define CORTEX_MAX_KERNEL_PRIORITY (CORTEX_PRIORITY_SVCALL + 1U) | ||
399 | #define CORTEX_BASEPRI_KERNEL CORTEX_PRIO_MASK(CORTEX_MAX_KERNEL_PRIORITY) | ||
400 | #define CORTEX_PRIORITY_PENDSV CORTEX_MAX_KERNEL_PRIORITY | ||
401 | struct port_extctx { | ||
402 | regarm_t r0; | ||
403 | regarm_t r1; | ||
404 | regarm_t r2; | ||
405 | regarm_t r3; | ||
406 | regarm_t r12; | ||
407 | regarm_t lr_thd; | ||
408 | regarm_t pc; | ||
409 | regarm_t xpsr; | ||
410 | }; | ||
411 | struct port_intctx { | ||
412 | regarm_t r4; | ||
413 | regarm_t r5; | ||
414 | regarm_t r6; | ||
415 | regarm_t r7; | ||
416 | regarm_t r8; | ||
417 | regarm_t r9; | ||
418 | regarm_t r10; | ||
419 | regarm_t r11; | ||
420 | regarm_t lr; | ||
421 | }; | ||
422 | #define PORT_SETUP_CONTEXT(tp,wbase,wtop,pf,arg) { (tp)->ctx.sp = (struct port_intctx *)((uint8_t *)(wtop) - sizeof (struct port_intctx)); (tp)->ctx.sp->r4 = (regarm_t)(pf); (tp)->ctx.sp->r5 = (regarm_t)(arg); (tp)->ctx.sp->lr = (regarm_t)_port_thread_start; } | ||
423 | #define PORT_WA_SIZE(n) ((size_t)PORT_GUARD_PAGE_SIZE + sizeof (struct port_intctx) + sizeof (struct port_extctx) + (size_t)(n) + (size_t)PORT_INT_REQUIRED_STACK) | ||
424 | #define PORT_WORKING_AREA(s,n) stkalign_t s[THD_WORKING_AREA_SIZE(n) / sizeof (stkalign_t)] | ||
425 | #define PORT_IRQ_PROLOGUE() | ||
426 | #define PORT_IRQ_EPILOGUE() _port_irq_epilogue() | ||
427 | #define PORT_IRQ_HANDLER(id) void id(void) | ||
428 | #define PORT_FAST_IRQ_HANDLER(id) void id(void) | ||
429 | #define port_switch(ntp,otp) _port_switch(ntp, otp) | ||
430 | void _port_irq_epilogue(void); | ||
431 | void _port_switch(thread_t *ntp, thread_t *otp); | ||
432 | void _port_thread_start(void); | ||
433 | void _port_switch_from_isr(void); | ||
434 | void _port_exit_from_isr(void); | ||
435 | static inline void port_init(void) { | ||
436 | NVIC_SetPriorityGrouping(CORTEX_PRIGROUP_INIT); | ||
437 | CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; | ||
438 | DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; | ||
439 | NVIC_SetPriority(SVCall_IRQn, CORTEX_PRIORITY_SVCALL); | ||
440 | NVIC_SetPriority(PendSV_IRQn, CORTEX_PRIORITY_PENDSV); | ||
441 | } | ||
442 | static inline syssts_t port_get_irq_status(void) { | ||
443 | syssts_t sts; | ||
444 | sts = (syssts_t)__get_BASEPRI(); | ||
445 | return sts; | ||
446 | } | ||
447 | static inline bool port_irq_enabled(syssts_t sts) { | ||
448 | return sts == (syssts_t)CORTEX_BASEPRI_DISABLED; | ||
449 | } | ||
450 | static inline bool port_is_isr_context(void) { | ||
451 | return (bool)((__get_IPSR() & 0x1FFU) != 0U); | ||
452 | } | ||
453 | static inline void port_lock(void) { | ||
454 | __set_BASEPRI(CORTEX_BASEPRI_KERNEL); | ||
455 | } | ||
456 | static inline void port_unlock(void) { | ||
457 | __set_BASEPRI(CORTEX_BASEPRI_DISABLED); | ||
458 | } | ||
459 | static inline void port_lock_from_isr(void) { | ||
460 | port_lock(); | ||
461 | } | ||
462 | static inline void port_unlock_from_isr(void) { | ||
463 | port_unlock(); | ||
464 | } | ||
465 | static inline void port_disable(void) { | ||
466 | __disable_irq(); | ||
467 | } | ||
468 | static inline void port_suspend(void) { | ||
469 | __set_BASEPRI(CORTEX_BASEPRI_KERNEL); | ||
470 | __enable_irq(); | ||
471 | } | ||
472 | static inline void port_enable(void) { | ||
473 | __set_BASEPRI(CORTEX_BASEPRI_DISABLED); | ||
474 | __enable_irq(); | ||
475 | } | ||
476 | static inline void port_wait_for_interrupt(void) { | ||
477 | } | ||
478 | static inline rtcnt_t port_rt_get_counter_value(void) { | ||
479 | return DWT->CYCCNT; | ||
480 | } | ||
481 | #define CHTRACE_H | ||
482 | #define CH_TRACE_TYPE_UNUSED 0U | ||
483 | #define CH_TRACE_TYPE_SWITCH 1U | ||
484 | #define CH_TRACE_TYPE_ISR_ENTER 2U | ||
485 | #define CH_TRACE_TYPE_ISR_LEAVE 3U | ||
486 | #define CH_TRACE_TYPE_HALT 4U | ||
487 | #define CH_TRACE_TYPE_USER 5U | ||
488 | #define CH_DBG_TRACE_MASK_DISABLED 255U | ||
489 | #define CH_DBG_TRACE_MASK_NONE 0U | ||
490 | #define CH_DBG_TRACE_MASK_SWITCH 1U | ||
491 | #define CH_DBG_TRACE_MASK_ISR 2U | ||
492 | #define CH_DBG_TRACE_MASK_HALT 4U | ||
493 | #define CH_DBG_TRACE_MASK_USER 8U | ||
494 | #define CH_DBG_TRACE_MASK_SLOW (CH_DBG_TRACE_MASK_SWITCH | CH_DBG_TRACE_MASK_HALT | CH_DBG_TRACE_MASK_USER) | ||
495 | #define CH_DBG_TRACE_MASK_ALL (CH_DBG_TRACE_MASK_SWITCH | CH_DBG_TRACE_MASK_ISR | CH_DBG_TRACE_MASK_HALT | CH_DBG_TRACE_MASK_USER) | ||
496 | #define _trace_init() | ||
497 | #define _trace_switch(ntp,otp) | ||
498 | #define _trace_isr_enter(isr) | ||
499 | #define _trace_isr_leave(isr) | ||
500 | #define _trace_halt(reason) | ||
501 | #define chDbgWriteTraceI(up1,up2) | ||
502 | #define chDbgWriteTrace(up1,up2) | ||
503 | #define CHTM_H | ||
504 | typedef struct { | ||
505 | rtcnt_t offset; | ||
506 | } tm_calibration_t; | ||
507 | typedef struct { | ||
508 | rtcnt_t best; | ||
509 | rtcnt_t worst; | ||
510 | rtcnt_t last; | ||
511 | ucnt_t n; | ||
512 | rttime_t cumulative; | ||
513 | } time_measurement_t; | ||
514 | void _tm_init(void); | ||
515 | void chTMObjectInit(time_measurement_t *tmp); | ||
516 | NOINLINE void chTMStartMeasurementX(time_measurement_t *tmp); | ||
517 | NOINLINE void chTMStopMeasurementX(time_measurement_t *tmp); | ||
518 | NOINLINE void chTMChainMeasurementToX(time_measurement_t *tmp1, | ||
519 | time_measurement_t *tmp2); | ||
520 | #define CHSTATS_H | ||
521 | #define _stats_increase_irq() | ||
522 | #define _stats_ctxswc(old,new) | ||
523 | #define _stats_start_measure_crit_thd() | ||
524 | #define _stats_stop_measure_crit_thd() | ||
525 | #define _stats_start_measure_crit_isr() | ||
526 | #define _stats_stop_measure_crit_isr() | ||
527 | #define CHSCHD_H | ||
528 | #define MSG_OK (msg_t)0 | ||
529 | #define MSG_TIMEOUT (msg_t)-1 | ||
530 | #define MSG_RESET (msg_t)-2 | ||
531 | #define NOPRIO (tprio_t)0 | ||
532 | #define IDLEPRIO (tprio_t)1 | ||
533 | #define LOWPRIO (tprio_t)2 | ||
534 | #define NORMALPRIO (tprio_t)128 | ||
535 | #define HIGHPRIO (tprio_t)255 | ||
536 | #define CH_STATE_READY (tstate_t)0 | ||
537 | #define CH_STATE_CURRENT (tstate_t)1 | ||
538 | #define CH_STATE_WTSTART (tstate_t)2 | ||
539 | #define CH_STATE_SUSPENDED (tstate_t)3 | ||
540 | #define CH_STATE_QUEUED (tstate_t)4 | ||
541 | #define CH_STATE_WTSEM (tstate_t)5 | ||
542 | #define CH_STATE_WTMTX (tstate_t)6 | ||
543 | #define CH_STATE_WTCOND (tstate_t)7 | ||
544 | #define CH_STATE_SLEEPING (tstate_t)8 | ||
545 | #define CH_STATE_WTEXIT (tstate_t)9 | ||
546 | #define CH_STATE_WTOREVT (tstate_t)10 | ||
547 | #define CH_STATE_WTANDEVT (tstate_t)11 | ||
548 | #define CH_STATE_SNDMSGQ (tstate_t)12 | ||
549 | #define CH_STATE_SNDMSG (tstate_t)13 | ||
550 | #define CH_STATE_WTMSG (tstate_t)14 | ||
551 | #define CH_STATE_FINAL (tstate_t)15 | ||
552 | #define CH_STATE_NAMES "READY", "CURRENT", "WTSTART", "SUSPENDED", "QUEUED", "WTSEM", "WTMTX", "WTCOND", "SLEEPING", "WTEXIT", "WTOREVT", "WTANDEVT", "SNDMSGQ", "SNDMSG", "WTMSG", "FINAL" | ||
553 | #define CH_FLAG_MODE_MASK (tmode_t)3U | ||
554 | #define CH_FLAG_MODE_STATIC (tmode_t)0U | ||
555 | #define CH_FLAG_MODE_HEAP (tmode_t)1U | ||
556 | #define CH_FLAG_MODE_MPOOL (tmode_t)2U | ||
557 | #define CH_FLAG_TERMINATE (tmode_t)4U | ||
558 | struct ch_threads_list { | ||
559 | thread_t *next; | ||
560 | }; | ||
561 | struct ch_threads_queue { | ||
562 | thread_t *next; | ||
563 | thread_t *prev; | ||
564 | }; | ||
565 | struct ch_thread { | ||
566 | threads_queue_t queue; | ||
567 | tprio_t prio; | ||
568 | struct port_context ctx; | ||
569 | thread_t *newer; | ||
570 | thread_t *older; | ||
571 | const char *name; | ||
572 | stkalign_t *wabase; | ||
573 | tstate_t state; | ||
574 | tmode_t flags; | ||
575 | trefs_t refs; | ||
576 | union { | ||
577 | msg_t rdymsg; | ||
578 | msg_t exitcode; | ||
579 | void *wtobjp; | ||
580 | thread_reference_t *wttrp; | ||
581 | msg_t sentmsg; | ||
582 | struct ch_semaphore *wtsemp; | ||
583 | struct ch_mutex *wtmtxp; | ||
584 | eventmask_t ewmask; | ||
585 | } u; | ||
586 | threads_list_t waiting; | ||
587 | threads_queue_t msgqueue; | ||
588 | eventmask_t epending; | ||
589 | struct ch_mutex *mtxlist; | ||
590 | tprio_t realprio; | ||
591 | void *mpool; | ||
592 | CH_CFG_THREAD_EXTRA_FIELDS | ||
593 | }; | ||
594 | struct ch_virtual_timer { | ||
595 | virtual_timer_t *next; | ||
596 | virtual_timer_t *prev; | ||
597 | sysinterval_t delta; | ||
598 | vtfunc_t func; | ||
599 | void *par; | ||
600 | }; | ||
601 | struct ch_virtual_timers_list { | ||
602 | virtual_timer_t *next; | ||
603 | virtual_timer_t *prev; | ||
604 | sysinterval_t delta; | ||
605 | volatile systime_t systime; | ||
606 | }; | ||
607 | struct ch_ready_list { | ||
608 | threads_queue_t queue; | ||
609 | tprio_t prio; | ||
610 | struct port_context ctx; | ||
611 | thread_t *newer; | ||
612 | thread_t *older; | ||
613 | thread_t *current; | ||
614 | }; | ||
615 | struct ch_system_debug { | ||
616 | const char * volatile panic_msg; | ||
617 | }; | ||
618 | struct ch_system { | ||
619 | ready_list_t rlist; | ||
620 | virtual_timers_list_t vtlist; | ||
621 | system_debug_t dbg; | ||
622 | thread_t mainthread; | ||
623 | tm_calibration_t tm; | ||
624 | CH_CFG_SYSTEM_EXTRA_FIELDS | ||
625 | }; | ||
626 | #define firstprio(rlp) ((rlp)->next->prio) | ||
627 | #define currp ch.rlist.current | ||
628 | extern ch_system_t ch; | ||
629 | void _scheduler_init(void); | ||
630 | thread_t *chSchReadyI(thread_t *tp); | ||
631 | thread_t *chSchReadyAheadI(thread_t *tp); | ||
632 | void chSchGoSleepS(tstate_t newstate); | ||
633 | msg_t chSchGoSleepTimeoutS(tstate_t newstate, sysinterval_t timeout); | ||
634 | void chSchWakeupS(thread_t *ntp, msg_t msg); | ||
635 | void chSchRescheduleS(void); | ||
636 | bool chSchIsPreemptionRequired(void); | ||
637 | void chSchDoRescheduleBehind(void); | ||
638 | void chSchDoRescheduleAhead(void); | ||
639 | void chSchDoReschedule(void); | ||
640 | static inline void list_init(threads_list_t *tlp) { | ||
641 | tlp->next = (thread_t *)tlp; | ||
642 | } | ||
643 | static inline bool list_isempty(threads_list_t *tlp) { | ||
644 | return (bool)(tlp->next == (thread_t *)tlp); | ||
645 | } | ||
646 | static inline bool list_notempty(threads_list_t *tlp) { | ||
647 | return (bool)(tlp->next != (thread_t *)tlp); | ||
648 | } | ||
649 | static inline void queue_init(threads_queue_t *tqp) { | ||
650 | tqp->next = (thread_t *)tqp; | ||
651 | tqp->prev = (thread_t *)tqp; | ||
652 | } | ||
653 | static inline bool queue_isempty(const threads_queue_t *tqp) { | ||
654 | return (bool)(tqp->next == (const thread_t *)tqp); | ||
655 | } | ||
656 | static inline bool queue_notempty(const threads_queue_t *tqp) { | ||
657 | return (bool)(tqp->next != (const thread_t *)tqp); | ||
658 | } | ||
659 | static inline void list_insert(thread_t *tp, threads_list_t *tlp) { | ||
660 | tp->queue.next = tlp->next; | ||
661 | tlp->next = tp; | ||
662 | } | ||
663 | static inline thread_t *list_remove(threads_list_t *tlp) { | ||
664 | thread_t *tp = tlp->next; | ||
665 | tlp->next = tp->queue.next; | ||
666 | return tp; | ||
667 | } | ||
668 | static inline void queue_prio_insert(thread_t *tp, threads_queue_t *tqp) { | ||
669 | thread_t *cp = (thread_t *)tqp; | ||
670 | do { | ||
671 | cp = cp->queue.next; | ||
672 | } while ((cp != (thread_t *)tqp) && (cp->prio >= tp->prio)); | ||
673 | tp->queue.next = cp; | ||
674 | tp->queue.prev = cp->queue.prev; | ||
675 | tp->queue.prev->queue.next = tp; | ||
676 | cp->queue.prev = tp; | ||
677 | } | ||
678 | static inline void queue_insert(thread_t *tp, threads_queue_t *tqp) { | ||
679 | tp->queue.next = (thread_t *)tqp; | ||
680 | tp->queue.prev = tqp->prev; | ||
681 | tp->queue.prev->queue.next = tp; | ||
682 | tqp->prev = tp; | ||
683 | } | ||
684 | static inline thread_t *queue_fifo_remove(threads_queue_t *tqp) { | ||
685 | thread_t *tp = tqp->next; | ||
686 | tqp->next = tp->queue.next; | ||
687 | tqp->next->queue.prev = (thread_t *)tqp; | ||
688 | return tp; | ||
689 | } | ||
690 | static inline thread_t *queue_lifo_remove(threads_queue_t *tqp) { | ||
691 | thread_t *tp = tqp->prev; | ||
692 | tqp->prev = tp->queue.prev; | ||
693 | tqp->prev->queue.next = (thread_t *)tqp; | ||
694 | return tp; | ||
695 | } | ||
696 | static inline thread_t *queue_dequeue(thread_t *tp) { | ||
697 | tp->queue.prev->queue.next = tp->queue.next; | ||
698 | tp->queue.next->queue.prev = tp->queue.prev; | ||
699 | return tp; | ||
700 | } | ||
701 | static inline bool chSchIsRescRequiredI(void) { | ||
702 | chDbgCheckClassI(); | ||
703 | return firstprio(&ch.rlist.queue) > currp->prio; | ||
704 | } | ||
705 | static inline bool chSchCanYieldS(void) { | ||
706 | chDbgCheckClassS(); | ||
707 | return firstprio(&ch.rlist.queue) >= currp->prio; | ||
708 | } | ||
709 | static inline void chSchDoYieldS(void) { | ||
710 | chDbgCheckClassS(); | ||
711 | if (chSchCanYieldS()) { | ||
712 | chSchDoRescheduleBehind(); | ||
713 | } | ||
714 | } | ||
715 | static inline void chSchPreemption(void) { | ||
716 | tprio_t p1 = firstprio(&ch.rlist.queue); | ||
717 | tprio_t p2 = currp->prio; | ||
718 | if (p1 > p2) { | ||
719 | chSchDoRescheduleAhead(); | ||
720 | } | ||
721 | } | ||
722 | #define CHSYS_H | ||
723 | #define CH_INTEGRITY_RLIST 1U | ||
724 | #define CH_INTEGRITY_VTLIST 2U | ||
725 | #define CH_INTEGRITY_REGISTRY 4U | ||
726 | #define CH_INTEGRITY_PORT 8U | ||
727 | #define CH_IRQ_IS_VALID_PRIORITY(prio) PORT_IRQ_IS_VALID_PRIORITY(prio) | ||
728 | #define CH_IRQ_IS_VALID_KERNEL_PRIORITY(prio) PORT_IRQ_IS_VALID_KERNEL_PRIORITY(prio) | ||
729 | #define CH_IRQ_PROLOGUE() PORT_IRQ_PROLOGUE(); CH_CFG_IRQ_PROLOGUE_HOOK(); _stats_increase_irq(); _trace_isr_enter(__func__); _dbg_check_enter_isr() | ||
730 | #define CH_IRQ_EPILOGUE() _dbg_check_leave_isr(); _trace_isr_leave(__func__); CH_CFG_IRQ_EPILOGUE_HOOK(); PORT_IRQ_EPILOGUE() | ||
731 | #define CH_IRQ_HANDLER(id) PORT_IRQ_HANDLER(id) | ||
732 | #define CH_FAST_IRQ_HANDLER(id) PORT_FAST_IRQ_HANDLER(id) | ||
733 | #define S2RTC(freq,sec) ((freq) * (sec)) | ||
734 | #define MS2RTC(freq,msec) (rtcnt_t)((((freq) + 999UL) / 1000UL) * (msec)) | ||
735 | #define US2RTC(freq,usec) (rtcnt_t)((((freq) + 999999UL) / 1000000UL) * (usec)) | ||
736 | #define RTC2S(freq,n) ((((n) - 1UL) / (freq)) + 1UL) | ||
737 | #define RTC2MS(freq,n) ((((n) - 1UL) / ((freq) / 1000UL)) + 1UL) | ||
738 | #define RTC2US(freq,n) ((((n) - 1UL) / ((freq) / 1000000UL)) + 1UL) | ||
739 | #define chSysGetRealtimeCounterX() (rtcnt_t)port_rt_get_counter_value() | ||
740 | #define chSysSwitch(ntp,otp) { _trace_switch(ntp, otp); _stats_ctxswc(ntp, otp); CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp); port_switch(ntp, otp); } | ||
741 | extern stkalign_t ch_idle_thread_wa[]; | ||
742 | void chSysInit(void); | ||
743 | bool chSysIntegrityCheckI(unsigned testmask); | ||
744 | void chSysTimerHandlerI(void); | ||
745 | syssts_t chSysGetStatusAndLockX(void); | ||
746 | void chSysRestoreStatusX(syssts_t sts); | ||
747 | bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end); | ||
748 | void chSysPolledDelayX(rtcnt_t cycles); | ||
749 | static inline void chSysDisable(void) { | ||
750 | port_disable(); | ||
751 | _dbg_check_disable(); | ||
752 | } | ||
753 | static inline void chSysSuspend(void) { | ||
754 | port_suspend(); | ||
755 | _dbg_check_suspend(); | ||
756 | } | ||
757 | static inline void chSysEnable(void) { | ||
758 | _dbg_check_enable(); | ||
759 | port_enable(); | ||
760 | } | ||
761 | static inline void chSysLock(void) { | ||
762 | port_lock(); | ||
763 | _stats_start_measure_crit_thd(); | ||
764 | _dbg_check_lock(); | ||
765 | } | ||
766 | static inline void chSysUnlock(void) { | ||
767 | _dbg_check_unlock(); | ||
768 | _stats_stop_measure_crit_thd(); | ||
769 | chDbgAssert((ch.rlist.queue.next == (thread_t *)&ch.rlist.queue) || | ||
770 | (ch.rlist.current->prio >= ch.rlist.queue.next->prio), | ||
771 | "priority order violation"); | ||
772 | port_unlock(); | ||
773 | } | ||
774 | static inline void chSysLockFromISR(void) { | ||
775 | port_lock_from_isr(); | ||
776 | _stats_start_measure_crit_isr(); | ||
777 | _dbg_check_lock_from_isr(); | ||
778 | } | ||
779 | static inline void chSysUnlockFromISR(void) { | ||
780 | _dbg_check_unlock_from_isr(); | ||
781 | _stats_stop_measure_crit_isr(); | ||
782 | port_unlock_from_isr(); | ||
783 | } | ||
784 | static inline void chSysUnconditionalLock(void) { | ||
785 | if (port_irq_enabled(port_get_irq_status())) { | ||
786 | chSysLock(); | ||
787 | } | ||
788 | } | ||
789 | static inline void chSysUnconditionalUnlock(void) { | ||
790 | if (!port_irq_enabled(port_get_irq_status())) { | ||
791 | chSysUnlock(); | ||
792 | } | ||
793 | } | ||
794 | static inline thread_t *chSysGetIdleThreadX(void) { | ||
795 | return ch.rlist.queue.prev; | ||
796 | } | ||
797 | #define CHVT_H | ||
798 | void _vt_init(void); | ||
799 | void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, | ||
800 | vtfunc_t vtfunc, void *par); | ||
801 | void chVTDoResetI(virtual_timer_t *vtp); | ||
802 | static inline void chVTObjectInit(virtual_timer_t *vtp) { | ||
803 | vtp->func = NULL; | ||
804 | } | ||
805 | static inline systime_t chVTGetSystemTimeX(void) { | ||
806 | return ch.vtlist.systime; | ||
807 | } | ||
808 | static inline systime_t chVTGetSystemTime(void) { | ||
809 | systime_t systime; | ||
810 | chSysLock(); | ||
811 | systime = chVTGetSystemTimeX(); | ||
812 | chSysUnlock(); | ||
813 | return systime; | ||
814 | } | ||
815 | static inline sysinterval_t chVTTimeElapsedSinceX(systime_t start) { | ||
816 | return chTimeDiffX(start, chVTGetSystemTimeX()); | ||
817 | } | ||
818 | static inline bool chVTIsSystemTimeWithinX(systime_t start, systime_t end) { | ||
819 | return chTimeIsInRangeX(chVTGetSystemTimeX(), start, end); | ||
820 | } | ||
821 | static inline bool chVTIsSystemTimeWithin(systime_t start, systime_t end) { | ||
822 | return chTimeIsInRangeX(chVTGetSystemTime(), start, end); | ||
823 | } | ||
824 | static inline bool chVTGetTimersStateI(sysinterval_t *timep) { | ||
825 | chDbgCheckClassI(); | ||
826 | if (&ch.vtlist == (virtual_timers_list_t *)ch.vtlist.next) { | ||
827 | return false; | ||
828 | } | ||
829 | if (timep != NULL) { | ||
830 | *timep = ch.vtlist.next->delta; | ||
831 | } | ||
832 | return true; | ||
833 | } | ||
834 | static inline bool chVTIsArmedI(const virtual_timer_t *vtp) { | ||
835 | chDbgCheckClassI(); | ||
836 | return (bool)(vtp->func != NULL); | ||
837 | } | ||
838 | static inline bool chVTIsArmed(const virtual_timer_t *vtp) { | ||
839 | bool b; | ||
840 | chSysLock(); | ||
841 | b = chVTIsArmedI(vtp); | ||
842 | chSysUnlock(); | ||
843 | return b; | ||
844 | } | ||
845 | static inline void chVTResetI(virtual_timer_t *vtp) { | ||
846 | if (chVTIsArmedI(vtp)) { | ||
847 | chVTDoResetI(vtp); | ||
848 | } | ||
849 | } | ||
850 | static inline void chVTReset(virtual_timer_t *vtp) { | ||
851 | chSysLock(); | ||
852 | chVTResetI(vtp); | ||
853 | chSysUnlock(); | ||
854 | } | ||
855 | static inline void chVTSetI(virtual_timer_t *vtp, sysinterval_t delay, | ||
856 | vtfunc_t vtfunc, void *par) { | ||
857 | chVTResetI(vtp); | ||
858 | chVTDoSetI(vtp, delay, vtfunc, par); | ||
859 | } | ||
860 | static inline void chVTSet(virtual_timer_t *vtp, sysinterval_t delay, | ||
861 | vtfunc_t vtfunc, void *par) { | ||
862 | chSysLock(); | ||
863 | chVTSetI(vtp, delay, vtfunc, par); | ||
864 | chSysUnlock(); | ||
865 | } | ||
866 | static inline void chVTDoTickI(void) { | ||
867 | chDbgCheckClassI(); | ||
868 | ch.vtlist.systime++; | ||
869 | if (&ch.vtlist != (virtual_timers_list_t *)ch.vtlist.next) { | ||
870 | --ch.vtlist.next->delta; | ||
871 | while (ch.vtlist.next->delta == (sysinterval_t)0) { | ||
872 | virtual_timer_t *vtp; | ||
873 | vtfunc_t fn; | ||
874 | vtp = ch.vtlist.next; | ||
875 | fn = vtp->func; | ||
876 | vtp->func = NULL; | ||
877 | vtp->next->prev = (virtual_timer_t *)&ch.vtlist; | ||
878 | ch.vtlist.next = vtp->next; | ||
879 | chSysUnlockFromISR(); | ||
880 | fn(vtp->par); | ||
881 | chSysLockFromISR(); | ||
882 | } | ||
883 | } | ||
884 | } | ||
885 | #define CHTHREADS_H | ||
886 | typedef void (*tfunc_t)(void *p); | ||
887 | typedef struct { | ||
888 | const char *name; | ||
889 | stkalign_t *wbase; | ||
890 | stkalign_t *wend; | ||
891 | tprio_t prio; | ||
892 | tfunc_t funcp; | ||
893 | void *arg; | ||
894 | } thread_descriptor_t; | ||
895 | #define _THREADS_QUEUE_DATA(name) {(thread_t *)&name, (thread_t *)&name} | ||
896 | #define _THREADS_QUEUE_DECL(name) threads_queue_t name = _THREADS_QUEUE_DATA(name) | ||
897 | #define THD_WORKING_AREA_SIZE(n) MEM_ALIGN_NEXT(sizeof(thread_t) + PORT_WA_SIZE(n), PORT_STACK_ALIGN) | ||
898 | #define THD_WORKING_AREA(s,n) PORT_WORKING_AREA(s, n) | ||
899 | #define THD_WORKING_AREA_BASE(s) ((stkalign_t *)(s)) | ||
900 | #define THD_WORKING_AREA_END(s) (THD_WORKING_AREA_BASE(s) + (sizeof (s) / sizeof (stkalign_t))) | ||
901 | #define THD_FUNCTION(tname,arg) PORT_THD_FUNCTION(tname, arg) | ||
902 | #define chThdSleepSeconds(sec) chThdSleep(TIME_S2I(sec)) | ||
903 | #define chThdSleepMilliseconds(msec) chThdSleep(TIME_MS2I(msec)) | ||
904 | #define chThdSleepMicroseconds(usec) chThdSleep(TIME_US2I(usec)) | ||
905 | thread_t *_thread_init(thread_t *tp, const char *name, tprio_t prio); | ||
906 | thread_t *chThdCreateSuspendedI(const thread_descriptor_t *tdp); | ||
907 | thread_t *chThdCreateSuspended(const thread_descriptor_t *tdp); | ||
908 | thread_t *chThdCreateI(const thread_descriptor_t *tdp); | ||
909 | thread_t *chThdCreate(const thread_descriptor_t *tdp); | ||
910 | thread_t *chThdCreateStatic(void *wsp, size_t size, | ||
911 | tprio_t prio, tfunc_t pf, void *arg); | ||
912 | thread_t *chThdStart(thread_t *tp); | ||
913 | thread_t *chThdAddRef(thread_t *tp); | ||
914 | void chThdRelease(thread_t *tp); | ||
915 | void chThdExit(msg_t msg); | ||
916 | void chThdExitS(msg_t msg); | ||
917 | msg_t chThdWait(thread_t *tp); | ||
918 | tprio_t chThdSetPriority(tprio_t newprio); | ||
919 | void chThdTerminate(thread_t *tp); | ||
920 | msg_t chThdSuspendS(thread_reference_t *trp); | ||
921 | msg_t chThdSuspendTimeoutS(thread_reference_t *trp, sysinterval_t timeout); | ||
922 | void chThdResumeI(thread_reference_t *trp, msg_t msg); | ||
923 | void chThdResumeS(thread_reference_t *trp, msg_t msg); | ||
924 | void chThdResume(thread_reference_t *trp, msg_t msg); | ||
925 | msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, sysinterval_t timeout); | ||
926 | void chThdDequeueNextI(threads_queue_t *tqp, msg_t msg); | ||
927 | void chThdDequeueAllI(threads_queue_t *tqp, msg_t msg); | ||
928 | void chThdSleep(sysinterval_t time); | ||
929 | void chThdSleepUntil(systime_t time); | ||
930 | systime_t chThdSleepUntilWindowed(systime_t prev, systime_t next); | ||
931 | void chThdYield(void); | ||
932 | static inline thread_t *chThdGetSelfX(void) { | ||
933 | return ch.rlist.current; | ||
934 | } | ||
935 | static inline tprio_t chThdGetPriorityX(void) { | ||
936 | return chThdGetSelfX()->prio; | ||
937 | } | ||
938 | static inline stkalign_t *chThdGetWorkingAreaX(thread_t *tp) { | ||
939 | return tp->wabase; | ||
940 | } | ||
941 | static inline bool chThdTerminatedX(thread_t *tp) { | ||
942 | return (bool)(tp->state == CH_STATE_FINAL); | ||
943 | } | ||
944 | static inline bool chThdShouldTerminateX(void) { | ||
945 | return (bool)((chThdGetSelfX()->flags & CH_FLAG_TERMINATE) != (tmode_t)0); | ||
946 | } | ||
947 | static inline thread_t *chThdStartI(thread_t *tp) { | ||
948 | chDbgAssert(tp->state == CH_STATE_WTSTART, "wrong state"); | ||
949 | return chSchReadyI(tp); | ||
950 | } | ||
951 | static inline void chThdSleepS(sysinterval_t ticks) { | ||
952 | chDbgCheck(ticks != TIME_IMMEDIATE); | ||
953 | (void) chSchGoSleepTimeoutS(CH_STATE_SLEEPING, ticks); | ||
954 | } | ||
955 | static inline void chThdQueueObjectInit(threads_queue_t *tqp) { | ||
956 | queue_init(tqp); | ||
957 | } | ||
958 | static inline bool chThdQueueIsEmptyI(threads_queue_t *tqp) { | ||
959 | chDbgCheckClassI(); | ||
960 | return queue_isempty(tqp); | ||
961 | } | ||
962 | static inline void chThdDoDequeueNextI(threads_queue_t *tqp, msg_t msg) { | ||
963 | thread_t *tp; | ||
964 | chDbgAssert(queue_notempty(tqp), "empty queue"); | ||
965 | tp = queue_fifo_remove(tqp); | ||
966 | chDbgAssert(tp->state == CH_STATE_QUEUED, "invalid state"); | ||
967 | tp->u.rdymsg = msg; | ||
968 | (void) chSchReadyI(tp); | ||
969 | } | ||
970 | #define CHREGISTRY_H | ||
971 | typedef struct { | ||
972 | char identifier[4]; | ||
973 | uint8_t zero; | ||
974 | uint8_t size; | ||
975 | uint16_t version; | ||
976 | uint8_t ptrsize; | ||
977 | uint8_t timesize; | ||
978 | uint8_t threadsize; | ||
979 | uint8_t off_prio; | ||
980 | uint8_t off_ctx; | ||
981 | uint8_t off_newer; | ||
982 | uint8_t off_older; | ||
983 | uint8_t off_name; | ||
984 | uint8_t off_stklimit; | ||
985 | uint8_t off_state; | ||
986 | uint8_t off_flags; | ||
987 | uint8_t off_refs; | ||
988 | uint8_t off_preempt; | ||
989 | uint8_t off_time; | ||
990 | } chdebug_t; | ||
991 | #define REG_REMOVE(tp) { (tp)->older->newer = (tp)->newer; (tp)->newer->older = (tp)->older; } | ||
992 | #define REG_INSERT(tp) { (tp)->newer = (thread_t *)&ch.rlist; (tp)->older = ch.rlist.older; (tp)->older->newer = (tp); ch.rlist.older = (tp); } | ||
993 | extern ROMCONST chdebug_t ch_debug; | ||
994 | thread_t *chRegFirstThread(void); | ||
995 | thread_t *chRegNextThread(thread_t *tp); | ||
996 | thread_t *chRegFindThreadByName(const char *name); | ||
997 | thread_t *chRegFindThreadByPointer(thread_t *tp); | ||
998 | thread_t *chRegFindThreadByWorkingArea(stkalign_t *wa); | ||
999 | static inline void chRegSetThreadName(const char *name) { | ||
1000 | ch.rlist.current->name = name; | ||
1001 | } | ||
1002 | static inline const char *chRegGetThreadNameX(thread_t *tp) { | ||
1003 | return tp->name; | ||
1004 | } | ||
1005 | static inline void chRegSetThreadNameX(thread_t *tp, const char *name) { | ||
1006 | tp->name = name; | ||
1007 | } | ||
1008 | #define CHSEM_H | ||
1009 | typedef struct ch_semaphore { | ||
1010 | threads_queue_t queue; | ||
1011 | cnt_t cnt; | ||
1012 | } semaphore_t; | ||
1013 | #define _SEMAPHORE_DATA(name,n) {_THREADS_QUEUE_DATA(name.queue), n} | ||
1014 | #define SEMAPHORE_DECL(name,n) semaphore_t name = _SEMAPHORE_DATA(name, n) | ||
1015 | void chSemObjectInit(semaphore_t *sp, cnt_t n); | ||
1016 | void chSemReset(semaphore_t *sp, cnt_t n); | ||
1017 | void chSemResetI(semaphore_t *sp, cnt_t n); | ||
1018 | msg_t chSemWait(semaphore_t *sp); | ||
1019 | msg_t chSemWaitS(semaphore_t *sp); | ||
1020 | msg_t chSemWaitTimeout(semaphore_t *sp, sysinterval_t timeout); | ||
1021 | msg_t chSemWaitTimeoutS(semaphore_t *sp, sysinterval_t timeout); | ||
1022 | void chSemSignal(semaphore_t *sp); | ||
1023 | void chSemSignalI(semaphore_t *sp); | ||
1024 | void chSemAddCounterI(semaphore_t *sp, cnt_t n); | ||
1025 | msg_t chSemSignalWait(semaphore_t *sps, semaphore_t *spw); | ||
1026 | static inline void chSemFastWaitI(semaphore_t *sp) { | ||
1027 | chDbgCheckClassI(); | ||
1028 | sp->cnt--; | ||
1029 | } | ||
1030 | static inline void chSemFastSignalI(semaphore_t *sp) { | ||
1031 | chDbgCheckClassI(); | ||
1032 | sp->cnt++; | ||
1033 | } | ||
1034 | static inline cnt_t chSemGetCounterI(const semaphore_t *sp) { | ||
1035 | chDbgCheckClassI(); | ||
1036 | return sp->cnt; | ||
1037 | } | ||
1038 | #define CHMTX_H | ||
1039 | typedef struct ch_mutex mutex_t; | ||
1040 | struct ch_mutex { | ||
1041 | threads_queue_t queue; | ||
1042 | thread_t *owner; | ||
1043 | mutex_t *next; | ||
1044 | }; | ||
1045 | #define _MUTEX_DATA(name) {_THREADS_QUEUE_DATA(name.queue), NULL, NULL} | ||
1046 | #define MUTEX_DECL(name) mutex_t name = _MUTEX_DATA(name) | ||
1047 | void chMtxObjectInit(mutex_t *mp); | ||
1048 | void chMtxLock(mutex_t *mp); | ||
1049 | void chMtxLockS(mutex_t *mp); | ||
1050 | bool chMtxTryLock(mutex_t *mp); | ||
1051 | bool chMtxTryLockS(mutex_t *mp); | ||
1052 | void chMtxUnlock(mutex_t *mp); | ||
1053 | void chMtxUnlockS(mutex_t *mp); | ||
1054 | void chMtxUnlockAll(void); | ||
1055 | void chMtxUnlockAllS(void); | ||
1056 | static inline bool chMtxQueueNotEmptyS(mutex_t *mp) { | ||
1057 | chDbgCheckClassS(); | ||
1058 | return queue_notempty(&mp->queue); | ||
1059 | } | ||
1060 | static inline thread_t *chMtxGetOwnerI(mutex_t *mp) { | ||
1061 | chDbgCheckClassI(); | ||
1062 | return mp->owner; | ||
1063 | } | ||
1064 | static inline mutex_t *chMtxGetNextMutexX(void) { | ||
1065 | return chThdGetSelfX()->mtxlist; | ||
1066 | } | ||
1067 | #define CHCOND_H | ||
1068 | typedef struct condition_variable { | ||
1069 | threads_queue_t queue; | ||
1070 | } condition_variable_t; | ||
1071 | #define _CONDVAR_DATA(name) {_THREADS_QUEUE_DATA(name.queue)} | ||
1072 | #define CONDVAR_DECL(name) condition_variable_t name = _CONDVAR_DATA(name) | ||
1073 | void chCondObjectInit(condition_variable_t *cp); | ||
1074 | void chCondSignal(condition_variable_t *cp); | ||
1075 | void chCondSignalI(condition_variable_t *cp); | ||
1076 | void chCondBroadcast(condition_variable_t *cp); | ||
1077 | void chCondBroadcastI(condition_variable_t *cp); | ||
1078 | msg_t chCondWait(condition_variable_t *cp); | ||
1079 | msg_t chCondWaitS(condition_variable_t *cp); | ||
1080 | msg_t chCondWaitTimeout(condition_variable_t *cp, sysinterval_t timeout); | ||
1081 | msg_t chCondWaitTimeoutS(condition_variable_t *cp, sysinterval_t timeout); | ||
1082 | #define CHEVENTS_H | ||
1083 | typedef struct event_listener event_listener_t; | ||
1084 | struct event_listener { | ||
1085 | event_listener_t *next; | ||
1086 | thread_t *listener; | ||
1087 | eventmask_t events; | ||
1088 | eventflags_t flags; | ||
1089 | eventflags_t wflags; | ||
1090 | }; | ||
1091 | typedef struct event_source { | ||
1092 | event_listener_t *next; | ||
1093 | } event_source_t; | ||
1094 | typedef void (*evhandler_t)(eventid_t id); | ||
1095 | #define ALL_EVENTS ((eventmask_t)-1) | ||
1096 | #define EVENT_MASK(eid) ((eventmask_t)1 << (eventmask_t)(eid)) | ||
1097 | #define _EVENTSOURCE_DATA(name) {(event_listener_t *)(&name)} | ||
1098 | #define EVENTSOURCE_DECL(name) event_source_t name = _EVENTSOURCE_DATA(name) | ||
1099 | void chEvtRegisterMaskWithFlags(event_source_t *esp, | ||
1100 | event_listener_t *elp, | ||
1101 | eventmask_t events, | ||
1102 | eventflags_t wflags); | ||
1103 | void chEvtUnregister(event_source_t *esp, event_listener_t *elp); | ||
1104 | eventmask_t chEvtGetAndClearEventsI(eventmask_t events); | ||
1105 | eventmask_t chEvtGetAndClearEvents(eventmask_t events); | ||
1106 | eventmask_t chEvtAddEvents(eventmask_t events); | ||
1107 | eventflags_t chEvtGetAndClearFlags(event_listener_t *elp); | ||
1108 | eventflags_t chEvtGetAndClearFlagsI(event_listener_t *elp); | ||
1109 | void chEvtSignal(thread_t *tp, eventmask_t events); | ||
1110 | void chEvtSignalI(thread_t *tp, eventmask_t events); | ||
1111 | void chEvtBroadcastFlags(event_source_t *esp, eventflags_t flags); | ||
1112 | void chEvtBroadcastFlagsI(event_source_t *esp, eventflags_t flags); | ||
1113 | void chEvtDispatch(const evhandler_t *handlers, eventmask_t events); | ||
1114 | eventmask_t chEvtWaitOne(eventmask_t events); | ||
1115 | eventmask_t chEvtWaitAny(eventmask_t events); | ||
1116 | eventmask_t chEvtWaitAll(eventmask_t events); | ||
1117 | eventmask_t chEvtWaitOneTimeout(eventmask_t events, sysinterval_t timeout); | ||
1118 | eventmask_t chEvtWaitAnyTimeout(eventmask_t events, sysinterval_t timeout); | ||
1119 | eventmask_t chEvtWaitAllTimeout(eventmask_t events, sysinterval_t timeout); | ||
1120 | static inline void chEvtObjectInit(event_source_t *esp) { | ||
1121 | esp->next = (event_listener_t *)esp; | ||
1122 | } | ||
1123 | static inline void chEvtRegisterMask(event_source_t *esp, | ||
1124 | event_listener_t *elp, | ||
1125 | eventmask_t events) { | ||
1126 | chEvtRegisterMaskWithFlags(esp, elp, events, (eventflags_t)-1); | ||
1127 | } | ||
1128 | static inline void chEvtRegister(event_source_t *esp, | ||
1129 | event_listener_t *elp, | ||
1130 | eventid_t event) { | ||
1131 | chEvtRegisterMask(esp, elp, EVENT_MASK(event)); | ||
1132 | } | ||
1133 | static inline bool chEvtIsListeningI(event_source_t *esp) { | ||
1134 | return (bool)(esp != (event_source_t *)esp->next); | ||
1135 | } | ||
1136 | static inline void chEvtBroadcast(event_source_t *esp) { | ||
1137 | chEvtBroadcastFlags(esp, (eventflags_t)0); | ||
1138 | } | ||
1139 | static inline void chEvtBroadcastI(event_source_t *esp) { | ||
1140 | chEvtBroadcastFlagsI(esp, (eventflags_t)0); | ||
1141 | } | ||
1142 | static inline eventmask_t chEvtAddEventsI(eventmask_t events) { | ||
1143 | return currp->epending |= events; | ||
1144 | } | ||
1145 | static inline eventmask_t chEvtGetEventsX(void) { | ||
1146 | return currp->epending; | ||
1147 | } | ||
1148 | #define CHMSG_H | ||
1149 | msg_t chMsgSend(thread_t *tp, msg_t msg); | ||
1150 | thread_t * chMsgWait(void); | ||
1151 | void chMsgRelease(thread_t *tp, msg_t msg); | ||
1152 | static inline bool chMsgIsPendingI(thread_t *tp) { | ||
1153 | chDbgCheckClassI(); | ||
1154 | return (bool)(tp->msgqueue.next != (thread_t *)&tp->msgqueue); | ||
1155 | } | ||
1156 | static inline msg_t chMsgGet(thread_t *tp) { | ||
1157 | chDbgAssert(tp->state == CH_STATE_SNDMSG, "invalid state"); | ||
1158 | return tp->u.sentmsg; | ||
1159 | } | ||
1160 | static inline void chMsgReleaseS(thread_t *tp, msg_t msg) { | ||
1161 | chDbgCheckClassS(); | ||
1162 | chSchWakeupS(tp, msg); | ||
1163 | } | ||
1164 | #define CHLIB_H | ||
1165 | #define _CHIBIOS_OSLIB_ | ||
1166 | #define CH_OSLIB_STABLE 0 | ||
1167 | #define CH_OSLIB_VERSION "1.1.0" | ||
1168 | #define CH_OSLIB_MAJOR 1 | ||
1169 | #define CH_OSLIB_MINOR 1 | ||
1170 | #define CH_OSLIB_PATCH 0 | ||
1171 | #define CHBSEM_H | ||
1172 | typedef struct ch_binary_semaphore { | ||
1173 | semaphore_t sem; | ||
1174 | } binary_semaphore_t; | ||
1175 | #define _BSEMAPHORE_DATA(name,taken) {_SEMAPHORE_DATA(name.sem, ((taken) ? 0 : 1))} | ||
1176 | #define BSEMAPHORE_DECL(name,taken) binary_semaphore_t name = _BSEMAPHORE_DATA(name, taken) | ||
1177 | static inline void chBSemObjectInit(binary_semaphore_t *bsp, bool taken) { | ||
1178 | chSemObjectInit(&bsp->sem, taken ? (cnt_t)0 : (cnt_t)1); | ||
1179 | } | ||
1180 | static inline msg_t chBSemWait(binary_semaphore_t *bsp) { | ||
1181 | return chSemWait(&bsp->sem); | ||
1182 | } | ||
1183 | static inline msg_t chBSemWaitS(binary_semaphore_t *bsp) { | ||
1184 | chDbgCheckClassS(); | ||
1185 | return chSemWaitS(&bsp->sem); | ||
1186 | } | ||
1187 | static inline msg_t chBSemWaitTimeoutS(binary_semaphore_t *bsp, | ||
1188 | sysinterval_t timeout) { | ||
1189 | chDbgCheckClassS(); | ||
1190 | return chSemWaitTimeoutS(&bsp->sem, timeout); | ||
1191 | } | ||
1192 | static inline msg_t chBSemWaitTimeout(binary_semaphore_t *bsp, | ||
1193 | sysinterval_t timeout) { | ||
1194 | return chSemWaitTimeout(&bsp->sem, timeout); | ||
1195 | } | ||
1196 | static inline void chBSemResetI(binary_semaphore_t *bsp, bool taken) { | ||
1197 | chDbgCheckClassI(); | ||
1198 | chSemResetI(&bsp->sem, taken ? (cnt_t)0 : (cnt_t)1); | ||
1199 | } | ||
1200 | static inline void chBSemReset(binary_semaphore_t *bsp, bool taken) { | ||
1201 | chSemReset(&bsp->sem, taken ? (cnt_t)0 : (cnt_t)1); | ||
1202 | } | ||
1203 | static inline void chBSemSignalI(binary_semaphore_t *bsp) { | ||
1204 | chDbgCheckClassI(); | ||
1205 | if (bsp->sem.cnt < (cnt_t)1) { | ||
1206 | chSemSignalI(&bsp->sem); | ||
1207 | } | ||
1208 | } | ||
1209 | static inline void chBSemSignal(binary_semaphore_t *bsp) { | ||
1210 | chSysLock(); | ||
1211 | chBSemSignalI(bsp); | ||
1212 | chSchRescheduleS(); | ||
1213 | chSysUnlock(); | ||
1214 | } | ||
1215 | static inline bool chBSemGetStateI(const binary_semaphore_t *bsp) { | ||
1216 | chDbgCheckClassI(); | ||
1217 | return (bsp->sem.cnt > (cnt_t)0) ? false : true; | ||
1218 | } | ||
1219 | #define CHMBOXES_H | ||
1220 | typedef struct { | ||
1221 | msg_t *buffer; | ||
1222 | msg_t *top; | ||
1223 | msg_t *wrptr; | ||
1224 | msg_t *rdptr; | ||
1225 | size_t cnt; | ||
1226 | bool reset; | ||
1227 | threads_queue_t qw; | ||
1228 | threads_queue_t qr; | ||
1229 | } mailbox_t; | ||
1230 | #define _MAILBOX_DATA(name,buffer,size) { (msg_t *)(buffer), (msg_t *)(buffer) + size, (msg_t *)(buffer), (msg_t *)(buffer), (size_t)0, false, _THREADS_QUEUE_DATA(name.qw), _THREADS_QUEUE_DATA(name.qr), } | ||
1231 | #define MAILBOX_DECL(name,buffer,size) mailbox_t name = _MAILBOX_DATA(name, buffer, size) | ||
1232 | void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n); | ||
1233 | void chMBReset(mailbox_t *mbp); | ||
1234 | void chMBResetI(mailbox_t *mbp); | ||
1235 | msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); | ||
1236 | msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); | ||
1237 | msg_t chMBPostI(mailbox_t *mbp, msg_t msg); | ||
1238 | msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); | ||
1239 | msg_t chMBPostAheadTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); | ||
1240 | msg_t chMBPostAheadI(mailbox_t *mbp, msg_t msg); | ||
1241 | msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout); | ||
1242 | msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout); | ||
1243 | msg_t chMBFetchI(mailbox_t *mbp, msg_t *msgp); | ||
1244 | static inline size_t chMBGetSizeI(const mailbox_t *mbp) { | ||
1245 | return (size_t)(mbp->top - mbp->buffer); | ||
1246 | } | ||
1247 | static inline size_t chMBGetUsedCountI(const mailbox_t *mbp) { | ||
1248 | chDbgCheckClassI(); | ||
1249 | return mbp->cnt; | ||
1250 | } | ||
1251 | static inline size_t chMBGetFreeCountI(const mailbox_t *mbp) { | ||
1252 | chDbgCheckClassI(); | ||
1253 | return chMBGetSizeI(mbp) - chMBGetUsedCountI(mbp); | ||
1254 | } | ||
1255 | static inline msg_t chMBPeekI(const mailbox_t *mbp) { | ||
1256 | chDbgCheckClassI(); | ||
1257 | return *mbp->rdptr; | ||
1258 | } | ||
1259 | static inline void chMBResumeX(mailbox_t *mbp) { | ||
1260 | mbp->reset = false; | ||
1261 | } | ||
1262 | #define CHMEMCORE_H | ||
1263 | typedef void *(*memgetfunc_t)(size_t size, unsigned align); | ||
1264 | typedef void *(*memgetfunc2_t)(size_t size, unsigned align, size_t offset); | ||
1265 | typedef struct { | ||
1266 | uint8_t *basemem; | ||
1267 | uint8_t *topmem; | ||
1268 | } memcore_t; | ||
1269 | #define chCoreAllocAlignedWithOffsetI chCoreAllocFromTopI | ||
1270 | #define chCoreAllocAlignedWithOffset chCoreAllocFromTop | ||
1271 | extern memcore_t ch_memcore; | ||
1272 | void _core_init(void); | ||
1273 | void *chCoreAllocFromBaseI(size_t size, unsigned align, size_t offset); | ||
1274 | void *chCoreAllocFromTopI(size_t size, unsigned align, size_t offset); | ||
1275 | void *chCoreAllocFromBase(size_t size, unsigned align, size_t offset); | ||
1276 | void *chCoreAllocFromTop(size_t size, unsigned align, size_t offset); | ||
1277 | size_t chCoreGetStatusX(void); | ||
1278 | static inline void *chCoreAllocAlignedI(size_t size, unsigned align) { | ||
1279 | return chCoreAllocAlignedWithOffsetI(size, align, 0U); | ||
1280 | } | ||
1281 | static inline void *chCoreAllocAligned(size_t size, unsigned align) { | ||
1282 | return chCoreAllocAlignedWithOffset(size, align, 0U); | ||
1283 | } | ||
1284 | static inline void *chCoreAllocI(size_t size) { | ||
1285 | return chCoreAllocAlignedWithOffsetI(size, PORT_NATURAL_ALIGN, 0U); | ||
1286 | } | ||
1287 | static inline void *chCoreAlloc(size_t size) { | ||
1288 | return chCoreAllocAlignedWithOffset(size, PORT_NATURAL_ALIGN, 0U); | ||
1289 | } | ||
1290 | #define CHMEMHEAPS_H | ||
1291 | #define CH_HEAP_ALIGNMENT 8U | ||
1292 | typedef struct memory_heap memory_heap_t; | ||
1293 | typedef union heap_header heap_header_t; | ||
1294 | union heap_header { | ||
1295 | struct { | ||
1296 | heap_header_t *next; | ||
1297 | size_t pages; | ||
1298 | } free; | ||
1299 | struct { | ||
1300 | memory_heap_t *heap; | ||
1301 | size_t size; | ||
1302 | } used; | ||
1303 | }; | ||
1304 | struct memory_heap { | ||
1305 | memgetfunc2_t provider; | ||
1306 | heap_header_t header; | ||
1307 | mutex_t mtx; | ||
1308 | }; | ||
1309 | #define CH_HEAP_AREA(name,size) ALIGNED_VAR(CH_HEAP_ALIGNMENT) uint8_t name[MEM_ALIGN_NEXT((size), CH_HEAP_ALIGNMENT)] | ||
1310 | void _heap_init(void); | ||
1311 | void chHeapObjectInit(memory_heap_t *heapp, void *buf, size_t size); | ||
1312 | void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align); | ||
1313 | void chHeapFree(void *p); | ||
1314 | size_t chHeapStatus(memory_heap_t *heapp, size_t *totalp, size_t *largestp); | ||
1315 | static inline void *chHeapAlloc(memory_heap_t *heapp, size_t size) { | ||
1316 | return chHeapAllocAligned(heapp, size, CH_HEAP_ALIGNMENT); | ||
1317 | } | ||
1318 | static inline size_t chHeapGetSize(const void *p) { | ||
1319 | return ((heap_header_t *)p - 1U)->used.size; | ||
1320 | } | ||
1321 | #define CHMEMPOOLS_H | ||
1322 | struct pool_header { | ||
1323 | struct pool_header *next; | ||
1324 | }; | ||
1325 | typedef struct { | ||
1326 | struct pool_header *next; | ||
1327 | size_t object_size; | ||
1328 | unsigned align; | ||
1329 | memgetfunc_t provider; | ||
1330 | } memory_pool_t; | ||
1331 | typedef struct { | ||
1332 | semaphore_t sem; | ||
1333 | memory_pool_t pool; | ||
1334 | } guarded_memory_pool_t; | ||
1335 | #define _MEMORYPOOL_DATA(name,size,align,provider) {NULL, size, align, provider} | ||
1336 | #define MEMORYPOOL_DECL(name,size,align,provider) memory_pool_t name = _MEMORYPOOL_DATA(name, size, align, provider) | ||
1337 | #define _GUARDEDMEMORYPOOL_DATA(name,size,align) { _SEMAPHORE_DATA(name.sem, (cnt_t)0), _MEMORYPOOL_DATA(NULL, size, align, NULL) } | ||
1338 | #define GUARDEDMEMORYPOOL_DECL(name,size,align) guarded_memory_pool_t name = _GUARDEDMEMORYPOOL_DATA(name, size, align) | ||
1339 | void chPoolObjectInitAligned(memory_pool_t *mp, size_t size, | ||
1340 | unsigned align, memgetfunc_t provider); | ||
1341 | void chPoolLoadArray(memory_pool_t *mp, void *p, size_t n); | ||
1342 | void *chPoolAllocI(memory_pool_t *mp); | ||
1343 | void *chPoolAlloc(memory_pool_t *mp); | ||
1344 | void chPoolFreeI(memory_pool_t *mp, void *objp); | ||
1345 | void chPoolFree(memory_pool_t *mp, void *objp); | ||
1346 | void chGuardedPoolObjectInitAligned(guarded_memory_pool_t *gmp, | ||
1347 | size_t size, | ||
1348 | unsigned align); | ||
1349 | void chGuardedPoolLoadArray(guarded_memory_pool_t *gmp, void *p, size_t n); | ||
1350 | void *chGuardedPoolAllocTimeoutS(guarded_memory_pool_t *gmp, | ||
1351 | sysinterval_t timeout); | ||
1352 | void *chGuardedPoolAllocTimeout(guarded_memory_pool_t *gmp, | ||
1353 | sysinterval_t timeout); | ||
1354 | void chGuardedPoolFree(guarded_memory_pool_t *gmp, void *objp); | ||
1355 | static inline void chPoolObjectInit(memory_pool_t *mp, | ||
1356 | size_t size, | ||
1357 | memgetfunc_t provider) { | ||
1358 | chPoolObjectInitAligned(mp, size, PORT_NATURAL_ALIGN, provider); | ||
1359 | } | ||
1360 | static inline void chPoolAdd(memory_pool_t *mp, void *objp) { | ||
1361 | chPoolFree(mp, objp); | ||
1362 | } | ||
1363 | static inline void chPoolAddI(memory_pool_t *mp, void *objp) { | ||
1364 | chPoolFreeI(mp, objp); | ||
1365 | } | ||
1366 | static inline void chGuardedPoolObjectInit(guarded_memory_pool_t *gmp, | ||
1367 | size_t size) { | ||
1368 | chGuardedPoolObjectInitAligned(gmp, size, PORT_NATURAL_ALIGN); | ||
1369 | } | ||
1370 | static inline cnt_t chGuardedPoolGetCounterI(guarded_memory_pool_t *gmp) { | ||
1371 | return chSemGetCounterI(&gmp->sem); | ||
1372 | } | ||
1373 | static inline void *chGuardedPoolAllocI(guarded_memory_pool_t *gmp) { | ||
1374 | void *p; | ||
1375 | p = chPoolAllocI(&gmp->pool); | ||
1376 | if (p != NULL) { | ||
1377 | chSemFastWaitI(&gmp->sem); | ||
1378 | chDbgAssert(chSemGetCounterI(&gmp->sem) >= (cnt_t)0, | ||
1379 | "semaphore out of sync"); | ||
1380 | } | ||
1381 | return p; | ||
1382 | } | ||
1383 | static inline void chGuardedPoolFreeI(guarded_memory_pool_t *gmp, void *objp) { | ||
1384 | chPoolFreeI(&gmp->pool, objp); | ||
1385 | chSemSignalI(&gmp->sem); | ||
1386 | } | ||
1387 | static inline void chGuardedPoolFreeS(guarded_memory_pool_t *gmp, void *objp) { | ||
1388 | chGuardedPoolFreeI(gmp, objp); | ||
1389 | chSchRescheduleS(); | ||
1390 | } | ||
1391 | static inline void chGuardedPoolAdd(guarded_memory_pool_t *gmp, void *objp) { | ||
1392 | chGuardedPoolFree(gmp, objp); | ||
1393 | } | ||
1394 | static inline void chGuardedPoolAddI(guarded_memory_pool_t *gmp, void *objp) { | ||
1395 | chGuardedPoolFreeI(gmp, objp); | ||
1396 | } | ||
1397 | static inline void chGuardedPoolAddS(guarded_memory_pool_t *gmp, void *objp) { | ||
1398 | chGuardedPoolFreeS(gmp, objp); | ||
1399 | } | ||
1400 | #define CHOBJFIFOS_H | ||
1401 | typedef struct ch_objects_fifo { | ||
1402 | guarded_memory_pool_t free; | ||
1403 | mailbox_t mbx; | ||
1404 | } objects_fifo_t; | ||
1405 | static inline void chFifoObjectInitAligned(objects_fifo_t *ofp, size_t objsize, | ||
1406 | size_t objn, unsigned objalign, | ||
1407 | void *objbuf, msg_t *msgbuf) { | ||
1408 | chDbgCheck((objsize >= objalign) && ((objsize % objalign) == 0U)); | ||
1409 | chGuardedPoolObjectInitAligned(&ofp->free, objsize, objalign); | ||
1410 | chGuardedPoolLoadArray(&ofp->free, objbuf, objn); | ||
1411 | chMBObjectInit(&ofp->mbx, msgbuf, objn); | ||
1412 | } | ||
1413 | static inline void chFifoObjectInit(objects_fifo_t *ofp, size_t objsize, | ||
1414 | size_t objn, void *objbuf, | ||
1415 | msg_t *msgbuf) { | ||
1416 | chFifoObjectInitAligned(ofp, objsize, objn, | ||
1417 | PORT_NATURAL_ALIGN, | ||
1418 | objbuf, msgbuf); | ||
1419 | } | ||
1420 | static inline void *chFifoTakeObjectI(objects_fifo_t *ofp) { | ||
1421 | return chGuardedPoolAllocI(&ofp->free); | ||
1422 | } | ||
1423 | static inline void *chFifoTakeObjectTimeoutS(objects_fifo_t *ofp, | ||
1424 | sysinterval_t timeout) { | ||
1425 | return chGuardedPoolAllocTimeoutS(&ofp->free, timeout); | ||
1426 | } | ||
1427 | static inline void *chFifoTakeObjectTimeout(objects_fifo_t *ofp, | ||
1428 | sysinterval_t timeout) { | ||
1429 | return chGuardedPoolAllocTimeout(&ofp->free, timeout); | ||
1430 | } | ||
1431 | static inline void chFifoReturnObjectI(objects_fifo_t *ofp, | ||
1432 | void *objp) { | ||
1433 | chGuardedPoolFreeI(&ofp->free, objp); | ||
1434 | } | ||
1435 | static inline void chFifoReturnObjectS(objects_fifo_t *ofp, | ||
1436 | void *objp) { | ||
1437 | chGuardedPoolFreeS(&ofp->free, objp); | ||
1438 | } | ||
1439 | static inline void chFifoReturnObject(objects_fifo_t *ofp, | ||
1440 | void *objp) { | ||
1441 | chGuardedPoolFree(&ofp->free, objp); | ||
1442 | } | ||
1443 | static inline void chFifoSendObjectI(objects_fifo_t *ofp, | ||
1444 | void *objp) { | ||
1445 | msg_t msg; | ||
1446 | msg = chMBPostI(&ofp->mbx, (msg_t)objp); | ||
1447 | chDbgAssert(msg == MSG_OK, "post failed"); | ||
1448 | } | ||
1449 | static inline void chFifoSendObjectS(objects_fifo_t *ofp, | ||
1450 | void *objp) { | ||
1451 | msg_t msg; | ||
1452 | msg = chMBPostTimeoutS(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); | ||
1453 | chDbgAssert(msg == MSG_OK, "post failed"); | ||
1454 | } | ||
1455 | static inline void chFifoSendObject(objects_fifo_t *ofp, void *objp) { | ||
1456 | msg_t msg; | ||
1457 | msg = chMBPostTimeout(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); | ||
1458 | chDbgAssert(msg == MSG_OK, "post failed"); | ||
1459 | } | ||
1460 | static inline void chFifoSendObjectAheadI(objects_fifo_t *ofp, | ||
1461 | void *objp) { | ||
1462 | msg_t msg; | ||
1463 | msg = chMBPostAheadI(&ofp->mbx, (msg_t)objp); | ||
1464 | chDbgAssert(msg == MSG_OK, "post failed"); | ||
1465 | } | ||
1466 | static inline void chFifoSendObjectAheadS(objects_fifo_t *ofp, | ||
1467 | void *objp) { | ||
1468 | msg_t msg; | ||
1469 | msg = chMBPostAheadTimeoutS(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); | ||
1470 | chDbgAssert(msg == MSG_OK, "post failed"); | ||
1471 | } | ||
1472 | static inline void chFifoSendObjectAhead(objects_fifo_t *ofp, void *objp) { | ||
1473 | msg_t msg; | ||
1474 | msg = chMBPostAheadTimeout(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); | ||
1475 | chDbgAssert(msg == MSG_OK, "post failed"); | ||
1476 | } | ||
1477 | static inline msg_t chFifoReceiveObjectI(objects_fifo_t *ofp, | ||
1478 | void **objpp) { | ||
1479 | return chMBFetchI(&ofp->mbx, (msg_t *)objpp); | ||
1480 | } | ||
1481 | static inline msg_t chFifoReceiveObjectTimeoutS(objects_fifo_t *ofp, | ||
1482 | void **objpp, | ||
1483 | sysinterval_t timeout) { | ||
1484 | return chMBFetchTimeoutS(&ofp->mbx, (msg_t *)objpp, timeout); | ||
1485 | } | ||
1486 | static inline msg_t chFifoReceiveObjectTimeout(objects_fifo_t *ofp, | ||
1487 | void **objpp, | ||
1488 | sysinterval_t timeout) { | ||
1489 | return chMBFetchTimeout(&ofp->mbx, (msg_t *)objpp, timeout); | ||
1490 | } | ||
1491 | #define CHPIPES_H | ||
1492 | typedef struct { | ||
1493 | uint8_t *buffer; | ||
1494 | uint8_t *top; | ||
1495 | uint8_t *wrptr; | ||
1496 | uint8_t *rdptr; | ||
1497 | size_t cnt; | ||
1498 | bool reset; | ||
1499 | thread_reference_t wtr; | ||
1500 | thread_reference_t rtr; | ||
1501 | mutex_t cmtx; | ||
1502 | mutex_t wmtx; | ||
1503 | mutex_t rmtx; | ||
1504 | } pipe_t; | ||
1505 | #define _PIPE_DATA(name,buffer,size) { (uint8_t *)(buffer), (uint8_t *)(buffer) + size, (uint8_t *)(buffer), (uint8_t *)(buffer), (size_t)0, false, NULL, NULL, _MUTEX_DATA(name.cmtx), _MUTEX_DATA(name.wmtx), _MUTEX_DATA(name.rmtx), } | ||
1506 | #define PIPE_DECL(name,buffer,size) pipe_t name = _PIPE_DATA(name, buffer, size) | ||
1507 | void chPipeObjectInit(pipe_t *pp, uint8_t *buf, size_t n); | ||
1508 | void chPipeReset(pipe_t *pp); | ||
1509 | size_t chPipeWriteTimeout(pipe_t *pp, const uint8_t *bp, | ||
1510 | size_t n, sysinterval_t timeout); | ||
1511 | size_t chPipeReadTimeout(pipe_t *pp, uint8_t *bp, | ||
1512 | size_t n, sysinterval_t timeout); | ||
1513 | static inline size_t chPipeGetSize(const pipe_t *pp) { | ||
1514 | return (size_t)(pp->top - pp->buffer); | ||
1515 | } | ||
1516 | static inline size_t chPipeGetUsedCount(const pipe_t *pp) { | ||
1517 | return pp->cnt; | ||
1518 | } | ||
1519 | static inline size_t chPipeGetFreeCount(const pipe_t *pp) { | ||
1520 | return chPipeGetSize(pp) - chPipeGetUsedCount(pp); | ||
1521 | } | ||
1522 | static inline void chPipeResume(pipe_t *pp) { | ||
1523 | pp->reset = false; | ||
1524 | } | ||
1525 | #define CHFACTORY_H | ||
1526 | #define CH_FACTORY_REQUIRES_POOLS ((CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || (CH_CFG_FACTORY_SEMAPHORES == TRUE)) | ||
1527 | #define CH_FACTORY_REQUIRES_HEAP ((CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || (CH_CFG_FACTORY_MAILBOXES == TRUE) || (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || (CH_CFG_FACTORY_PIPES == TRUE)) | ||
1528 | typedef struct ch_dyn_element { | ||
1529 | struct ch_dyn_element *next; | ||
1530 | ucnt_t refs; | ||
1531 | char name[CH_CFG_FACTORY_MAX_NAMES_LENGTH]; | ||
1532 | } dyn_element_t; | ||
1533 | typedef struct ch_dyn_list { | ||
1534 | dyn_element_t *next; | ||
1535 | } dyn_list_t; | ||
1536 | typedef struct ch_registered_static_object { | ||
1537 | dyn_element_t element; | ||
1538 | void *objp; | ||
1539 | } registered_object_t; | ||
1540 | typedef struct ch_dyn_object { | ||
1541 | dyn_element_t element; | ||
1542 | uint8_t buffer[]; | ||
1543 | } dyn_buffer_t; | ||
1544 | typedef struct ch_dyn_semaphore { | ||
1545 | dyn_element_t element; | ||
1546 | semaphore_t sem; | ||
1547 | } dyn_semaphore_t; | ||
1548 | typedef struct ch_dyn_mailbox { | ||
1549 | dyn_element_t element; | ||
1550 | mailbox_t mbx; | ||
1551 | msg_t msgbuf[]; | ||
1552 | } dyn_mailbox_t; | ||
1553 | typedef struct ch_dyn_objects_fifo { | ||
1554 | dyn_element_t element; | ||
1555 | objects_fifo_t fifo; | ||
1556 | msg_t msgbuf[]; | ||
1557 | } dyn_objects_fifo_t; | ||
1558 | typedef struct ch_dyn_pipe { | ||
1559 | dyn_element_t element; | ||
1560 | pipe_t pipe; | ||
1561 | uint8_t buffer[]; | ||
1562 | } dyn_pipe_t; | ||
1563 | typedef struct ch_objects_factory { | ||
1564 | mutex_t mtx; | ||
1565 | dyn_list_t obj_list; | ||
1566 | memory_pool_t obj_pool; | ||
1567 | dyn_list_t buf_list; | ||
1568 | dyn_list_t sem_list; | ||
1569 | memory_pool_t sem_pool; | ||
1570 | dyn_list_t mbx_list; | ||
1571 | dyn_list_t fifo_list; | ||
1572 | dyn_list_t pipe_list; | ||
1573 | } objects_factory_t; | ||
1574 | extern objects_factory_t ch_factory; | ||
1575 | void _factory_init(void); | ||
1576 | registered_object_t *chFactoryRegisterObject(const char *name, | ||
1577 | void *objp); | ||
1578 | registered_object_t *chFactoryFindObject(const char *name); | ||
1579 | registered_object_t *chFactoryFindObjectByPointer(void *objp); | ||
1580 | void chFactoryReleaseObject(registered_object_t *rop); | ||
1581 | dyn_buffer_t *chFactoryCreateBuffer(const char *name, size_t size); | ||
1582 | dyn_buffer_t *chFactoryFindBuffer(const char *name); | ||
1583 | void chFactoryReleaseBuffer(dyn_buffer_t *dbp); | ||
1584 | dyn_semaphore_t *chFactoryCreateSemaphore(const char *name, cnt_t n); | ||
1585 | dyn_semaphore_t *chFactoryFindSemaphore(const char *name); | ||
1586 | void chFactoryReleaseSemaphore(dyn_semaphore_t *dsp); | ||
1587 | dyn_mailbox_t *chFactoryCreateMailbox(const char *name, size_t n); | ||
1588 | dyn_mailbox_t *chFactoryFindMailbox(const char *name); | ||
1589 | void chFactoryReleaseMailbox(dyn_mailbox_t *dmp); | ||
1590 | dyn_objects_fifo_t *chFactoryCreateObjectsFIFO(const char *name, | ||
1591 | size_t objsize, | ||
1592 | size_t objn, | ||
1593 | unsigned objalign); | ||
1594 | dyn_objects_fifo_t *chFactoryFindObjectsFIFO(const char *name); | ||
1595 | void chFactoryReleaseObjectsFIFO(dyn_objects_fifo_t *dofp); | ||
1596 | dyn_pipe_t *chFactoryCreatePipe(const char *name, size_t size); | ||
1597 | dyn_pipe_t *chFactoryFindPipe(const char *name); | ||
1598 | void chFactoryReleasePipe(dyn_pipe_t *dpp); | ||
1599 | static inline dyn_element_t *chFactoryDuplicateReference(dyn_element_t *dep) { | ||
1600 | dep->refs++; | ||
1601 | return dep; | ||
1602 | } | ||
1603 | static inline void *chFactoryGetObject(registered_object_t *rop) { | ||
1604 | return rop->objp; | ||
1605 | } | ||
1606 | static inline size_t chFactoryGetBufferSize(dyn_buffer_t *dbp) { | ||
1607 | return chHeapGetSize(dbp) - sizeof (dyn_element_t); | ||
1608 | } | ||
1609 | static inline uint8_t *chFactoryGetBuffer(dyn_buffer_t *dbp) { | ||
1610 | return dbp->buffer; | ||
1611 | } | ||
1612 | static inline semaphore_t *chFactoryGetSemaphore(dyn_semaphore_t *dsp) { | ||
1613 | return &dsp->sem; | ||
1614 | } | ||
1615 | static inline mailbox_t *chFactoryGetMailbox(dyn_mailbox_t *dmp) { | ||
1616 | return &dmp->mbx; | ||
1617 | } | ||
1618 | static inline objects_fifo_t *chFactoryGetObjectsFIFO(dyn_objects_fifo_t *dofp) { | ||
1619 | return &dofp->fifo; | ||
1620 | } | ||
1621 | static inline pipe_t *chFactoryGetPipe(dyn_pipe_t *dpp) { | ||
1622 | return &dpp->pipe; | ||
1623 | } | ||
1624 | #define CHDYNAMIC_H | ||
1625 | thread_t *chThdCreateFromHeap(memory_heap_t *heapp, size_t size, | ||
1626 | const char *name, tprio_t prio, | ||
1627 | tfunc_t pf, void *arg); | ||
1628 | thread_t *chThdCreateFromMemoryPool(memory_pool_t *mp, const char *name, | ||
1629 | tprio_t prio, tfunc_t pf, void *arg); | ||