aboutsummaryrefslogtreecommitdiff
path: root/kernel/task
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/task')
-rw-r--r--kernel/task/idle.c18
-rw-r--r--kernel/task/include/task/sched.h2
-rw-r--r--kernel/task/include/task/task.h19
-rw-r--r--kernel/task/sched.c10
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