diff options
Diffstat (limited to 'kernel/task')
-rw-r--r-- | kernel/task/include/task/sched.h | 6 | ||||
-rw-r--r-- | kernel/task/include/task/task.h | 18 | ||||
-rw-r--r-- | kernel/task/mcu/atmega2560/context.c | 48 | ||||
-rw-r--r-- | kernel/task/mcu/atmega2560/include/mcu/task/context.h | 26 | ||||
-rw-r--r-- | kernel/task/sched.c | 10 |
5 files changed, 28 insertions, 80 deletions
diff --git a/kernel/task/include/task/sched.h b/kernel/task/include/task/sched.h index 6dcd67c..b8946db 100644 --- a/kernel/task/include/task/sched.h +++ b/kernel/task/include/task/sched.h @@ -17,12 +17,6 @@ extern struct tcb_t* volatile current; */ extern struct list_head ready; -/** - * Stack pointer for operations performed out of task context, including any - * calls made after context save. - */ -extern void* volatile kstack; - /** * Makes the current task sleep on a specific queue. * This moves the current task to the given queue's tail. diff --git a/kernel/task/include/task/task.h b/kernel/task/include/task/task.h index 99f16dc..120bda4 100644 --- a/kernel/task/include/task/task.h +++ b/kernel/task/include/task/task.h @@ -4,18 +4,6 @@ #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. */ @@ -38,9 +26,6 @@ struct tcb_t { /** ID of task. */ char id; - - enum wakeup_src wakeup_src; - }; /** @@ -55,8 +40,7 @@ struct tcb_t { .mem_high = _declared_stack_##name + stack_size - 1, \ .entry = entry_function, \ .queue = {}, \ - .id = pid, \ - .wakeup_src = WAKEUP_SRC_ON \ + .id = pid \ }; #endif
\ No newline at end of file diff --git a/kernel/task/mcu/atmega2560/context.c b/kernel/task/mcu/atmega2560/context.c index bcc2130..9bb7036 100644 --- a/kernel/task/mcu/atmega2560/context.c +++ b/kernel/task/mcu/atmega2560/context.c @@ -5,26 +5,26 @@ char* stack_init(const char* const mem_low, const char* const mem_high, void (*e unsigned long address = (unsigned long) entry; // pattern for debugging purposes - *sp = (char) 0x1; - sp--; - *sp = (char) 0x2; - sp--; - *sp = (char) 0x1; - sp--; - *sp = (char) 0x2; - sp--; + *sp = (char) 0x1; + sp--; + *sp = (char) 0x2; + sp--; + *sp = (char) 0x1; + sp--; + *sp = (char) 0x2; + sp--; - // put return address on stack - *sp = (char) ( address & (unsigned short) 0x00ff ); + // put return address on stack + *sp = (char) ( address & (unsigned short) 0x00ff ); sp--; *sp = (char) ( (address >> 8) & ( unsigned short ) 0x00ff ); sp--; - *sp = (char) ( (address >> 16) & ( unsigned short ) 0x00ff ); + *sp = (char) ( (address >> 16) & ( unsigned short ) 0x00ff ); sp--; - // save registers + // save registers *sp = (char) 0x00; //r0 sp--; *sp = (char) 0x80; //SREG, enable interrupts when task starts @@ -69,30 +69,30 @@ char* stack_init(const char* const mem_low, const char* const mem_high, void (*e sp--; *sp = ( char ) 0x00; //r20 sp--; - *sp = ( char ) 0x00; //r21 + *sp = ( char ) 0x00; //r21 sp--; - *sp = ( char ) 0x00; //r22 + *sp = ( char ) 0x00; //r22 sp--; - *sp = ( char ) 0x00; //r23 + *sp = ( char ) 0x00; //r23 sp--; - *sp = (char) ( args ); //place first argument in register 24 + *sp = (char) ( args ); //place first argument in register 24 sp--; - *sp = ( char ) 0x00; //r25 + *sp = ( char ) 0x00; //r25 sp--; - *sp = ( char ) 0x00; //r26 + *sp = ( char ) 0x00; //r26 sp--; - *sp = ( char ) 0x00; //r27 + *sp = ( char ) 0x00; //r27 sp--; - *sp = ( char ) 0x00; //r28 + *sp = ( char ) 0x00; //r28 sp--; - *sp = ( char ) 0x00; //r29 + *sp = ( char ) 0x00; //r29 sp--; - *sp = ( char ) 0x00; //r30 + *sp = ( char ) 0x00; //r30 sp--; - *sp = ( char ) 0x00; //r31 + *sp = ( char ) 0x00; //r31 sp--; - return sp; + return sp; } diff --git a/kernel/task/mcu/atmega2560/include/mcu/task/context.h b/kernel/task/mcu/atmega2560/include/mcu/task/context.h index b717991..0de1fb4 100644 --- a/kernel/task/mcu/atmega2560/include/mcu/task/context.h +++ b/kernel/task/mcu/atmega2560/include/mcu/task/context.h @@ -1,5 +1,5 @@ -#ifndef CONTEXT_H -#define CONTEXT_H +#ifndef MCU_CONTEXT_H +#define MCU_CONTEXT_H #include <avr/interrupt.h> #define ret() asm volatile ( "ret" ) @@ -20,6 +20,7 @@ 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" \ @@ -59,12 +60,6 @@ "st x+, r0 \n\t" \ "in r0, __SP_H__ \n\t" \ "st x+, r0 \n\t" \ - "lds r26, kstack \n\t" \ - "lds r27, kstack + 1 \n\t" \ - "ld r28, x+ \n\t" \ - "out __SP_L__, r28 \n\t" \ - "ld r29, x+ \n\t" \ - "out __SP_H__, r29 \n\t" \ ) @@ -74,12 +69,6 @@ */ #define context_restore() \ asm volatile ( \ - "lds r26, kstack \n\t" \ - "lds r27, kstack +1 \n\t" \ - "in r0, __SP_L__ \n\t" \ - "st x+, r0 \n\t" \ - "in r0, __SP_H__ \n\t" \ - "st x+, r0 \n\t" \ "lds r26, current \n\t" \ "lds r27, current + 1 \n\t" \ "ld r28, x+ \n\t" \ @@ -125,13 +114,4 @@ /** Initialize the given memory addresses to contain a valid, initial stackframe. */ char* stack_init(const char* const mem_low, const char* const mem_high, void (*entry)(char), char args); -/** Initialize the given memory addresses to contain a valid, initial stackframe. */ -static inline void kstack_init(void **kstack) { - //this sets the kernel stack to the default stack location - //of this mcu, namely the top (stacks of tasks will typically - //be contained in memory allocated on the head and thus should - //overflow with the kernel stack) - *kstack = (void*) SP; -} - #endif diff --git a/kernel/task/sched.c b/kernel/task/sched.c index 1ffd369..da7b59d 100644 --- a/kernel/task/sched.c +++ b/kernel/task/sched.c @@ -2,7 +2,6 @@ #include "task/task.h" #include "task/sched.h" #include "mcu/task/context.h" -#include "mcu/task/context.h" struct tcb_t* volatile current = 0; @@ -11,8 +10,6 @@ static struct tcb_t* volatile idle = 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); @@ -26,32 +23,25 @@ void spawn_idle(struct tcb_t* const tcb) { } void yield(void) { - cli(); context_save(); schedule(); context_restore(); - sei(); ret(); } - void sched_init() { - kstack_init(&kstack); schedule(); context_restore(); sei(); ret(); } - #include <avr/io.h> void toggle_led() { DDRB |= (1 << 7); PORTB ^= (1 << 7); } - - void schedule() { toggle_led(); if(!list_empty(&ready)) { |