ChibiOS/RT
6.0.3
|
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 | currp ch.rlist.current |
Current thread pointer access macro. More... | |
#define | __CH_STRINGIFY(a) #a |
Utility to make the parameter a quoted string. 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... | |
Typedefs | |
typedef struct ch_thread | thread_t |
Type of a thread structure. More... | |
typedef thread_t * | thread_reference_t |
Type of a thread reference. More... | |
typedef struct ch_threads_list | threads_list_t |
Type of a generic threads single link list, it works like a stack. More... | |
typedef struct ch_threads_queue | threads_queue_t |
Type of a generic threads bidirectional linked list header and element. More... | |
typedef struct ch_ready_list | ready_list_t |
Type of a ready list header. More... | |
typedef void(* | vtfunc_t) (void *p) |
Type of a Virtual Timer callback function. More... | |
typedef struct ch_virtual_timer | virtual_timer_t |
Type of a Virtual Timer structure. More... | |
typedef struct ch_virtual_timers_list | virtual_timers_list_t |
Type of virtual timers list header. More... | |
typedef struct ch_system_debug | system_debug_t |
Type of a system debug structure. More... | |
typedef struct ch_system | ch_system_t |
Type of system data structure. More... | |
Data Structures | |
struct | ch_threads_list |
Generic threads single link list, it works like a stack. More... | |
struct | ch_threads_queue |
Generic threads bidirectional linked list header and element. More... | |
struct | ch_thread |
Structure representing a thread. More... | |
struct | ch_virtual_timer |
Virtual Timer descriptor structure. More... | |
struct | ch_virtual_timers_list |
Virtual timers list header. More... | |
struct | ch_system_debug |
System debug data structure. More... | |
struct | ch_system |
System data structure. More... | |
Functions | |
void | _scheduler_init (void) |
Scheduler initialization. More... | |
void | queue_prio_insert (thread_t *tp, threads_queue_t *tqp) |
Inserts a thread into a priority ordered queue. More... | |
void | queue_insert (thread_t *tp, threads_queue_t *tqp) |
Inserts a thread into a queue. More... | |
thread_t * | queue_fifo_remove (threads_queue_t *tqp) |
Removes the first-out thread from a queue and returns it. More... | |
thread_t * | queue_lifo_remove (threads_queue_t *tqp) |
Removes the last-out thread from a queue and returns it. More... | |
thread_t * | queue_dequeue (thread_t *tp) |
Removes a thread from a queue and returns it. More... | |
void | list_insert (thread_t *tp, threads_list_t *tlp) |
Pushes a thread_t on top of a stack list. More... | |
thread_t * | list_remove (threads_list_t *tlp) |
Pops a thread from the top of a stack list and returns it. More... | |
thread_t * | chSchReadyI (thread_t *tp) |
Inserts a thread in the Ready List placing it behind its peers. More... | |
thread_t * | chSchReadyAheadI (thread_t *tp) |
Inserts a thread in the Ready List placing it ahead 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 | chSchDoRescheduleBehind (void) |
Switches to the first thread on the runnable queue. More... | |
void | chSchDoRescheduleAhead (void) |
Switches to the first thread on the runnable queue. More... | |
void | chSchDoReschedule (void) |
Switches to the first thread on the runnable queue. More... | |
static void | list_init (threads_list_t *tlp) |
Threads list initialization. More... | |
static bool | list_isempty (threads_list_t *tlp) |
Evaluates to true if the specified threads list is empty. More... | |
static bool | list_notempty (threads_list_t *tlp) |
Evaluates to true if the specified threads list is not empty. More... | |
static void | queue_init (threads_queue_t *tqp) |
Threads queue initialization. More... | |
static bool | queue_isempty (const threads_queue_t *tqp) |
Evaluates to true if the specified threads queue is empty. More... | |
static bool | queue_notempty (const threads_queue_t *tqp) |
Evaluates to true if the specified threads queue is not empty. More... | |
static bool | chSchIsRescRequiredI (void) |
Determines if the current thread must reschedule. More... | |
static bool | chSchCanYieldS (void) |
Determines if yielding is possible. More... | |
static void | chSchDoYieldS (void) |
Yields the time slot. More... | |
static void | chSchPreemption (void) |
Inline-able preemption code. More... | |
Variables | |
ch_system_t | ch |
System data structures. More... | |
#define MSG_OK (msg_t)0 |
Normal wakeup message.
Definition at line 39 of file chschd.h.
Referenced by chCondSignal(), chCondSignalI(), chEvtSignalI(), chEvtWaitAllTimeout(), chEvtWaitAnyTimeout(), chEvtWaitOneTimeout(), chFifoSendObject(), chFifoSendObjectAhead(), chFifoSendObjectAheadI(), chFifoSendObjectAheadS(), chFifoSendObjectI(), chFifoSendObjectS(), chGuardedPoolAllocTimeoutS(), chMBFetchI(), chMBFetchTimeoutS(), chMBPostAheadI(), chMBPostAheadTimeoutS(), chMBPostI(), chMBPostTimeoutS(), chPipeReadTimeout(), chPipeWriteTimeout(), chSemAddCounterI(), chSemSignal(), chSemSignalI(), chSemSignalWait(), chSemWaitS(), chSemWaitTimeoutS(), chThdCreate(), chThdCreateFromHeap(), chThdCreateFromMemoryPool(), chThdCreateStatic(), and chThdStart().
#define MSG_TIMEOUT (msg_t)-1 |
Wakeup caused by a timeout condition.
Definition at line 40 of file chschd.h.
Referenced by chCondWaitTimeoutS(), chMBFetchI(), chMBPostAheadI(), chMBPostI(), chSchGoSleepS(), chSemWaitTimeoutS(), chThdEnqueueTimeoutS(), and chThdSuspendTimeoutS().
#define MSG_RESET (msg_t)-2 |
Wakeup caused by a reset condition.
Definition at line 43 of file chschd.h.
Referenced by chCondBroadcastI(), chMBFetchI(), chMBFetchTimeoutS(), chMBPostAheadI(), chMBPostAheadTimeoutS(), chMBPostI(), chMBPostTimeoutS(), chMBResetI(), chPipeReset(), and chSemResetI().
#define NOPRIO (tprio_t)0 |
Ready list header priority.
Definition at line 52 of file chschd.h.
Referenced by _scheduler_init().
#define IDLEPRIO (tprio_t)1 |
Idle priority.
Definition at line 55 of file chschd.h.
Referenced by chSchDoReschedule(), chSchDoRescheduleAhead(), chSchDoRescheduleBehind(), chSchGoSleepS(), chSchWakeupS(), and chSysInit().
#define NORMALPRIO (tprio_t)128 |
#define HIGHPRIO (tprio_t)255 |
Highest priority.
Definition at line 58 of file chschd.h.
Referenced by chThdCreateStatic(), chThdCreateSuspendedI(), and chThdSetPriority().
#define CH_STATE_READY (tstate_t)0 |
Waiting on the ready list.
Definition at line 65 of file chschd.h.
Referenced by chMtxLockS(), chSchGoSleepS(), chSchReadyAheadI(), and chSchReadyI().
#define CH_STATE_CURRENT (tstate_t)1 |
Currently running.
Definition at line 68 of file chschd.h.
Referenced by chMtxLockS(), chSchDoReschedule(), chSchDoRescheduleAhead(), chSchDoRescheduleBehind(), chSchGoSleepS(), chSchWakeupS(), and chSysInit().
#define CH_STATE_WTSTART (tstate_t)2 |
Just created.
Definition at line 69 of file chschd.h.
Referenced by _thread_init(), chThdStart(), and chThdStartI().
#define CH_STATE_SUSPENDED (tstate_t)3 |
Suspended state.
Definition at line 70 of file chschd.h.
Referenced by chSchGoSleepS(), chThdResumeI(), chThdResumeS(), chThdSuspendS(), and chThdSuspendTimeoutS().
#define CH_STATE_QUEUED (tstate_t)4 |
On a queue.
Definition at line 71 of file chschd.h.
Referenced by chSchGoSleepS(), chThdDoDequeueNextI(), and chThdEnqueueTimeoutS().
#define CH_STATE_WTSEM (tstate_t)5 |
On a semaphore.
Definition at line 72 of file chschd.h.
Referenced by chMtxLockS(), chSchGoSleepS(), chSemSignalWait(), chSemWaitS(), and chSemWaitTimeoutS().
#define CH_STATE_WTMTX (tstate_t)6 |
#define CH_STATE_WTCOND (tstate_t)7 |
On a cond.variable.
Definition at line 74 of file chschd.h.
Referenced by chCondWaitS(), chCondWaitTimeoutS(), chMtxLockS(), and chSchGoSleepS().
#define CH_STATE_SLEEPING (tstate_t)8 |
#define CH_STATE_WTEXIT (tstate_t)9 |
#define CH_STATE_WTOREVT (tstate_t)10 |
One event.
Definition at line 77 of file chschd.h.
Referenced by chEvtSignalI(), chEvtWaitAny(), chEvtWaitAnyTimeout(), chEvtWaitOne(), and chEvtWaitOneTimeout().
#define CH_STATE_WTANDEVT (tstate_t)11 |
Several events.
Definition at line 78 of file chschd.h.
Referenced by chEvtSignalI(), chEvtWaitAll(), and chEvtWaitAllTimeout().
#define CH_STATE_SNDMSGQ (tstate_t)12 |
Sending a message, in queue.
Definition at line 79 of file chschd.h.
Referenced by chMsgSend(), and chMtxLockS().
#define CH_STATE_SNDMSG (tstate_t)13 |
Sent a message, waiting answer.
Definition at line 82 of file chschd.h.
Referenced by chMsgGet(), chMsgRelease(), and chMsgWait().
#define CH_STATE_WTMSG (tstate_t)14 |
Waiting for a message.
Definition at line 85 of file chschd.h.
Referenced by chMsgSend(), and chMsgWait().
#define CH_STATE_FINAL (tstate_t)15 |
Thread terminated.
Definition at line 88 of file chschd.h.
Referenced by chSchReadyAheadI(), chSchReadyI(), chThdExitS(), chThdRelease(), chThdTerminatedX(), and chThdWait().
#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 |
Thread memory mode mask.
Definition at line 105 of file chschd.h.
Referenced by chThdExitS(), and chThdRelease().
#define CH_FLAG_MODE_STATIC (tmode_t)0U |
Static thread.
Definition at line 108 of file chschd.h.
Referenced by _thread_init(), and chThdExitS().
#define CH_FLAG_MODE_HEAP (tmode_t)1U |
Thread allocated from a Memory Heap.
Definition at line 109 of file chschd.h.
Referenced by chThdCreateFromHeap(), and chThdRelease().
#define CH_FLAG_MODE_MPOOL (tmode_t)2U |
Thread allocated from a Memory Pool.
Definition at line 112 of file chschd.h.
Referenced by chThdCreateFromMemoryPool(), and chThdRelease().
#define CH_FLAG_TERMINATE (tmode_t)4U |
Termination requested flag.
Definition at line 115 of file chschd.h.
Referenced by chThdShouldTerminateX(), and chThdTerminate().
#define firstprio | ( | rlp | ) | ((rlp)->next->prio) |
Returns the priority of the first thread on the given ready list.
Definition at line 452 of file chschd.h.
Referenced by chSchDoYieldS(), chSchIsPreemptionRequired(), chSchIsRescRequiredI(), and queue_notempty().
#define currp ch.rlist.current |
Current thread pointer access macro.
chThdGetSelfX()
instead. Definition at line 459 of file chschd.h.
Referenced by _trace_switch(), chCondWaitS(), chCondWaitTimeoutS(), chEvtAddEventsI(), chEvtGetAndClearEventsI(), chEvtGetEventsX(), chEvtRegisterMaskWithFlags(), chEvtWaitAll(), chEvtWaitAllTimeout(), chEvtWaitAny(), chEvtWaitAnyTimeout(), chEvtWaitOne(), chEvtWaitOneTimeout(), chMsgSend(), chMsgWait(), chMtxLockS(), chMtxTryLockS(), chMtxUnlock(), chMtxUnlockAll(), chMtxUnlockAllS(), chMtxUnlockS(), chSchDoReschedule(), chSchDoRescheduleAhead(), chSchDoRescheduleBehind(), chSchDoYieldS(), chSchGoSleepS(), chSchGoSleepTimeoutS(), chSchIsPreemptionRequired(), chSchIsRescRequiredI(), chSchWakeupS(), chSemSignalWait(), chSemWaitS(), chSemWaitTimeoutS(), chSysInit(), chSysTimerHandlerI(), chThdEnqueueTimeoutS(), chThdExitS(), chThdSetPriority(), chThdWait(), and queue_notempty().
#define __CH_STRINGIFY | ( | a | ) | #a |
Utility to make the parameter a quoted string.
Definition at line 110 of file chsystypes.h.
Type of a thread structure.
Definition at line 52 of file chsystypes.h.
typedef thread_t* thread_reference_t |
Type of a thread reference.
Definition at line 57 of file chsystypes.h.
typedef struct ch_threads_list threads_list_t |
Type of a generic threads single link list, it works like a stack.
Definition at line 62 of file chsystypes.h.
typedef struct ch_threads_queue threads_queue_t |
Type of a generic threads bidirectional linked list header and element.
Definition at line 69 of file chsystypes.h.
typedef struct ch_ready_list ready_list_t |
Type of a ready list header.
Definition at line 76 of file chsystypes.h.
typedef void(* vtfunc_t) (void *p) |
Type of a Virtual Timer callback function.
Definition at line 81 of file chsystypes.h.
typedef struct ch_virtual_timer virtual_timer_t |
Type of a Virtual Timer structure.
Definition at line 86 of file chsystypes.h.
typedef struct ch_virtual_timers_list virtual_timers_list_t |
Type of virtual timers list header.
Definition at line 91 of file chsystypes.h.
typedef struct ch_system_debug system_debug_t |
Type of a system debug structure.
Definition at line 96 of file chsystypes.h.
typedef struct ch_system ch_system_t |
Type of system data structure.
Definition at line 101 of file chsystypes.h.
void _scheduler_init | ( | void | ) |
Scheduler initialization.
Definition at line 65 of file chschd.c.
References NOPRIO, queue_init(), and ch_system::rlist.
Referenced by chSysInit().
|
inline |
Inserts a thread into a priority ordered queue.
[in] | tp | the pointer to the thread to be inserted in the list |
[in] | tqp | the pointer to the threads list header |
Definition at line 86 of file chschd.c.
References ch_threads_queue::next, ch_threads_queue::prev, ch_thread::prio, and ch_thread::queue.
Referenced by chCondWaitS(), chCondWaitTimeoutS(), chMtxLockS(), and queue_notempty().
|
inline |
Inserts a thread into a queue.
[in] | tp | the pointer to the thread to be inserted in the list |
[in] | tqp | the pointer to the threads list header |
Definition at line 106 of file chschd.c.
References ch_threads_queue::next, ch_threads_queue::prev, and ch_thread::queue.
Referenced by chThdEnqueueTimeoutS(), and queue_notempty().
|
inline |
Removes the first-out thread from a queue and returns it.
[in] | tqp | the pointer to the threads list header |
Definition at line 124 of file chschd.c.
References ch_threads_queue::next, ch_threads_queue::prev, and ch_thread::queue.
Referenced by chCondBroadcastI(), chCondSignal(), chCondSignalI(), chMsgWait(), chMtxUnlock(), chMtxUnlockAll(), chMtxUnlockAllS(), chMtxUnlockS(), chSchDoReschedule(), chSchDoRescheduleAhead(), chSchDoRescheduleBehind(), chSchGoSleepS(), chSemAddCounterI(), chSemSignal(), chSemSignalI(), chSemSignalWait(), chThdDoDequeueNextI(), and queue_notempty().
|
inline |
Removes the last-out thread from a queue and returns it.
[in] | tqp | the pointer to the threads list header |
Definition at line 143 of file chschd.c.
References ch_threads_queue::next, ch_threads_queue::prev, and ch_thread::queue.
Referenced by chSemResetI(), and queue_notempty().
Removes a thread from a queue and returns it.
The thread is removed from the queue regardless of its relative position and regardless the used insertion method.
[in] | tp | the pointer to the thread to be removed from the queue |
Definition at line 162 of file chschd.c.
References ch_threads_queue::next, ch_threads_queue::prev, and ch_thread::queue.
Referenced by chMtxLockS(), chSchGoSleepS(), and queue_notempty().
|
inline |
Pushes a thread_t on top of a stack list.
[in] | tp | the pointer to the thread to be inserted in the list |
[in] | tlp | the pointer to the threads list header |
Definition at line 178 of file chschd.c.
References ch_threads_list::next, ch_threads_queue::next, and ch_thread::queue.
Referenced by chThdWait(), and queue_isempty().
|
inline |
Pops a thread from the top of a stack list and returns it.
[in] | tlp | the pointer to the threads list header |
Definition at line 193 of file chschd.c.
References ch_threads_list::next, ch_threads_queue::next, and ch_thread::queue.
Referenced by chThdExitS().
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 218 of file chschd.c.
References CH_STATE_FINAL, CH_STATE_READY, chDbgAssert, chDbgCheck, chDbgCheckClassI(), ch_threads_queue::next, ch_thread::queue, ch_system::rlist, and ch_thread::state.
Referenced by chCondBroadcastI(), chCondSignalI(), chEvtSignalI(), chMsgSend(), chMtxLockS(), chMtxUnlock(), chMtxUnlockAll(), chMtxUnlockAllS(), chMtxUnlockS(), chSchDoReschedule(), chSchDoRescheduleBehind(), chSchGoSleepS(), chSchWakeupS(), chSemAddCounterI(), chSemResetI(), chSemSignalI(), chSemSignalWait(), chThdCreateI(), chThdDoDequeueNextI(), chThdExitS(), chThdResumeI(), and chThdStartI().
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 257 of file chschd.c.
References CH_STATE_FINAL, CH_STATE_READY, chDbgAssert, chDbgCheck, chDbgCheckClassI(), ch_threads_queue::next, ch_thread::queue, ch_system::rlist, and ch_thread::state.
Referenced by chSchDoReschedule(), chSchDoRescheduleAhead(), and chSchWakeupS().
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 289 of file chschd.c.
References CH_CFG_IDLE_ENTER_HOOK, CH_CFG_TIME_QUANTUM, CH_STATE_CURRENT, CH_STATE_QUEUED, CH_STATE_READY, CH_STATE_SUSPENDED, CH_STATE_WTCOND, CH_STATE_WTSEM, chDbgCheckClassS(), chSchReadyI(), chSemFastSignalI(), chSysLockFromISR(), chSysSwitch, chSysUnlockFromISR(), currp, IDLEPRIO, MSG_TIMEOUT, queue_dequeue(), queue_fifo_remove(), ch_thread::rdymsg, ch_system::rlist, ch_thread::state, ch_thread::ticks, ch_thread::u, ch_thread::wtsemp, and ch_thread::wttrp.
Referenced by chCondWaitS(), chEvtWaitAll(), chEvtWaitAny(), chEvtWaitOne(), chMsgSend(), chMsgWait(), chMtxLockS(), chSchGoSleepTimeoutS(), chSemSignalWait(), chSemWaitS(), 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 375 of file chschd.c.
References chDbgCheckClassS(), chSchGoSleepS(), chVTDoResetI(), chVTDoSetI(), chVTIsArmedI(), currp, and TIME_INFINITE.
Referenced by chCondWaitTimeoutS(), chEvtWaitAllTimeout(), chEvtWaitAnyTimeout(), chEvtWaitOneTimeout(), chSemWaitTimeoutS(), chThdEnqueueTimeoutS(), chThdSleepS(), and chThdSuspendTimeoutS().
void chSchWakeupS | ( | thread_t * | ntp, |
msg_t | msg | ||
) |
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 412 of file chschd.c.
References CH_CFG_IDLE_LEAVE_HOOK, CH_STATE_CURRENT, chDbgAssert, chDbgCheckClassS(), chSchReadyAheadI(), chSchReadyI(), chSysSwitch, currp, IDLEPRIO, ch_thread::prio, ch_thread::rdymsg, ch_system::rlist, ch_thread::state, and ch_thread::u.
Referenced by chCondSignal(), chMsgReleaseS(), 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 456 of file chschd.c.
References chDbgCheckClassS(), chSchDoRescheduleAhead(), and chSchIsRescRequiredI().
Referenced by chBSemSignal(), chCondBroadcast(), chEvtBroadcastFlags(), chEvtSignal(), chGuardedPoolFree(), chGuardedPoolFreeS(), chMBFetchTimeoutS(), chMBPostAheadTimeoutS(), chMBPostTimeoutS(), chMBReset(), chMtxUnlock(), chMtxUnlockAll(), chPipeReset(), chSemReset(), chSemSignalWait(), 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 479 of file chschd.c.
References currp, firstprio, and ch_system::rlist.
void chSchDoRescheduleBehind | ( | void | ) |
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 507 of file chschd.c.
References CH_CFG_IDLE_LEAVE_HOOK, CH_CFG_TIME_QUANTUM, CH_STATE_CURRENT, chSchReadyI(), chSysSwitch, currp, IDLEPRIO, ch_thread::prio, queue_fifo_remove(), ch_system::rlist, and ch_thread::ticks.
Referenced by chSchCanYieldS(), and chSchPreemption().
void chSchDoRescheduleAhead | ( | void | ) |
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 540 of file chschd.c.
References CH_CFG_IDLE_LEAVE_HOOK, CH_STATE_CURRENT, chSchReadyAheadI(), chSysSwitch, currp, IDLEPRIO, ch_thread::prio, queue_fifo_remove(), and ch_system::rlist.
Referenced by chSchDoYieldS(), chSchPreemption(), and chSchRescheduleS().
void chSchDoReschedule | ( | 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 570 of file chschd.c.
References CH_CFG_IDLE_LEAVE_HOOK, CH_CFG_TIME_QUANTUM, CH_STATE_CURRENT, chSchReadyAheadI(), chSchReadyI(), chSysSwitch, currp, IDLEPRIO, ch_thread::prio, queue_fifo_remove(), ch_system::rlist, and ch_thread::ticks.
|
inlinestatic |
Threads list initialization.
[in] | tlp | pointer to the threads list object |
Definition at line 510 of file chschd.h.
References ch_threads_list::next.
Referenced by _thread_init().
|
inlinestatic |
Evaluates to true
if the specified threads list is empty.
[in] | tlp | pointer to the threads list object |
Definition at line 523 of file chschd.h.
References ch_threads_list::next.
|
inlinestatic |
Evaluates to true
if the specified threads list is not empty.
[in] | tlp | pointer to the threads list object |
Definition at line 536 of file chschd.h.
References ch_threads_queue::next, and ch_threads_queue::prev.
Referenced by chThdExitS().
|
inlinestatic |
Threads queue initialization.
[in] | tqp | pointer to the threads queue object |
Definition at line 548 of file chschd.h.
References ch_threads_queue::next.
Referenced by _scheduler_init(), _thread_init(), chCondObjectInit(), chMtxObjectInit(), chSemObjectInit(), and chThdQueueObjectInit().
|
inlinestatic |
Evaluates to true
if the specified threads queue is empty.
[in] | tqp | pointer to the threads queue object |
Definition at line 562 of file chschd.h.
References list_insert(), ch_threads_list::next, ch_threads_queue::next, and ch_thread::queue.
Referenced by chSemAddCounterI(), chSemResetI(), chSemSignal(), chSemSignalI(), chSemSignalWait(), chSemWaitS(), chSemWaitTimeoutS(), and chThdQueueIsEmptyI().
|
inlinestatic |
Evaluates to true
if the specified threads queue is not empty.
[in] | tqp | pointer to the threads queue object |
Definition at line 575 of file chschd.h.
References chDbgCheckClassI(), chSchIsRescRequiredI(), currp, firstprio, ch_threads_list::next, ch_threads_queue::next, ch_threads_queue::prev, ch_thread::prio, ch_thread::queue, queue_dequeue(), queue_fifo_remove(), queue_insert(), queue_lifo_remove(), queue_prio_insert(), and ch_system::rlist.
Referenced by chCondBroadcastI(), chCondSignal(), chCondSignalI(), chMtxQueueNotEmptyS(), chSemAddCounterI(), chSemResetI(), chSemSignal(), chSemSignalI(), chSemSignalWait(), chSemWaitS(), chSemWaitTimeoutS(), chThdDequeueAllI(), chThdDequeueNextI(), and chThdDoDequeueNextI().
|
inlinestatic |
Determines if the current thread must reschedule.
This function returns true
if there is a ready thread with higher priority.
false | if rescheduling is not necessary. |
true | if there is a ready thread at higher priority. |
Definition at line 655 of file chschd.h.
References chDbgCheckClassS(), currp, firstprio, and ch_system::rlist.
Referenced by chSchRescheduleS(), and queue_notempty().
|
inlinestatic |
Determines if yielding is possible.
This function returns true
if there is a ready thread with equal or higher priority.
false | if yielding is not possible. |
true | if there is a ready thread at equal or higher priority. |
Definition at line 673 of file chschd.h.
References chDbgCheckClassS(), and chSchDoRescheduleBehind().
|
inlinestatic |
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 687 of file chschd.h.
References chSchDoRescheduleAhead(), currp, firstprio, and ch_system::rlist.
Referenced by chThdYield().
|
inlinestatic |
Inline-able preemption code.
This is the common preemption code, this function must be invoked exclusively from the port layer.
Definition at line 703 of file chschd.h.
References chSchDoRescheduleAhead(), and chSchDoRescheduleBehind().
ch_system_t ch |
System data structures.
Definition at line 42 of file chschd.c.
Referenced by _dbg_check_disable(), _dbg_check_enable(), _dbg_check_enter_isr(), _dbg_check_leave_isr(), _dbg_check_lock(), _dbg_check_lock_from_isr(), _dbg_check_suspend(), _dbg_check_unlock(), _dbg_check_unlock_from_isr(), _stats_ctxswc(), _stats_increase_irq(), _stats_init(), _stats_start_measure_crit_isr(), _stats_start_measure_crit_thd(), _stats_stop_measure_crit_isr(), _stats_stop_measure_crit_thd(), _tm_init(), _trace_halt(), _trace_init(), _trace_isr_enter(), _trace_isr_leave(), _trace_switch(), _vt_init(), chDbgCheckClassI(), chDbgCheckClassS(), chDbgResumeTraceI(), chDbgSuspendTraceI(), chDbgWriteTraceI(), chRegFirstThread(), chRegNextThread(), chRegSetThreadName(), chSysGetIdleThreadX(), chSysHalt(), chSysInit(), chSysIntegrityCheckI(), chSysUnlock(), chThdGetSelfX(), chTMStopMeasurementX(), chVTDoResetI(), chVTDoSetI(), chVTDoTickI(), chVTGetSystemTimeX(), chVTGetTimersStateI(), and trace_next().