Loading...
Searching...
No Matches
sched.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014-2017 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
79
80#include <stddef.h>
81#include <inttypes.h>
82
83#include "kernel_defines.h"
84#include "clist.h"
85
86#ifdef __cplusplus
87extern "C" {
88#endif
89
94#ifndef MAXTHREADS
95#if defined(MODULE_CORE_THREAD)
96#define MAXTHREADS 32
97#else
98#define MAXTHREADS 0
99#endif
100#endif
101
105#define KERNEL_PID_UNDEF 0
106
110#define KERNEL_PID_FIRST (KERNEL_PID_UNDEF + 1)
111
115#define KERNEL_PID_LAST (KERNEL_PID_FIRST + MAXTHREADS - 1)
116
120#define PRIkernel_pid PRIi16
121
122#if defined(DEVELHELP) || defined(DOXYGEN)
126#ifndef SCHED_TEST_STACK
127#define SCHED_TEST_STACK 1
128#endif /* SCHED_TEST_STACK */
129#endif /* DEVELHELP */
130
134typedef int16_t kernel_pid_t;
135
143static inline int pid_is_valid(kernel_pid_t pid)
144{
145 return ((KERNEL_PID_FIRST <= pid) && (pid <= KERNEL_PID_LAST));
146}
147
150typedef struct _thread thread_t;
151
174
175
180#define STATUS_ON_RUNQUEUE STATUS_RUNNING
182#define STATUS_NOT_FOUND ((thread_status_t)~0)
188#ifndef SCHED_PRIO_LEVELS
189#define SCHED_PRIO_LEVELS 16
190#endif
191
200
209
222void sched_switch(uint16_t other_prio);
223
228
233extern volatile unsigned int sched_context_switch_request;
234
238extern volatile thread_t *sched_threads[KERNEL_PID_LAST + 1];
239
243extern volatile int sched_num_threads;
244
249
254
267
282
283#if IS_USED(MODULE_SCHED_CB) || defined(DOXYGEN)
293typedef void (*sched_callback_t)(kernel_pid_t active, kernel_pid_t next);
294
301#endif /* MODULE_SCHED_CB */
302
318static inline void sched_runq_advance(uint8_t prio)
319{
321}
322
323#if (IS_USED(MODULE_SCHED_RUNQ_CALLBACK)) || defined(DOXYGEN)
340extern void sched_runq_callback(uint8_t prio);
341#endif
342
350static inline int sched_runq_is_empty(uint8_t prio)
351{
352 return clist_is_empty(&sched_runqueues[prio]);
353}
354
362static inline int sched_runq_exactly_one(uint8_t prio)
363{
364 return clist_exactly_one(&sched_runqueues[prio]);
365}
366
374static inline int sched_runq_more_than_one(uint8_t prio)
375{
377}
378
388int sched_yield(void);
389
390#ifdef __cplusplus
391}
392#endif
393
Circular linked list.
static bool clist_more_than_one(clist_node_t *list)
Tells if a list has more than one element.
Definition clist.h:491
list_node_t clist_node_t
List node structure.
Definition clist.h:104
static bool clist_is_empty(const clist_node_t *list)
Checks if *list is empty.
Definition clist.h:115
static void clist_lpoprpush(clist_node_t *list)
Advances the circle list.
Definition clist.h:200
static bool clist_exactly_one(clist_node_t *list)
Tells if a list has exactly one element.
Definition clist.h:477
#define NORETURN
The NORETURN keyword tells the compiler to assume that the function cannot return.
thread_t * sched_run(void)
Triggers the scheduler to schedule the next thread.
struct _thread thread_t
forward declaration for thread_t, defined in thread.h
Definition sched.h:150
#define SCHED_PRIO_LEVELS
The number of thread priority levels.
Definition sched.h:189
static int sched_runq_more_than_one(uint8_t prio)
Tell if the number of threads in a runqueue greater than 1.
Definition sched.h:374
int sched_yield(void)
Alias for thread_yield provided for compatibility with POSIX's sched.h.
void sched_register_cb(sched_callback_t callback)
Register a callback that will be called on every scheduler run.
void sched_arch_idle(void)
Set CPU to idle mode (CPU dependent)
static int pid_is_valid(kernel_pid_t pid)
Determine if the given pid is valid.
Definition sched.h:143
volatile int sched_num_threads
Number of running (non-terminated) threads.
void sched_runq_callback(uint8_t prio)
Scheduler runqueue (change) callback.
static int sched_runq_exactly_one(uint8_t prio)
Tell if the number of threads in a runqueue is 1.
Definition sched.h:362
void(* sched_callback_t)(kernel_pid_t active, kernel_pid_t next)
Scheduler run callback.
Definition sched.h:293
#define KERNEL_PID_LAST
The last valid PID (inclusive).
Definition sched.h:115
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:134
volatile unsigned int sched_context_switch_request
Flag indicating whether a context switch is necessary after handling an interrupt.
void sched_switch(uint16_t other_prio)
Yield if appropriate.
void sched_set_status(thread_t *process, thread_status_t status)
Set the status of the specified process.
NORETURN void sched_task_exit(void)
Removes thread from scheduler and set status to STATUS_STOPPED.
void sched_change_priority(thread_t *thread, uint8_t priority)
Change the priority of the given thread.
volatile thread_t * sched_threads[KERNEL_PID_LAST+1]
Thread table.
thread_status_t
Definition sched.h:158
static int sched_runq_is_empty(uint8_t prio)
Tell if the number of threads in a runqueue is 0.
Definition sched.h:350
static void sched_runq_advance(uint8_t prio)
Advance a runqueue.
Definition sched.h:318
NORETURN void cpu_switch_context_exit(void)
Call context switching at thread exit.
#define KERNEL_PID_FIRST
The first valid PID (inclusive).
Definition sched.h:110
clist_node_t sched_runqueues[SCHED_PRIO_LEVELS]
List of runqueues per priority level.
@ STATUS_COND_BLOCKED
waiting for a condition variable
Definition sched.h:169
@ STATUS_RUNNING
currently running
Definition sched.h:170
@ STATUS_MUTEX_BLOCKED
waiting for a locked mutex
Definition sched.h:162
@ STATUS_STOPPED
has terminated
Definition sched.h:159
@ STATUS_SLEEPING
sleeping
Definition sched.h:161
@ STATUS_FLAG_BLOCKED_ANY
waiting for any flag from flag_mask
Definition sched.h:166
@ STATUS_SEND_BLOCKED
waiting for message to be delivered
Definition sched.h:164
@ STATUS_MBOX_BLOCKED
waiting for get/put on mbox
Definition sched.h:168
@ STATUS_PENDING
waiting to be scheduled to run
Definition sched.h:171
@ STATUS_NUMOF
number of supported thread states
Definition sched.h:172
@ STATUS_REPLY_BLOCKED
waiting for a message response
Definition sched.h:165
@ STATUS_ZOMBIE
has terminated & keeps thread's thread_t
Definition sched.h:160
@ STATUS_FLAG_BLOCKED_ALL
waiting for all flags in flag_mask
Definition sched.h:167
@ STATUS_RECEIVE_BLOCKED
waiting for a message
Definition sched.h:163
Adds include for missing inttype definitions.
Common macros and compiler attributes/pragmas configuration.
thread_t holds thread's context data.
Definition thread.h:167
thread_status_t status
thread's status
Definition thread.h:169
uint8_t priority
thread's priority
Definition thread.h:170