49 #define CH_KERNEL_STABLE 0 58 #define CH_KERNEL_VERSION "3.0.0" 63 #define CH_KERNEL_MAJOR 3 68 #define CH_KERNEL_MINOR 0 73 #define CH_KERNEL_PATCH 0 83 #if !defined(FALSE) || defined(__DOXYGEN__) 91 #if !defined(TRUE) || defined(__DOXYGEN__) 100 #define MSG_OK (msg_t)0 101 #define MSG_TIMEOUT (msg_t)-1 103 #define MSG_RESET (msg_t)-2 117 #define TIME_IMMEDIATE ((sysinterval_t)-1) 123 #define TIME_INFINITE ((sysinterval_t)0) 128 #define TIME_MAX_INTERVAL ((sysinterval_t)-2) 133 #define TIME_MAX_SYSTIME ((systime_t)-1) 140 #define NIL_STATE_READY (tstate_t)0 142 #define NIL_STATE_SLEEPING (tstate_t)1 143 #define NIL_STATE_SUSP (tstate_t)2 144 #define NIL_STATE_WTQUEUE (tstate_t)3 145 #define NIL_STATE_WTOREVT (tstate_t)4 146 #define NIL_THD_IS_READY(tr) ((tr)->state == NIL_STATE_READY) 147 #define NIL_THD_IS_SLEEPING(tr) ((tr)->state == NIL_STATE_SLEEPING) 148 #define NIL_THD_IS_SUSP(tr) ((tr)->state == NIL_STATE_SUSP) 149 #define NIL_THD_IS_WTQUEUE(tr) ((tr)->state == NIL_STATE_WTQUEUE) 150 #define NIL_THD_IS_WTOREVT(tr) ((tr)->state == NIL_STATE_WTOREVT) 160 #define ALL_EVENTS ((eventmask_t)-1) 165 #define EVENT_MASK(eid) ((eventmask_t)(1 << (eid))) 177 #if !defined(CH_CFG_NUM_THREADS) || defined(__DOXYGEN__) 178 #define CH_CFG_NUM_THREADS 2 185 #if !defined(CH_CFG_ST_RESOLUTION) || defined(__DOXYGEN__) 186 #define CH_CFG_ST_RESOLUTION 32 195 #if !defined(CH_CFG_ST_FREQUENCY) || defined(__DOXYGEN__) 196 #define CH_CFG_ST_FREQUENCY 100 207 #if !defined(CH_CFG_ST_TIMEDELTA) || defined(__DOXYGEN__) 208 #define CH_CFG_ST_TIMEDELTA 0 217 #if !defined(CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) 218 #define CH_CFG_USE_SEMAPHORES TRUE 228 #if !defined(CH_CFG_USE_MUTEXES) || defined(__DOXYGEN__) 229 #define CH_CFG_USE_MUTEXES FALSE 238 #if !defined(CH_CFG_USE_EVENTS) || defined(__DOXYGEN__) 239 #define CH_CFG_USE_EVENTS TRUE 250 #if !defined(CH_CFG_USE_MAILBOXES) || defined(__DOXYGEN__) 251 #define CH_CFG_USE_MAILBOXES TRUE 261 #if !defined(CH_CFG_USE_MEMCORE) || defined(__DOXYGEN__) 262 #define CH_CFG_USE_MEMCORE TRUE 272 #if !defined(CH_CFG_USE_HEAP) || defined(__DOXYGEN__) 273 #define CH_CFG_USE_HEAP TRUE 283 #if !defined(CH_CFG_USE_MEMPOOLS) || defined(__DOXYGEN__) 284 #define CH_CFG_USE_MEMPOOLS TRUE 293 #if !defined(CH_CFG_USE_FACTORY) || defined(__DOXYGEN__) 294 #define CH_CFG_USE_FACTORY TRUE 302 #if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) || defined(__DOXYGEN__) 303 #define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 309 #if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) || defined(__DOXYGEN__) 310 #define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE 316 #if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) || defined(__DOXYGEN__) 317 #define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE 323 #if !defined(CH_CFG_FACTORY_SEMAPHORES) || defined(__DOXYGEN__) 324 #define CH_CFG_FACTORY_SEMAPHORES TRUE 330 #if !defined(CH_CFG_FACTORY_MAILBOXES) || defined(__DOXYGEN__) 331 #define CH_CFG_FACTORY_MAILBOXES TRUE 337 #if !defined(CH_CFG_FACTORY_OBJ_FIFOS) || defined(__DOXYGEN__) 338 #define CH_CFG_FACTORY_OBJ_FIFOS TRUE 347 #if !defined(CH_DBG_STATISTICS) || defined(__DOXYGEN__) 348 #define CH_DBG_STATISTICS FALSE 357 #if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) 358 #define CH_DBG_SYSTEM_STATE_CHECK FALSE 366 #if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) 367 #define CH_DBG_ENABLE_CHECKS FALSE 375 #if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) 376 #define CH_DBG_ENABLE_ASSERTS FALSE 384 #if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) 385 #define CH_DBG_ENABLE_STACK_CHECK FALSE 391 #if !defined(CH_CFG_SYSTEM_INIT_HOOK) || defined(__DOXYGEN__) 392 #define CH_CFG_SYSTEM_INIT_HOOK() {} 399 #if !defined(CH_CFG_THREAD_EXT_FIELDS) || defined(__DOXYGEN__) 400 #define CH_CFG_THREAD_EXT_FIELDS 406 #if !defined(CH_CFG_THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) 407 #define CH_CFG_THREAD_EXT_INIT_HOOK(tr) {} 416 #if !defined(CH_CFG_IDLE_ENTER_HOOK) || defined(__DOXYGEN__) 417 #define CH_CFG_IDLE_ENTER_HOOK() {} 426 #if !defined(CH_CFG_IDLE_LEAVE_HOOK) || defined(__DOXYGEN__) 427 #define CH_CFG_IDLE_LEAVE_HOOK() {} 433 #if !defined(CH_CFG_SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) 434 #define CH_CFG_SYSTEM_HALT_HOOK(reason) {} 442 #if !defined(CH_CUSTOMER_LIC_NIL) || !defined(CH_LICENSE_FEATURES) 443 #error "malformed chlicense.h" 446 #if CH_CUSTOMER_LIC_NIL == FALSE 447 #error "ChibiOS/NIL not licensed" 450 #if (CH_LICENSE_FEATURES != CH_FEATURES_FULL) && \ 451 (CH_LICENSE_FEATURES != CH_FEATURES_INTERMEDIATE) && \ 452 (CH_LICENSE_FEATURES == CH_FEATURES_BASIC) 453 #error "invalid CH_LICENSE_FEATURES setting" 457 #if (CH_LICENSE_FEATURES == CH_FEATURES_INTERMEDIATE) || \ 458 (CH_LICENSE_FEATURES == CH_FEATURES_BASIC) 461 #if CH_CFG_ST_FREQUENCY > 1000 462 #undef CH_CFG_ST_FREQUENCY 463 #define CH_CFG_ST_FREQUENCY 1000 467 #undef CH_CFG_USE_MAILBOXES 469 #define CH_CFG_USE_MAILBOXES FALSE 475 #if CH_LICENSE_FEATURES == CH_FEATURES_BASIC 478 #undef CH_CFG_ST_TIMEDELTA 479 #define CH_CFG_ST_TIMEDELTA 0 482 #undef CH_CFG_USE_MEMCORE 483 #undef CH_CFG_USE_MEMPOOLS 484 #undef CH_CFG_USE_HEAP 486 #define CH_CFG_USE_MEMCORE FALSE 487 #define CH_CFG_USE_MEMPOOLS FALSE 488 #define CH_CFG_USE_HEAP FALSE 492 #if !defined(_CHIBIOS_NIL_CONF_) 493 #error "missing or wrong configuration file" 496 #if !defined(_CHIBIOS_NIL_CONF_VER_3_0_) 497 #error "obsolete or unknown configuration file" 500 #if CH_CFG_NUM_THREADS < 1 501 #error "at least one thread must be defined" 504 #if CH_CFG_NUM_THREADS > 16 505 #error "ChibiOS/NIL is not recommended for thread-intensive applications," \ 506 "consider ChibiOS/RT instead" 509 #if (CH_CFG_ST_RESOLUTION != 16) && (CH_CFG_ST_RESOLUTION != 32) 510 #error "invalid CH_CFG_ST_RESOLUTION specified, must be 16 or 32" 513 #if CH_CFG_ST_FREQUENCY <= 0 514 #error "invalid CH_CFG_ST_FREQUENCY specified, must be greater than zero" 517 #if (CH_CFG_ST_TIMEDELTA < 0) || (CH_CFG_ST_TIMEDELTA == 1) 518 #error "invalid CH_CFG_ST_TIMEDELTA specified, must " \ 519 "be zero or greater than one" 522 #if CH_CFG_USE_MUTEXES == TRUE 523 #error "mutexes not yet supported" 526 #if CH_DBG_STATISTICS == TRUE 527 #error "statistics not yet supported" 530 #if (CH_DBG_SYSTEM_STATE_CHECK == TRUE) || \ 531 (CH_DBG_ENABLE_CHECKS == TRUE) || \ 532 (CH_DBG_ENABLE_ASSERTS == TRUE) || \ 533 (CH_DBG_ENABLE_STACK_CHECK == TRUE) 534 #define NIL_DBG_ENABLED TRUE 536 #define NIL_DBG_ENABLED FALSE 541 #if (CH_DBG_ENABLE_STACK_CHECK == TRUE) || defined(__DOXYGEN__) 542 #define THD_IDLE_BASE (&__main_thread_stack_base__) 543 #define THD_IDLE_END (&__main_thread_stack_end__) 545 #define THD_IDLE_BASE NULL 546 #define THD_IDLE_END NULL 553 #if (CH_CFG_ST_RESOLUTION == 32) || defined(__DOXYGEN__) 599 #if (CH_CFG_USE_SEMAPHORES == TRUE) || defined(__DOXYGEN__) 611 typedef void (*
tfunc_t)(
void *p);
647 #if (CH_CFG_USE_SEMAPHORES == TRUE) || defined(__DOXYGEN__) 650 #if (CH_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) 656 #if (CH_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) 659 #if (CH_DBG_ENABLE_STACK_CHECK == TRUE) || defined(__DOXYGEN__) 687 #if (CH_CFG_ST_TIMEDELTA == 0) || defined(__DOXYGEN__) 693 #if (CH_CFG_ST_TIMEDELTA > 0) || defined(__DOXYGEN__) 703 #if (CH_DBG_SYSTEM_STATE_CHECK == TRUE) || defined(__DOXYGEN__) 713 #if (NIL_DBG_ENABLED == TRUE) || defined(__DOXYGEN__) 721 const char *
volatile dbg_panic_msg;
733 #if CH_DBG_SYSTEM_STATE_CHECK == TRUE 734 #define _dbg_enter_lock() (nil.lock_cnt = (cnt_t)1) 735 #define _dbg_leave_lock() (nil.lock_cnt = (cnt_t)0) 741 #define __CH_STRINGIFY(a) #a 750 #define THD_TABLE_BEGIN \ 751 const thread_config_t nil_thd_configs[CH_CFG_NUM_THREADS + 1] = { 756 #define THD_TABLE_ENTRY(wap, name, funcp, arg) \ 757 {wap, ((stkalign_t *)(wap)) + (sizeof (wap) / sizeof(stkalign_t)), \ 763 #define THD_TABLE_END \ 764 {THD_IDLE_BASE, THD_IDLE_END, "idle", NULL, NULL} \ 776 #define MEM_ALIGN_MASK(a) ((size_t)(a) - 1U) 784 #define MEM_ALIGN_PREV(p, a) ((size_t)(p) & ~MEM_ALIGN_MASK(a)) 792 #define MEM_ALIGN_NEXT(p, a) MEM_ALIGN_PREV((size_t)(p) + \ 793 MEM_ALIGN_MASK(a), (a)) 801 #define MEM_IS_ALIGNED(p, a) (((size_t)(p) & MEM_ALIGN_MASK(a)) == 0U) 809 #define MEM_IS_VALID_ALIGNMENT(a) \ 810 (((size_t)(a) != 0U) && (((size_t)(a) & ((size_t)(a) - 1U)) == 0U)) 824 #define THD_WORKING_AREA_SIZE(n) MEM_ALIGN_NEXT(PORT_WA_SIZE(n), \ 837 #define THD_WORKING_AREA(s, n) PORT_WORKING_AREA(s, n) 848 #define THD_FUNCTION(tname, arg) PORT_THD_FUNCTION(tname, arg) 865 #if defined(PORT_IRQ_IS_VALID_PRIORITY) || defined(__DOXYGEN__) 866 #define CH_IRQ_IS_VALID_PRIORITY(prio) \ 867 PORT_IRQ_IS_VALID_PRIORITY(prio) 869 #define CH_IRQ_IS_VALID_PRIORITY(prio) false 883 #if defined(PORT_IRQ_IS_VALID_KERNEL_PRIORITY) || defined(__DOXYGEN__) 884 #define CH_IRQ_IS_VALID_KERNEL_PRIORITY(prio) \ 885 PORT_IRQ_IS_VALID_KERNEL_PRIORITY(prio) 887 #define CH_IRQ_IS_VALID_KERNEL_PRIORITY(prio) false 897 #define CH_IRQ_PROLOGUE() \ 898 PORT_IRQ_PROLOGUE(); \ 899 _dbg_check_enter_isr() 907 #define CH_IRQ_EPILOGUE() \ 908 _dbg_check_leave_isr(); \ 918 #define CH_IRQ_HANDLER(id) PORT_IRQ_HANDLER(id) 932 #define CH_FAST_IRQ_HANDLER(id) PORT_FAST_IRQ_HANDLER(id) 952 #define TIME_S2I(secs) \ 953 ((sysinterval_t)((time_conv_t)(secs) * (time_conv_t)CH_CFG_ST_FREQUENCY)) 968 #define TIME_MS2I(msecs) \ 969 ((sysinterval_t)((((time_conv_t)(msecs) * \ 970 (time_conv_t)CH_CFG_ST_FREQUENCY) + \ 971 (time_conv_t)999) / (time_conv_t)1000)) 986 #define TIME_US2I(usecs) \ 987 ((sysinterval_t)((((time_conv_t)(usecs) * \ 988 (time_conv_t)CH_CFG_ST_FREQUENCY) + \ 989 (time_conv_t)999999) / (time_conv_t)1000000)) 1004 #define TIME_I2S(interval) \ 1005 (time_secs_t)(((time_conv_t)(interval) + \ 1006 (time_conv_t)CH_CFG_ST_FREQUENCY - \ 1007 (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY) 1022 #define TIME_I2MS(interval) \ 1023 (time_msecs_t)((((time_conv_t)(interval) * (time_conv_t)1000) + \ 1024 (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / \ 1025 (time_conv_t)CH_CFG_ST_FREQUENCY) 1040 #define TIME_I2US(interval) \ 1041 (time_msecs_t)((((time_conv_t)(interval) * (time_conv_t)1000000) + \ 1042 (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / \ 1043 (time_conv_t)CH_CFG_ST_FREQUENCY) 1056 #define _THREADS_QUEUE_DATA(name) {(cnt_t)0} 1065 #define _THREADS_QUEUE_DECL(name) \ 1066 threads_queue_t name = _THREADS_QUEUE_DATA(name) 1082 #define _SEMAPHORE_DATA(name, n) {n} 1093 #define SEMAPHORE_DECL(name, n) semaphore_t name = _SEMAPHORE_DATA(name, n) 1110 #if (PORT_SUPPORTS_RT == TRUE) || defined(__DOXYGEN__) 1111 #define chSysGetRealtimeCounterX() (rtcnt_t)port_rt_get_counter_value() 1122 #define chSysDisable() { \ 1124 _dbg_check_disable(); \ 1138 #define chSysSuspend() { \ 1140 _dbg_check_suspend(); \ 1152 #define chSysEnable() { \ 1153 _dbg_check_enable(); \ 1162 #define chSysLock() { \ 1164 _dbg_check_lock(); \ 1172 #define chSysUnlock() { \ 1173 _dbg_check_unlock(); \ 1189 #define chSysLockFromISR() { \ 1190 port_lock_from_isr(); \ 1191 _dbg_check_lock_from_isr(); \ 1207 #define chSysUnlockFromISR() { \ 1208 _dbg_check_unlock_from_isr(); \ 1209 port_unlock_from_isr(); \ 1221 #define chSchIsRescRequiredI() ((bool)(nil.current != nil.next)) 1228 #define chThdGetSelfX() nil.current 1240 #define chThdSleepSeconds(secs) chThdSleep(TIME_S2I(secs)) 1253 #define chThdSleepMilliseconds(msecs) chThdSleep(TIME_MS2I(msecs)) 1266 #define chThdSleepMicroseconds(usecs) chThdSleep(TIME_US2I(usecs)) 1275 #define chThdSleepS(timeout) \ 1276 (void) chSchGoSleepTimeoutS(NIL_STATE_SLEEPING, timeout) 1286 #define chThdSleepUntilS(abstime) \ 1287 (void) chSchGoSleepTimeoutS(NIL_STATE_SLEEPING, \ 1288 chTimeDiffX(chVTGetSystemTimeX(), (abstime))) 1297 #define chThdQueueObjectInit(tqp) ((tqp)->cnt = (cnt_t)0) 1309 #define chThdQueueIsEmptyI(tqp) ((bool)(tqp->cnt >= (cnt_t)0)) 1311 #if (CH_CFG_USE_SEMAPHORES == TRUE) || defined(__DOXYGEN__) 1321 #define chSemObjectInit(sp, n) ((sp)->cnt = n) 1335 #define chSemWait(sp) chSemWaitTimeout(sp, TIME_INFINITE) 1349 #define chSemWaitS(sp) chSemWaitTimeoutS(sp, TIME_INFINITE) 1359 #define chSemFastWaitI(sp) ((sp)->cnt--) 1370 #define chSemFastSignalI(sp) ((sp)->cnt++) 1377 #define chSemGetCounterI(sp) ((sp)->cnt) 1393 #if (CH_CFG_ST_TIMEDELTA == 0) || defined(__DOXYGEN__) 1394 #define chVTGetSystemTimeX() (nil.systime) 1396 #define chVTGetSystemTimeX() port_timer_get_time() 1407 #define chVTTimeElapsedSinceX(start) \ 1408 chTimeDiffX((start), chVTGetSystemTimeX()) 1419 #define chTimeAddX(systime, interval) \ 1420 ((systime_t)(systime) + (systime_t)(interval)) 1431 #define chTimeDiffX(start, end) \ 1432 ((sysinterval_t)((systime_t)((systime_t)(end) - (systime_t)(start)))) 1447 #define chTimeIsInRangeX(time, start, end) \ 1448 ((bool)((systime_t)((systime_t)(time) - (systime_t)(start)) < \ 1449 (systime_t)((systime_t)(end) - (systime_t)(start)))) 1461 #if !defined(chDbgCheck) 1462 #define chDbgCheck(c) do { \ 1464 if (CH_DBG_ENABLE_CHECKS != FALSE) { \ 1467 chSysHalt(__func__); \ 1487 #if !defined(chDbgAssert) 1488 #define chDbgAssert(c, r) do { \ 1490 if (CH_DBG_ENABLE_ASSERTS != FALSE) { \ 1493 chSysHalt(__func__); \ 1501 #if CH_DBG_SYSTEM_STATE_CHECK == FALSE 1502 #define _dbg_enter_lock() 1503 #define _dbg_leave_lock() 1504 #define _dbg_check_disable() 1505 #define _dbg_check_suspend() 1506 #define _dbg_check_enable() 1507 #define _dbg_check_lock() 1508 #define _dbg_check_unlock() 1509 #define _dbg_check_lock_from_isr() 1510 #define _dbg_check_unlock_from_isr() 1511 #define _dbg_check_enter_isr() 1512 #define _dbg_check_leave_isr() 1513 #define chDbgCheckClassI() 1514 #define chDbgCheckClassS() 1521 #if !defined(__DOXYGEN__) 1522 #if (CH_DBG_ENABLE_STACK_CHECK == TRUE) || defined(__DOXYGEN__) 1523 extern stkalign_t __main_thread_stack_base__, __main_thread_stack_end__;
1554 #if CH_CFG_USE_SEMAPHORES == TRUE 1562 #if CH_CFG_USE_EVENTS == TRUE 1567 #if CH_DBG_SYSTEM_STATE_CHECK == TRUE 1568 void _dbg_check_disable(
void);
1569 void _dbg_check_suspend(
void);
1570 void _dbg_check_enable(
void);
1571 void _dbg_check_lock(
void);
1572 void _dbg_check_unlock(
void);
1573 void _dbg_check_lock_from_isr(
void);
1574 void _dbg_check_unlock_from_isr(
void);
1575 void _dbg_check_enter_isr(
void);
1576 void _dbg_check_leave_isr(
void);
1577 void chDbgCheckClassI(
void);
1578 void chDbgCheckClassS(
void);
Port related template macros and structures.
threads_queue_t semaphore_t
Type of a structure representing a semaphore.
Structure representing a thread.
uint64_t systime_t
Type of system time.
uint64_t sysinterval_t
Type of time interval.
msg_t chThdSuspendTimeoutS(thread_reference_t *trp, sysinterval_t timeout)
Sends the current thread sleeping and sets a reference variable.
volatile cnt_t cnt
Threads Queue counter.
ChibiOS/LIB main include file.
msg_t chSemWaitTimeoutS(semaphore_t *sp, sysinterval_t timeout)
Performs a wait operation on a semaphore with timeout specification.
void chSysPolledDelayX(rtcnt_t cycles)
Polled delay.
thread_t * chSchReadyI(thread_t *tp)
Inserts a thread in the Ready List placing it behind its peers.
void chThdDequeueAllI(threads_queue_t *tqp, msg_t msg)
Dequeues and wakes up all threads from the threads queue object.
void chSemSignal(semaphore_t *sp)
Performs a signal operation on a semaphore.
msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, sysinterval_t timeout)
Enqueues the caller thread on a threads queue object.
thread_t * thread_reference_t
Type of a thread reference.
void(* tfunc_t)(void *p)
Thread function.
Platform dependent part of the thread_t structure.
void chThdDoDequeueNextI(threads_queue_t *tqp, msg_t msg)
Dequeues and wakes up one thread from the threads queue object.
Structure representing a thread static configuration.
void chSysHalt(const char *reason)
Halts the system.
#define CH_CFG_THREAD_EXT_FIELDS
Threads descriptor structure extension.
void chEvtSignal(thread_t *tp, eventmask_t events)
Adds a set of event flags directly to the specified thread_t.
void chSchRescheduleS(void)
Performs a reschedule if a higher priority thread is runnable.
void chSemReset(semaphore_t *sp, cnt_t n)
Performs a reset operation on the semaphore.
void chSysTimerHandlerI(void)
Handles time ticks for round robin preemption and timer increments.
uint32_t sysinterval_t
Type of time interval.
bool chSchIsPreemptionRequired(void)
Evaluates if preemption is required.
void chSysUnconditionalLock(void)
Unconditionally enters the kernel lock state.
void chEvtSignalI(thread_t *tp, eventmask_t events)
Adds a set of event flags directly to the specified thread_t.
void chThdResumeI(thread_reference_t *trp, msg_t msg)
Wakes up a thread waiting on a thread reference object.
msg_t chSchGoSleepTimeoutS(tstate_t newstate, sysinterval_t timeout)
Puts the current thread to sleep into the specified state with timeout specification.
#define CH_CFG_NUM_THREADS
Number of user threads in the application.
void chSysInit(void)
ChibiOS/RT initialization.
uint32_t systime_t
Type of system time.
void chThdDequeueNextI(threads_queue_t *tqp, msg_t msg)
Dequeues and wakes up one thread from the threads queue object, if any.
syssts_t chSysGetStatusAndLockX(void)
Returns the execution status and enters a critical zone.
eventmask_t chEvtWaitAnyTimeout(eventmask_t events, sysinterval_t timeout)
Waits for any of the specified events.
void chSysRestoreStatusX(syssts_t sts)
Restores the specified execution status and leaves a critical zone.
bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end)
Realtime window test.
License Module macros and structures.
uint64_t time_conv_t
Type of time conversion variable.
msg_t chSemWaitTimeout(semaphore_t *sp, sysinterval_t timeout)
Performs a wait operation on a semaphore with timeout specification.
void chThdSleep(sysinterval_t time)
Suspends the invoking thread for the specified time.
uint64_t stkalign_t
Type of stack and memory alignment enforcement.
void chSysUnconditionalUnlock(void)
Unconditionally leaves the kernel lock state.
Structure representing a queue of threads.
void chThdSleepUntil(systime_t time)
Suspends the invoking thread until the system time arrives to the specified value.
void chSemSignalI(semaphore_t *sp)
Performs a signal operation on a semaphore.
nil_system_t nil
System data structures.
void chSemResetI(semaphore_t *sp, cnt_t n)
Performs a reset operation on the semaphore.
void chSchDoReschedule(void)
Switches to the first thread on the runnable queue.
Structure representing a thread.