aboutsummaryrefslogtreecommitdiff
path: root/kernel/sched
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-01-25 01:22:40 +0100
committerJakob Odersky <jodersky@gmail.com>2014-01-25 01:22:40 +0100
commit06c4f980e915c2ec6c685ca2ba8781b9af547239 (patch)
tree94634dc4798809e0fa6180ed44e655afcab5b1a3 /kernel/sched
parent9a10159e96a13585f9040ac5b15a3520f3d93ec8 (diff)
downloadmux-06c4f980e915c2ec6c685ca2ba8781b9af547239.tar.gz
mux-06c4f980e915c2ec6c685ca2ba8781b9af547239.tar.bz2
mux-06c4f980e915c2ec6c685ca2ba8781b9af547239.zip
fix freezing
Diffstat (limited to 'kernel/sched')
-rw-r--r--kernel/sched/idle.c12
-rw-r--r--kernel/sched/include/sched/sched.h7
-rw-r--r--kernel/sched/mcu/atmega2560/context.c3
-rw-r--r--kernel/sched/mcu/atmega2560/include/mcu/sched/context.h1
-rw-r--r--kernel/sched/sched.c26
5 files changed, 23 insertions, 26 deletions
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index d55d694..85f35a3 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -6,12 +6,12 @@
void idle_entry(char args) {
while(1) {
- set_sleep_mode(SLEEP_MODE_IDLE);
- cli();
- sleep_enable();
- sei();
- sleep_cpu();
- sleep_disable();
+ //set_sleep_mode(SLEEP_MODE_IDLE);
+ //cli();
+ //sleep_enable();
+ //sei();
+ //sleep_cpu();
+ //sleep_disable();
};
}
diff --git a/kernel/sched/include/sched/sched.h b/kernel/sched/include/sched/sched.h
index a7f45ee..5e45328 100644
--- a/kernel/sched/include/sched/sched.h
+++ b/kernel/sched/include/sched/sched.h
@@ -76,9 +76,7 @@ static inline void sleep_on(struct list_head* 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(struct list_head* queue) {
- list_splice_init(queue, ready.prev);
-}
+void wake_all(struct list_head* queue);
/**
* Initializes the scheduler by setting up kstack, initializing the idle task
@@ -108,9 +106,6 @@ void spawn(struct tcb_t* const tcb, char args);
*/
void yield() __attribute__ ( ( naked ) );
-void freeze() __attribute__ ( ( naked ) );
-
-
#define ENTER_CRITICAL() cli()
#define EXIT_CRITICAL() sei()
diff --git a/kernel/sched/mcu/atmega2560/context.c b/kernel/sched/mcu/atmega2560/context.c
index ef7e172..10f16a9 100644
--- a/kernel/sched/mcu/atmega2560/context.c
+++ b/kernel/sched/mcu/atmega2560/context.c
@@ -4,6 +4,7 @@ char* init_stack(const char* const mem_low, const char* const mem_high, void (*e
char* sp = (char*) mem_high;
unsigned long address = (unsigned long) entry;
+ // pattern for debugging purposes
*sp = (char) 0x1;
sp--;
*sp = (char) 0x2;
@@ -13,6 +14,7 @@ char* init_stack(const char* const mem_low, const char* const mem_high, void (*e
*sp = (char) 0x2;
sp--;
+ // put return address on stack
*sp = (char) ( address & (unsigned short) 0x00ff );
sp--;
@@ -22,6 +24,7 @@ char* init_stack(const char* const mem_low, const char* const mem_high, void (*e
*sp = (char) ( (address >> 16) & ( unsigned short ) 0x00ff );
sp--;
+ // save registers
*sp = (char) 0x00; //r0
sp--;
*sp = (char) 0x80; //SREG, enable interrupts when task starts
diff --git a/kernel/sched/mcu/atmega2560/include/mcu/sched/context.h b/kernel/sched/mcu/atmega2560/include/mcu/sched/context.h
index d3b324c..437e7f3 100644
--- a/kernel/sched/mcu/atmega2560/include/mcu/sched/context.h
+++ b/kernel/sched/mcu/atmega2560/include/mcu/sched/context.h
@@ -13,7 +13,6 @@
asm volatile ( \
"push r0 \n\t" \
"in r0, __SREG__ \n\t" \
- "cli \n\t" \
"push r0 \n\t" \
"push r1 \n\t" \
"clr r1 \n\t" \
diff --git a/kernel/sched/sched.c b/kernel/sched/sched.c
index bc3b30d..609c81b 100644
--- a/kernel/sched/sched.c
+++ b/kernel/sched/sched.c
@@ -14,8 +14,8 @@ static void init_idle() {
}
void sched_init() {
- init_kstack((char **) &kstack);
init_idle();
+ init_kstack((char **) &kstack);
schedule();
sei();
RESTORE_CONTEXT();
@@ -25,30 +25,30 @@ void sched_init() {
void schedule() {
if(!list_empty(&ready)) {
current = list_entry(ready.next, struct tcb_t, q);
- list_move_tail(&current->q, &ready);
+ list_move_tail(ready.next, &ready);
} else {
current = &idle;
}
}
+void wake_all(struct list_head* queue) {
+ list_splice_init(queue, ready.prev);
+ if (current == &idle) {
+ schedule();
+ }
+}
+
void spawn(struct tcb_t* const tcb, char args) {
tcb->sp = init_stack(tcb->mem_low, tcb->mem_high, tcb->entry, args);
INIT_LIST_HEAD(&tcb->q);
list_add_tail(&tcb->q, &ready);
}
-void yield() {
+void yield(void) {
+ cli();
SAVE_CONTEXT();
schedule();
RESTORE_CONTEXT();
+ sei();
RETURN();
-}
-
-void freeze() {
- SAVE_CONTEXT();
- list_del_init(&current->q);
- schedule();
- RESTORE_CONTEXT();
- asm volatile ( "ret" );
-}
-
+} \ No newline at end of file