diff options
Diffstat (limited to 'kernel/task')
-rw-r--r-- | kernel/task/idle.c | 18 | ||||
-rw-r--r-- | kernel/task/include/task/sched.h | 2 | ||||
-rw-r--r-- | kernel/task/include/task/task.h | 19 | ||||
-rw-r--r-- | kernel/task/sched.c | 10 |
4 files changed, 46 insertions, 3 deletions
diff --git a/kernel/task/idle.c b/kernel/task/idle.c new file mode 100644 index 0000000..6bd8494 --- /dev/null +++ b/kernel/task/idle.c @@ -0,0 +1,18 @@ +#include <avr/power.h> +#include <avr/interrupt.h> +#include <avr/sleep.h> +#include <avr/power.h> +#include "task/idle.h" +#include "task/task.h" + +void idle_entry(char args) { + while(1) { + set_sleep_mode(SLEEP_MODE_IDLE); + cli(); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); + }; +} + diff --git a/kernel/task/include/task/sched.h b/kernel/task/include/task/sched.h index c14a85b..6dcd67c 100644 --- a/kernel/task/include/task/sched.h +++ b/kernel/task/include/task/sched.h @@ -19,7 +19,7 @@ extern struct list_head ready; /** * Stack pointer for operations performed out of task context, including any - * calls made after SAVE_CONTEXT(). + * calls made after context save. */ extern void* volatile kstack; diff --git a/kernel/task/include/task/task.h b/kernel/task/include/task/task.h index 40f18a0..99f16dc 100644 --- a/kernel/task/include/task/task.h +++ b/kernel/task/include/task/task.h @@ -4,6 +4,18 @@ #include "collection/list.h" /** + * Wakeup sources define the minimum power level + * at which a task that is waiting in a queue + * can be woken up + */ +enum wakeup_src { + WAKEUP_SRC_OFF = 0, //processor off, external interrupts may trigger this source + WAKEUP_SRC_CLOCK = 1, //main clock required + WAKEUP_SRC_IDLE = 2, //processor can be put in idle state + WAKEUP_SRC_ON = 3 //processor must stay on +}; + +/** * Task control block, contains runtime * information about tasks. */ @@ -23,8 +35,12 @@ struct tcb_t { /** Current wait queue that this task is in.*/ struct list_head queue; + /** ID of task. */ char id; + + enum wakeup_src wakeup_src; + }; /** @@ -39,7 +55,8 @@ struct tcb_t { .mem_high = _declared_stack_##name + stack_size - 1, \ .entry = entry_function, \ .queue = {}, \ - .id = pid \ + .id = pid, \ + .wakeup_src = WAKEUP_SRC_ON \ }; #endif
\ No newline at end of file diff --git a/kernel/task/sched.c b/kernel/task/sched.c index ceaf9bb..1ffd369 100644 --- a/kernel/task/sched.c +++ b/kernel/task/sched.c @@ -7,6 +7,8 @@ struct tcb_t* volatile current = 0; +static struct tcb_t* volatile idle = 0; + struct list_head ready = LIST_HEAD_INIT(ready); void* volatile kstack; @@ -17,6 +19,12 @@ void spawn(struct tcb_t* const tcb) { list_add_tail(&tcb->queue, &ready); } +void spawn_idle(struct tcb_t* const tcb) { + spawn(tcb); + list_del(&tcb->queue); + idle = tcb; +} + void yield(void) { cli(); context_save(); @@ -50,6 +58,6 @@ void schedule() { current = list_entry(ready.next, struct tcb_t, queue); list_move_tail(ready.next, &ready); } else { - panic(); + current = idle; } }
\ No newline at end of file |