ChibiOS
21.6.0
|
This module provides the default portable scheduler code.
Macros | |
#define | firstprio(rlp) ((rlp)->next->prio) |
Returns the priority of the first thread on the given ready list. More... | |
#define | __sch_get_currthread() __instance_get_currthread(currcore) |
Current thread pointer get macro. More... | |
Wakeup status codes | |
#define | MSG_OK (msg_t)0 |
Normal wakeup message. More... | |
#define | MSG_TIMEOUT (msg_t)-1 |
Wakeup caused by a timeout condition. More... | |
#define | MSG_RESET (msg_t)-2 |
Wakeup caused by a reset condition. More... | |
Priority constants | |
#define | NOPRIO (tprio_t)0 |
Ready list header priority. More... | |
#define | IDLEPRIO (tprio_t)1 |
Idle priority. More... | |
#define | LOWPRIO (tprio_t)2 |
Lowest priority. More... | |
#define | NORMALPRIO (tprio_t)128 |
Normal priority. More... | |
#define | HIGHPRIO (tprio_t)255 |
Highest priority. More... | |
Thread states | |
#define | CH_STATE_READY (tstate_t)0 |
Waiting on the ready list. More... | |
#define | CH_STATE_CURRENT (tstate_t)1 |
Currently running. More... | |
#define | CH_STATE_WTSTART (tstate_t)2 |
Just created. More... | |
#define | CH_STATE_SUSPENDED (tstate_t)3 |
Suspended state. More... | |
#define | CH_STATE_QUEUED (tstate_t)4 |
On a queue. More... | |
#define | CH_STATE_WTSEM (tstate_t)5 |
On a semaphore. More... | |
#define | CH_STATE_WTMTX (tstate_t)6 |
On a mutex. More... | |
#define | CH_STATE_WTCOND (tstate_t)7 |
On a cond.variable. More... | |
#define | CH_STATE_SLEEPING (tstate_t)8 |
Sleeping. More... | |
#define | CH_STATE_WTEXIT (tstate_t)9 |
Waiting a thread. More... | |
#define | CH_STATE_WTOREVT (tstate_t)10 |
One event. More... | |
#define | CH_STATE_WTANDEVT (tstate_t)11 |
Several events. More... | |
#define | CH_STATE_SNDMSGQ (tstate_t)12 |
Sending a message, in queue. More... | |
#define | CH_STATE_SNDMSG (tstate_t)13 |
Sent a message, waiting answer. More... | |
#define | CH_STATE_WTMSG (tstate_t)14 |
Waiting for a message. More... | |
#define | CH_STATE_FINAL (tstate_t)15 |
Thread terminated. More... | |
#define | CH_STATE_NAMES |
Thread states as array of strings. More... | |
Thread flags and attributes | |
#define | CH_FLAG_MODE_MASK (tmode_t)3U |
Thread memory mode mask. More... | |
#define | CH_FLAG_MODE_STATIC (tmode_t)0U |
Static thread. More... | |
#define | CH_FLAG_MODE_HEAP (tmode_t)1U |
Thread allocated from a Memory Heap. More... | |
#define | CH_FLAG_MODE_MPOOL (tmode_t)2U |
Thread allocated from a Memory Pool. More... | |
#define | CH_FLAG_TERMINATE (tmode_t)4U |
Termination requested flag. More... | |
Functions | |
static thread_t * | __sch_ready_behind (thread_t *tp) |
Inserts a thread in the Ready List placing it behind its peers. More... | |
static thread_t * | __sch_ready_ahead (thread_t *tp) |
Inserts a thread in the Ready List placing it ahead its peers. More... | |
static void | __sch_reschedule_behind (void) |
Switches to the first thread on the runnable queue. More... | |
static void | __sch_reschedule_ahead (void) |
Switches to the first thread on the runnable queue. More... | |
void | ch_sch_prio_insert (ch_queue_t *qp, ch_queue_t *tp) |
Inserts a thread into a priority ordered queue. More... | |
thread_t * | chSchReadyI (thread_t *tp) |
Inserts a thread in the Ready List placing it behind its peers. More... | |
void | chSchGoSleepS (tstate_t newstate) |
Puts the current thread to sleep into the specified state. More... | |
msg_t | chSchGoSleepTimeoutS (tstate_t newstate, sysinterval_t timeout) |
Puts the current thread to sleep into the specified state with timeout specification. More... | |
void | chSchWakeupS (thread_t *ntp, msg_t msg) |
Wakes up a thread. More... | |
void | chSchRescheduleS (void) |
Performs a reschedule if a higher priority thread is runnable. More... | |
bool | chSchIsPreemptionRequired (void) |
Evaluates if preemption is required. More... | |
void | chSchDoPreemption (void) |
Switches to the first thread on the runnable queue. More... | |
void | chSchPreemption (void) |
All-in-one preemption code. More... | |
void | chSchDoYieldS (void) |
Yields the time slot. More... | |
thread_t * | chSchSelectFirstI (void) |
Makes runnable the fist thread in the ready list, does not reschedule internally. More... | |
#define MSG_TIMEOUT (msg_t)-1 |
#define MSG_RESET (msg_t)-2 |
#define CH_STATE_READY (tstate_t)0 |
#define CH_STATE_SNDMSGQ (tstate_t)12 |
#define CH_STATE_SNDMSG (tstate_t)13 |
#define CH_STATE_NAMES |
Thread states as array of strings.
Each element in an array initialized with this macro can be indexed using the numeric thread state values.
#define CH_FLAG_MODE_MASK (tmode_t)3U |
#define CH_FLAG_MODE_HEAP (tmode_t)1U |
#define CH_FLAG_MODE_MPOOL (tmode_t)2U |
#define CH_FLAG_TERMINATE (tmode_t)4U |
#define firstprio | ( | rlp | ) | ((rlp)->next->prio) |
#define __sch_get_currthread | ( | ) | __instance_get_currthread(currcore) |
Current thread pointer get macro.
chThdGetSelfX()
instead. Inserts a thread in the Ready List placing it behind its peers.
The thread is positioned behind all threads with higher or equal priority.
next
and prev
or list corruption would occur. [in] | tp | the thread to be made ready |
Definition at line 67 of file chschd.c.
References __trace_ready(), ch_pqueue_insert_behind(), CH_STATE_FINAL, CH_STATE_READY, chDbgAssert, ch_thread::hdr, ch_thread::owner, ch_thread::pqueue, ch_ready_list::pqueue, ch_thread::rdymsg, ch_os_instance::rlist, ch_thread::state, and ch_thread::u.
Referenced by __sch_reschedule_behind(), and chSchDoPreemption().
Inserts a thread in the Ready List placing it ahead its peers.
The thread is positioned ahead all threads with higher or equal priority.
next
and prev
or list corruption would occur. [in] | tp | the thread to be made ready |
Definition at line 100 of file chschd.c.
References __trace_ready(), ch_pqueue_insert_ahead(), CH_STATE_FINAL, CH_STATE_READY, chDbgAssert, ch_thread::hdr, ch_thread::owner, ch_thread::pqueue, ch_ready_list::pqueue, ch_thread::rdymsg, ch_os_instance::rlist, ch_thread::state, and ch_thread::u.
Referenced by __sch_reschedule_ahead(), chSchDoPreemption(), and chSchSelectFirstI().
|
static |
Switches to the first thread on the runnable queue.
The current thread is positioned in the ready list behind all threads having the same priority. The thread regains its time quantum.
Definition at line 127 of file chschd.c.
References __instance_get_currthread, __instance_set_currthread, __sch_ready_behind(), CH_CFG_IDLE_LEAVE_HOOK, CH_CFG_TIME_QUANTUM, ch_pqueue_remove_highest(), CH_STATE_CURRENT, chSysSwitch, currcore, ch_thread::hdr, IDLEPRIO, ch_thread::pqueue, ch_ready_list::pqueue, ch_priority_queue::prio, ch_os_instance::rlist, ch_thread::state, and ch_thread::ticks.
Referenced by chSchPreemption().
|
static |
Switches to the first thread on the runnable queue.
The current thread is positioned in the ready list ahead of all threads having the same priority.
Definition at line 163 of file chschd.c.
References __instance_get_currthread, __instance_set_currthread, __sch_ready_ahead(), CH_CFG_IDLE_LEAVE_HOOK, ch_pqueue_remove_highest(), CH_STATE_CURRENT, chSysSwitch, currcore, ch_thread::hdr, IDLEPRIO, ch_thread::pqueue, ch_ready_list::pqueue, ch_priority_queue::prio, ch_os_instance::rlist, and ch_thread::state.
Referenced by chSchPreemption().
|
inline |
Inserts a thread into a priority ordered queue.
[in] | qp | the pointer to the threads list header |
[in] | tp | the pointer to the thread to be inserted in the list |
Definition at line 246 of file chschd.c.
References ch_queue::next.
Inserts a thread in the Ready List placing it behind its peers.
The thread is positioned behind all threads with higher or equal priority.
next
and prev
or list corruption would occur. [in] | tp | the thread to be made ready |
Definition at line 276 of file chschd.c.
Referenced by chMtxUnlock(), chMtxUnlockAllS(), chSemSignalWait(), chThdCreateI(), chThdDoDequeueNextI(), chThdExitS(), chThdResumeI(), and chThdStartI().
void chSchGoSleepS | ( | tstate_t | newstate | ) |
Puts the current thread to sleep into the specified state.
The thread goes into a sleeping state. The possible Thread States are defined into threads.h
.
[in] | newstate | the new thread state |
Definition at line 301 of file chschd.c.
References __instance_get_currthread, and currcore.
Referenced by chEvtWaitAll(), chEvtWaitAny(), chEvtWaitOne(), chThdExitS(), chThdSuspendS(), and chThdWait().
msg_t chSchGoSleepTimeoutS | ( | tstate_t | newstate, |
sysinterval_t | timeout | ||
) |
Puts the current thread to sleep into the specified state with timeout specification.
The thread goes into a sleeping state, if it is not awakened explicitly within the specified timeout then it is forcibly awakened with a MSG_TIMEOUT
low level message. The possible Thread States are defined into threads.h
.
[in] | newstate | the new thread state |
[in] | timeout | the number of ticks before the operation timeouts, the special values are handled as follow:
|
MSG_TIMEOUT | if a timeout occurs. |
Definition at line 355 of file chschd.c.
References __instance_get_currthread, and currcore.
Referenced by chEvtWaitAllTimeout(), chEvtWaitAnyTimeout(), chEvtWaitOneTimeout(), chThdEnqueueTimeoutS(), chThdSleepS(), and chThdSuspendTimeoutS().
Wakes up a thread.
The thread is inserted into the ready list or immediately made running depending on its relative priority compared to the current thread.
next
and prev
or list corruption would occur. chSchReadyI()
followed by a chSchRescheduleS()
but much more efficient. [in] | ntp | the thread to be made ready |
[in] | msg | the wakeup message |
Definition at line 393 of file chschd.c.
References __instance_get_currthread, and currcore.
Referenced by chCondSignal(), chSemSignal(), chThdCreate(), chThdCreateFromHeap(), chThdCreateFromMemoryPool(), chThdCreateStatic(), chThdResumeS(), and chThdStart().
void chSchRescheduleS | ( | void | ) |
Performs a reschedule if a higher priority thread is runnable.
If a thread with a higher priority than the current thread is in the ready list then make the higher priority thread running.
Definition at line 454 of file chschd.c.
References __instance_get_currthread, and currcore.
Referenced by chBSemSignal(), chCacheReleaseObject(), chCondBroadcast(), chEvtBroadcastFlags(), chEvtSignal(), chGuardedPoolFree(), chGuardedPoolFreeS(), chMBReset(), chMtxUnlock(), chMtxUnlockAllS(), chSemResetWithMessage(), chSemSignal(), chSysRestoreStatusX(), and chThdSetPriority().
bool chSchIsPreemptionRequired | ( | void | ) |
Evaluates if preemption is required.
The decision is taken by comparing the relative priorities and depending on the state of the round robin timeout counter.
true | if there is a thread that must go in running state immediately. |
false | if preemption is not required. |
Definition at line 481 of file chschd.c.
References __instance_get_currthread, currcore, firstprio, ch_thread::hdr, ch_thread::pqueue, ch_ready_list::pqueue, ch_priority_queue::prio, ch_os_instance::rlist, and ch_thread::ticks.
void chSchDoPreemption | ( | void | ) |
Switches to the first thread on the runnable queue.
The current thread is positioned in the ready list behind or ahead of all threads having the same priority depending on if it used its whole time slice.
Definition at line 513 of file chschd.c.
References __instance_get_currthread, __instance_set_currthread, __sch_ready_ahead(), __sch_ready_behind(), CH_CFG_IDLE_LEAVE_HOOK, CH_CFG_TIME_QUANTUM, ch_pqueue_remove_highest(), CH_STATE_CURRENT, chSysSwitch, currcore, ch_thread::hdr, IDLEPRIO, ch_thread::pqueue, ch_ready_list::pqueue, ch_priority_queue::prio, ch_os_instance::rlist, ch_thread::state, and ch_thread::ticks.
void chSchPreemption | ( | void | ) |
All-in-one preemption code.
Definition at line 564 of file chschd.c.
References __instance_get_currthread, __sch_reschedule_ahead(), __sch_reschedule_behind(), currcore, firstprio, ch_thread::hdr, likely, ch_thread::pqueue, ch_ready_list::pqueue, ch_priority_queue::prio, ch_os_instance::rlist, and ch_thread::ticks.
void chSchDoYieldS | ( | void | ) |
Yields the time slot.
Yields the CPU control to the next thread in the ready list with equal or higher priority, if any.
Definition at line 598 of file chschd.c.
References __instance_get_currthread, and currcore.
Referenced by chThdYield().
thread_t * chSchSelectFirstI | ( | void | ) |
Makes runnable the fist thread in the ready list, does not reschedule internally.
The current thread is positioned in the ready list ahead of all threads having the same priority.
Definition at line 623 of file chschd.c.
References __instance_get_currthread, __instance_set_currthread, __sch_ready_ahead(), CH_CFG_IDLE_LEAVE_HOOK, ch_pqueue_remove_highest(), CH_STATE_CURRENT, currcore, ch_thread::hdr, IDLEPRIO, ch_thread::pqueue, ch_ready_list::pqueue, ch_priority_queue::prio, ch_os_instance::rlist, and ch_thread::state.