diff options
Diffstat (limited to 'kernel/task/sched.c')
-rw-r--r-- | kernel/task/sched.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/kernel/task/sched.c b/kernel/task/sched.c new file mode 100644 index 0000000..652d562 --- /dev/null +++ b/kernel/task/sched.c @@ -0,0 +1,45 @@ +#include "bug/panic.h" +#include "task/task.h" +#include "task/sched.h" +#include "mcu/task/context.h" +#include "mcu/task/context.h" + + +struct tcb_t* volatile current = 0; + +struct list_head ready = LIST_HEAD_INIT(ready); + +void* volatile kstack; + +void spawn(struct tcb_t* const tcb) { + tcb->sp = stack_init(tcb->mem_low, tcb->mem_high, tcb->entry, tcb->id); + INIT_LIST_HEAD(&tcb->queue); + list_add_tail(&tcb->queue, &ready); +} + +void yield(void) { + cli(); + context_save(); + schedule(); + context_restore(); + sei(); + ret(); +} + + +void sched_init() { + kstack_init(&kstack); + schedule(); + context_restore(); + sei(); + ret(); +} + +void schedule() { + if(!list_empty(&ready)) { + current = list_entry(ready.next, struct tcb_t, queue); + list_move_tail(ready.next, &ready); + } else { + panic(); + } +}
\ No newline at end of file |