diff options
Diffstat (limited to 'kernel/task/include/task/sched.h')
-rw-r--r-- | kernel/task/include/task/sched.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/kernel/task/include/task/sched.h b/kernel/task/include/task/sched.h new file mode 100644 index 0000000..9029664 --- /dev/null +++ b/kernel/task/include/task/sched.h @@ -0,0 +1,63 @@ +#ifndef SCHED_H +#define SCHED_H + +#include "collection/list.h" +#include "mcu/task/task.h" + +/** + * Points to currently executing task. If no scheduling has been enabled, + * this points to NULL + */ +extern struct tcb_t* volatile current; + +/** + * Queue that contains all tasks that are ready to be run, awaiting their + * turn from the scheduler. + */ +extern struct list_head ready; + +/** + * Stack pointer for operations performed out of task context, including any + * calls made after SAVE_CONTEXT(). + */ +extern void* volatile kstack; + +/** + * Makes the current task sleep on a specific queue. + * This moves the current task to the given queue's tail. + */ +static inline void sleep_queue(struct list_head* queue) { + list_move_tail(¤t->queue, queue); +} + +/** + * Wakes all tasks waiting in the given queue. + * This moves all tasks contained in the queue to the ready queue. + */ +static inline void wake_all_queue(struct list_head* queue) { + list_splice_init(queue, ready.prev); +} + +/** + * Initializes a given task and adds it to the ready queue. + */ +void spawn(struct tcb_t* const tcb); + +/** + * Voluntarily relinquishes control of the CPU from the current task to the scheduler. + */ +void yield() __attribute__ ( ( naked ) ); + + +/** + * Initializes the scheduler by setting up kstack, initializing the idle task + * and selecting the first task to run. + */ +void sched_init(); + +/** + * Enters the scheduler, setting current to the next runnable task. + */ +void schedule(); + +#endif |