aboutsummaryrefslogtreecommitdiff
path: root/lib/chibios/demos/various/RT-ARMCM4-USELIB/rt/ch.h
diff options
context:
space:
mode:
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.h1629
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
139typedef uint32_t rtcnt_t;
140typedef uint64_t rttime_t;
141typedef uint32_t syssts_t;
142typedef uint8_t tmode_t;
143typedef uint8_t tstate_t;
144typedef uint8_t trefs_t;
145typedef uint8_t tslices_t;
146typedef uint32_t tprio_t;
147typedef int32_t msg_t;
148typedef int32_t eventid_t;
149typedef uint32_t eventmask_t;
150typedef uint32_t eventflags_t;
151typedef int32_t cnt_t;
152typedef 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
161typedef struct ch_thread thread_t;
162typedef thread_t * thread_reference_t;
163typedef struct ch_threads_list threads_list_t;
164typedef struct ch_threads_queue threads_queue_t;
165typedef struct ch_ready_list ready_list_t;
166typedef void (*vtfunc_t)(void *p);
167typedef struct ch_virtual_timer virtual_timer_t;
168typedef struct ch_virtual_timers_list virtual_timers_list_t;
169typedef struct ch_system_debug system_debug_t;
170typedef 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)
194typedef uint32_t systime_t;
195typedef uint32_t sysinterval_t;
196typedef uint32_t time_secs_t;
197typedef uint32_t time_msecs_t;
198typedef uint32_t time_usecs_t;
199typedef 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)
206static 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}
213static 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}
221static 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}
229static 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}
238static 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}
247static 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}
256static inline systime_t chTimeAddX(systime_t systime,
257 sysinterval_t interval) {
258 return systime + (systime_t)interval;
259}
260static inline sysinterval_t chTimeDiffX(systime_t start, systime_t end) {
261 return (sysinterval_t)((systime_t)(end - start));
262}
263static 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
279typedef void *regarm_t;
280typedef uint64_t stkalign_t;
281struct 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
401struct 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};
411struct 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);
435static 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}
442static inline syssts_t port_get_irq_status(void) {
443 syssts_t sts;
444 sts = (syssts_t)__get_BASEPRI();
445 return sts;
446}
447static inline bool port_irq_enabled(syssts_t sts) {
448 return sts == (syssts_t)CORTEX_BASEPRI_DISABLED;
449}
450static inline bool port_is_isr_context(void) {
451 return (bool)((__get_IPSR() & 0x1FFU) != 0U);
452}
453static inline void port_lock(void) {
454 __set_BASEPRI(CORTEX_BASEPRI_KERNEL);
455}
456static inline void port_unlock(void) {
457 __set_BASEPRI(CORTEX_BASEPRI_DISABLED);
458}
459static inline void port_lock_from_isr(void) {
460 port_lock();
461}
462static inline void port_unlock_from_isr(void) {
463 port_unlock();
464}
465static inline void port_disable(void) {
466 __disable_irq();
467}
468static inline void port_suspend(void) {
469 __set_BASEPRI(CORTEX_BASEPRI_KERNEL);
470 __enable_irq();
471}
472static inline void port_enable(void) {
473 __set_BASEPRI(CORTEX_BASEPRI_DISABLED);
474 __enable_irq();
475}
476static inline void port_wait_for_interrupt(void) {
477}
478static 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
504typedef struct {
505 rtcnt_t offset;
506} tm_calibration_t;
507typedef 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
558struct ch_threads_list {
559 thread_t *next;
560};
561struct ch_threads_queue {
562 thread_t *next;
563 thread_t *prev;
564};
565struct 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};
594struct 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};
601struct ch_virtual_timers_list {
602 virtual_timer_t *next;
603 virtual_timer_t *prev;
604 sysinterval_t delta;
605 volatile systime_t systime;
606};
607struct 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};
615struct ch_system_debug {
616 const char * volatile panic_msg;
617};
618struct 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
628extern 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);
640static inline void list_init(threads_list_t *tlp) {
641 tlp->next = (thread_t *)tlp;
642}
643static inline bool list_isempty(threads_list_t *tlp) {
644 return (bool)(tlp->next == (thread_t *)tlp);
645}
646static inline bool list_notempty(threads_list_t *tlp) {
647 return (bool)(tlp->next != (thread_t *)tlp);
648}
649static inline void queue_init(threads_queue_t *tqp) {
650 tqp->next = (thread_t *)tqp;
651 tqp->prev = (thread_t *)tqp;
652}
653static inline bool queue_isempty(const threads_queue_t *tqp) {
654 return (bool)(tqp->next == (const thread_t *)tqp);
655}
656static inline bool queue_notempty(const threads_queue_t *tqp) {
657 return (bool)(tqp->next != (const thread_t *)tqp);
658}
659static inline void list_insert(thread_t *tp, threads_list_t *tlp) {
660 tp->queue.next = tlp->next;
661 tlp->next = tp;
662}
663static 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}
668static 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}
678static 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}
684static 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}
690static 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}
696static 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}
701static inline bool chSchIsRescRequiredI(void) {
702 chDbgCheckClassI();
703 return firstprio(&ch.rlist.queue) > currp->prio;
704}
705static inline bool chSchCanYieldS(void) {
706 chDbgCheckClassS();
707 return firstprio(&ch.rlist.queue) >= currp->prio;
708}
709static inline void chSchDoYieldS(void) {
710 chDbgCheckClassS();
711 if (chSchCanYieldS()) {
712 chSchDoRescheduleBehind();
713 }
714}
715static 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); }
741extern 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);
749static inline void chSysDisable(void) {
750 port_disable();
751 _dbg_check_disable();
752}
753static inline void chSysSuspend(void) {
754 port_suspend();
755 _dbg_check_suspend();
756}
757static inline void chSysEnable(void) {
758 _dbg_check_enable();
759 port_enable();
760}
761static inline void chSysLock(void) {
762 port_lock();
763 _stats_start_measure_crit_thd();
764 _dbg_check_lock();
765}
766static 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}
774static inline void chSysLockFromISR(void) {
775 port_lock_from_isr();
776 _stats_start_measure_crit_isr();
777 _dbg_check_lock_from_isr();
778}
779static inline void chSysUnlockFromISR(void) {
780 _dbg_check_unlock_from_isr();
781 _stats_stop_measure_crit_isr();
782 port_unlock_from_isr();
783}
784static inline void chSysUnconditionalLock(void) {
785 if (port_irq_enabled(port_get_irq_status())) {
786 chSysLock();
787 }
788}
789static inline void chSysUnconditionalUnlock(void) {
790 if (!port_irq_enabled(port_get_irq_status())) {
791 chSysUnlock();
792 }
793}
794static 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);
802static inline void chVTObjectInit(virtual_timer_t *vtp) {
803 vtp->func = NULL;
804}
805static inline systime_t chVTGetSystemTimeX(void) {
806 return ch.vtlist.systime;
807}
808static inline systime_t chVTGetSystemTime(void) {
809 systime_t systime;
810 chSysLock();
811 systime = chVTGetSystemTimeX();
812 chSysUnlock();
813 return systime;
814}
815static inline sysinterval_t chVTTimeElapsedSinceX(systime_t start) {
816 return chTimeDiffX(start, chVTGetSystemTimeX());
817}
818static inline bool chVTIsSystemTimeWithinX(systime_t start, systime_t end) {
819 return chTimeIsInRangeX(chVTGetSystemTimeX(), start, end);
820}
821static inline bool chVTIsSystemTimeWithin(systime_t start, systime_t end) {
822 return chTimeIsInRangeX(chVTGetSystemTime(), start, end);
823}
824static 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}
834static inline bool chVTIsArmedI(const virtual_timer_t *vtp) {
835 chDbgCheckClassI();
836 return (bool)(vtp->func != NULL);
837}
838static inline bool chVTIsArmed(const virtual_timer_t *vtp) {
839 bool b;
840 chSysLock();
841 b = chVTIsArmedI(vtp);
842 chSysUnlock();
843 return b;
844}
845static inline void chVTResetI(virtual_timer_t *vtp) {
846 if (chVTIsArmedI(vtp)) {
847 chVTDoResetI(vtp);
848 }
849}
850static inline void chVTReset(virtual_timer_t *vtp) {
851 chSysLock();
852 chVTResetI(vtp);
853 chSysUnlock();
854}
855static 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}
860static 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}
866static 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
886typedef void (*tfunc_t)(void *p);
887typedef 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);
932static inline thread_t *chThdGetSelfX(void) {
933 return ch.rlist.current;
934}
935static inline tprio_t chThdGetPriorityX(void) {
936 return chThdGetSelfX()->prio;
937}
938static inline stkalign_t *chThdGetWorkingAreaX(thread_t *tp) {
939 return tp->wabase;
940}
941static inline bool chThdTerminatedX(thread_t *tp) {
942 return (bool)(tp->state == CH_STATE_FINAL);
943}
944static inline bool chThdShouldTerminateX(void) {
945 return (bool)((chThdGetSelfX()->flags & CH_FLAG_TERMINATE) != (tmode_t)0);
946}
947static inline thread_t *chThdStartI(thread_t *tp) {
948 chDbgAssert(tp->state == CH_STATE_WTSTART, "wrong state");
949 return chSchReadyI(tp);
950}
951static inline void chThdSleepS(sysinterval_t ticks) {
952 chDbgCheck(ticks != TIME_IMMEDIATE);
953 (void) chSchGoSleepTimeoutS(CH_STATE_SLEEPING, ticks);
954}
955static inline void chThdQueueObjectInit(threads_queue_t *tqp) {
956 queue_init(tqp);
957}
958static inline bool chThdQueueIsEmptyI(threads_queue_t *tqp) {
959 chDbgCheckClassI();
960 return queue_isempty(tqp);
961}
962static 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
971typedef 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);
999static inline void chRegSetThreadName(const char *name) {
1000 ch.rlist.current->name = name;
1001}
1002static inline const char *chRegGetThreadNameX(thread_t *tp) {
1003 return tp->name;
1004}
1005static inline void chRegSetThreadNameX(thread_t *tp, const char *name) {
1006 tp->name = name;
1007}
1008#define CHSEM_H
1009typedef 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);
1026static inline void chSemFastWaitI(semaphore_t *sp) {
1027 chDbgCheckClassI();
1028 sp->cnt--;
1029}
1030static inline void chSemFastSignalI(semaphore_t *sp) {
1031 chDbgCheckClassI();
1032 sp->cnt++;
1033}
1034static inline cnt_t chSemGetCounterI(const semaphore_t *sp) {
1035 chDbgCheckClassI();
1036 return sp->cnt;
1037}
1038#define CHMTX_H
1039typedef struct ch_mutex mutex_t;
1040struct 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);
1056static inline bool chMtxQueueNotEmptyS(mutex_t *mp) {
1057 chDbgCheckClassS();
1058 return queue_notempty(&mp->queue);
1059}
1060static inline thread_t *chMtxGetOwnerI(mutex_t *mp) {
1061 chDbgCheckClassI();
1062 return mp->owner;
1063}
1064static inline mutex_t *chMtxGetNextMutexX(void) {
1065 return chThdGetSelfX()->mtxlist;
1066}
1067#define CHCOND_H
1068typedef 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
1083typedef struct event_listener event_listener_t;
1084struct event_listener {
1085 event_listener_t *next;
1086 thread_t *listener;
1087 eventmask_t events;
1088 eventflags_t flags;
1089 eventflags_t wflags;
1090};
1091typedef struct event_source {
1092 event_listener_t *next;
1093} event_source_t;
1094typedef 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);
1120static inline void chEvtObjectInit(event_source_t *esp) {
1121 esp->next = (event_listener_t *)esp;
1122}
1123static 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}
1128static inline void chEvtRegister(event_source_t *esp,
1129 event_listener_t *elp,
1130 eventid_t event) {
1131 chEvtRegisterMask(esp, elp, EVENT_MASK(event));
1132}
1133static inline bool chEvtIsListeningI(event_source_t *esp) {
1134 return (bool)(esp != (event_source_t *)esp->next);
1135}
1136static inline void chEvtBroadcast(event_source_t *esp) {
1137 chEvtBroadcastFlags(esp, (eventflags_t)0);
1138}
1139static inline void chEvtBroadcastI(event_source_t *esp) {
1140 chEvtBroadcastFlagsI(esp, (eventflags_t)0);
1141}
1142static inline eventmask_t chEvtAddEventsI(eventmask_t events) {
1143 return currp->epending |= events;
1144}
1145static 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);
1152static inline bool chMsgIsPendingI(thread_t *tp) {
1153 chDbgCheckClassI();
1154 return (bool)(tp->msgqueue.next != (thread_t *)&tp->msgqueue);
1155}
1156static inline msg_t chMsgGet(thread_t *tp) {
1157 chDbgAssert(tp->state == CH_STATE_SNDMSG, "invalid state");
1158 return tp->u.sentmsg;
1159}
1160static 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
1172typedef 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)
1177static inline void chBSemObjectInit(binary_semaphore_t *bsp, bool taken) {
1178 chSemObjectInit(&bsp->sem, taken ? (cnt_t)0 : (cnt_t)1);
1179}
1180static inline msg_t chBSemWait(binary_semaphore_t *bsp) {
1181 return chSemWait(&bsp->sem);
1182}
1183static inline msg_t chBSemWaitS(binary_semaphore_t *bsp) {
1184 chDbgCheckClassS();
1185 return chSemWaitS(&bsp->sem);
1186}
1187static inline msg_t chBSemWaitTimeoutS(binary_semaphore_t *bsp,
1188 sysinterval_t timeout) {
1189 chDbgCheckClassS();
1190 return chSemWaitTimeoutS(&bsp->sem, timeout);
1191}
1192static inline msg_t chBSemWaitTimeout(binary_semaphore_t *bsp,
1193 sysinterval_t timeout) {
1194 return chSemWaitTimeout(&bsp->sem, timeout);
1195}
1196static inline void chBSemResetI(binary_semaphore_t *bsp, bool taken) {
1197 chDbgCheckClassI();
1198 chSemResetI(&bsp->sem, taken ? (cnt_t)0 : (cnt_t)1);
1199}
1200static inline void chBSemReset(binary_semaphore_t *bsp, bool taken) {
1201 chSemReset(&bsp->sem, taken ? (cnt_t)0 : (cnt_t)1);
1202}
1203static inline void chBSemSignalI(binary_semaphore_t *bsp) {
1204 chDbgCheckClassI();
1205 if (bsp->sem.cnt < (cnt_t)1) {
1206 chSemSignalI(&bsp->sem);
1207 }
1208}
1209static inline void chBSemSignal(binary_semaphore_t *bsp) {
1210 chSysLock();
1211 chBSemSignalI(bsp);
1212 chSchRescheduleS();
1213 chSysUnlock();
1214}
1215static 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
1220typedef 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);
1244static inline size_t chMBGetSizeI(const mailbox_t *mbp) {
1245 return (size_t)(mbp->top - mbp->buffer);
1246}
1247static inline size_t chMBGetUsedCountI(const mailbox_t *mbp) {
1248 chDbgCheckClassI();
1249 return mbp->cnt;
1250}
1251static inline size_t chMBGetFreeCountI(const mailbox_t *mbp) {
1252 chDbgCheckClassI();
1253 return chMBGetSizeI(mbp) - chMBGetUsedCountI(mbp);
1254}
1255static inline msg_t chMBPeekI(const mailbox_t *mbp) {
1256 chDbgCheckClassI();
1257 return *mbp->rdptr;
1258}
1259static inline void chMBResumeX(mailbox_t *mbp) {
1260 mbp->reset = false;
1261}
1262#define CHMEMCORE_H
1263typedef void *(*memgetfunc_t)(size_t size, unsigned align);
1264typedef void *(*memgetfunc2_t)(size_t size, unsigned align, size_t offset);
1265typedef struct {
1266 uint8_t *basemem;
1267 uint8_t *topmem;
1268} memcore_t;
1269#define chCoreAllocAlignedWithOffsetI chCoreAllocFromTopI
1270#define chCoreAllocAlignedWithOffset chCoreAllocFromTop
1271extern 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);
1278static inline void *chCoreAllocAlignedI(size_t size, unsigned align) {
1279 return chCoreAllocAlignedWithOffsetI(size, align, 0U);
1280}
1281static inline void *chCoreAllocAligned(size_t size, unsigned align) {
1282 return chCoreAllocAlignedWithOffset(size, align, 0U);
1283}
1284static inline void *chCoreAllocI(size_t size) {
1285 return chCoreAllocAlignedWithOffsetI(size, PORT_NATURAL_ALIGN, 0U);
1286}
1287static 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
1292typedef struct memory_heap memory_heap_t;
1293typedef union heap_header heap_header_t;
1294union 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};
1304struct 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);
1315static inline void *chHeapAlloc(memory_heap_t *heapp, size_t size) {
1316 return chHeapAllocAligned(heapp, size, CH_HEAP_ALIGNMENT);
1317}
1318static inline size_t chHeapGetSize(const void *p) {
1319 return ((heap_header_t *)p - 1U)->used.size;
1320}
1321#define CHMEMPOOLS_H
1322struct pool_header {
1323 struct pool_header *next;
1324};
1325typedef struct {
1326 struct pool_header *next;
1327 size_t object_size;
1328 unsigned align;
1329 memgetfunc_t provider;
1330} memory_pool_t;
1331typedef 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);
1355static inline void chPoolObjectInit(memory_pool_t *mp,
1356 size_t size,
1357 memgetfunc_t provider) {
1358 chPoolObjectInitAligned(mp, size, PORT_NATURAL_ALIGN, provider);
1359}
1360static inline void chPoolAdd(memory_pool_t *mp, void *objp) {
1361 chPoolFree(mp, objp);
1362}
1363static inline void chPoolAddI(memory_pool_t *mp, void *objp) {
1364 chPoolFreeI(mp, objp);
1365}
1366static inline void chGuardedPoolObjectInit(guarded_memory_pool_t *gmp,
1367 size_t size) {
1368 chGuardedPoolObjectInitAligned(gmp, size, PORT_NATURAL_ALIGN);
1369}
1370static inline cnt_t chGuardedPoolGetCounterI(guarded_memory_pool_t *gmp) {
1371 return chSemGetCounterI(&gmp->sem);
1372}
1373static 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}
1383static inline void chGuardedPoolFreeI(guarded_memory_pool_t *gmp, void *objp) {
1384 chPoolFreeI(&gmp->pool, objp);
1385 chSemSignalI(&gmp->sem);
1386}
1387static inline void chGuardedPoolFreeS(guarded_memory_pool_t *gmp, void *objp) {
1388 chGuardedPoolFreeI(gmp, objp);
1389 chSchRescheduleS();
1390}
1391static inline void chGuardedPoolAdd(guarded_memory_pool_t *gmp, void *objp) {
1392 chGuardedPoolFree(gmp, objp);
1393}
1394static inline void chGuardedPoolAddI(guarded_memory_pool_t *gmp, void *objp) {
1395 chGuardedPoolFreeI(gmp, objp);
1396}
1397static inline void chGuardedPoolAddS(guarded_memory_pool_t *gmp, void *objp) {
1398 chGuardedPoolFreeS(gmp, objp);
1399}
1400#define CHOBJFIFOS_H
1401typedef struct ch_objects_fifo {
1402 guarded_memory_pool_t free;
1403 mailbox_t mbx;
1404} objects_fifo_t;
1405static 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}
1413static 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}
1420static inline void *chFifoTakeObjectI(objects_fifo_t *ofp) {
1421 return chGuardedPoolAllocI(&ofp->free);
1422}
1423static inline void *chFifoTakeObjectTimeoutS(objects_fifo_t *ofp,
1424 sysinterval_t timeout) {
1425 return chGuardedPoolAllocTimeoutS(&ofp->free, timeout);
1426}
1427static inline void *chFifoTakeObjectTimeout(objects_fifo_t *ofp,
1428 sysinterval_t timeout) {
1429 return chGuardedPoolAllocTimeout(&ofp->free, timeout);
1430}
1431static inline void chFifoReturnObjectI(objects_fifo_t *ofp,
1432 void *objp) {
1433 chGuardedPoolFreeI(&ofp->free, objp);
1434}
1435static inline void chFifoReturnObjectS(objects_fifo_t *ofp,
1436 void *objp) {
1437 chGuardedPoolFreeS(&ofp->free, objp);
1438}
1439static inline void chFifoReturnObject(objects_fifo_t *ofp,
1440 void *objp) {
1441 chGuardedPoolFree(&ofp->free, objp);
1442}
1443static 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}
1449static 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}
1455static 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}
1460static 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}
1466static 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}
1472static 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}
1477static inline msg_t chFifoReceiveObjectI(objects_fifo_t *ofp,
1478 void **objpp) {
1479 return chMBFetchI(&ofp->mbx, (msg_t *)objpp);
1480}
1481static 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}
1486static 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
1492typedef 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);
1513static inline size_t chPipeGetSize(const pipe_t *pp) {
1514 return (size_t)(pp->top - pp->buffer);
1515}
1516static inline size_t chPipeGetUsedCount(const pipe_t *pp) {
1517 return pp->cnt;
1518}
1519static inline size_t chPipeGetFreeCount(const pipe_t *pp) {
1520 return chPipeGetSize(pp) - chPipeGetUsedCount(pp);
1521}
1522static 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))
1528typedef 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;
1533typedef struct ch_dyn_list {
1534 dyn_element_t *next;
1535} dyn_list_t;
1536typedef struct ch_registered_static_object {
1537 dyn_element_t element;
1538 void *objp;
1539} registered_object_t;
1540typedef struct ch_dyn_object {
1541 dyn_element_t element;
1542 uint8_t buffer[];
1543} dyn_buffer_t;
1544typedef struct ch_dyn_semaphore {
1545 dyn_element_t element;
1546 semaphore_t sem;
1547} dyn_semaphore_t;
1548typedef struct ch_dyn_mailbox {
1549 dyn_element_t element;
1550 mailbox_t mbx;
1551 msg_t msgbuf[];
1552} dyn_mailbox_t;
1553typedef struct ch_dyn_objects_fifo {
1554 dyn_element_t element;
1555 objects_fifo_t fifo;
1556 msg_t msgbuf[];
1557} dyn_objects_fifo_t;
1558typedef struct ch_dyn_pipe {
1559 dyn_element_t element;
1560 pipe_t pipe;
1561 uint8_t buffer[];
1562} dyn_pipe_t;
1563typedef 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;
1574extern 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);
1599static inline dyn_element_t *chFactoryDuplicateReference(dyn_element_t *dep) {
1600 dep->refs++;
1601 return dep;
1602}
1603static inline void *chFactoryGetObject(registered_object_t *rop) {
1604 return rop->objp;
1605}
1606static inline size_t chFactoryGetBufferSize(dyn_buffer_t *dbp) {
1607 return chHeapGetSize(dbp) - sizeof (dyn_element_t);
1608}
1609static inline uint8_t *chFactoryGetBuffer(dyn_buffer_t *dbp) {
1610 return dbp->buffer;
1611}
1612static inline semaphore_t *chFactoryGetSemaphore(dyn_semaphore_t *dsp) {
1613 return &dsp->sem;
1614}
1615static inline mailbox_t *chFactoryGetMailbox(dyn_mailbox_t *dmp) {
1616 return &dmp->mbx;
1617}
1618static inline objects_fifo_t *chFactoryGetObjectsFIFO(dyn_objects_fifo_t *dofp) {
1619 return &dofp->fifo;
1620}
1621static 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);