diff options
Diffstat (limited to 'kernel/task/mcu')
-rw-r--r-- | kernel/task/mcu/atmega2560/context.c | 48 | ||||
-rw-r--r-- | kernel/task/mcu/atmega2560/include/mcu/task/context.h | 26 |
2 files changed, 27 insertions, 47 deletions
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 |