aboutsummaryrefslogtreecommitdiff
path: root/kernel/task
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/task')
-rw-r--r--kernel/task/idle.c19
-rw-r--r--kernel/task/include/task/idle.h6
-rw-r--r--kernel/task/include/task/lock.h24
-rw-r--r--kernel/task/include/task/sched.h58
-rw-r--r--kernel/task/include/task/task.h46
-rw-r--r--kernel/task/mcu/atmega2560/context.c98
-rw-r--r--kernel/task/mcu/atmega2560/include/mcu/task/context.h117
-rw-r--r--kernel/task/mcu/atmega2560/include/mcu/task/task.h11
-rw-r--r--kernel/task/sched.c55
9 files changed, 0 insertions, 434 deletions
diff --git a/kernel/task/idle.c b/kernel/task/idle.c
deleted file mode 100644
index 7d6576d..0000000
--- a/kernel/task/idle.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#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/idle.h b/kernel/task/include/task/idle.h
deleted file mode 100644
index 3b6e40a..0000000
--- a/kernel/task/include/task/idle.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef IDLE_H
-#define IDLE_H
-
-void idle_entry(char args);
-
-#endif \ No newline at end of file
diff --git a/kernel/task/include/task/lock.h b/kernel/task/include/task/lock.h
deleted file mode 100644
index 47246b2..0000000
--- a/kernel/task/include/task/lock.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef LOCK_H
-#define LOCK_H
-
-#include "task/sched.h"
-
-typedef volatile char spin_lock_t;
-
-#define SPIN_LOCK_UNLOCKED 0
-#define SPIN_LOCK_LOCKED 0
-
-static inline void spin_lock(spin_lock_t* lock) {
- while(*lock != SPIN_LOCK_UNLOCKED) {yield();};
- cli();
- *lock = SPIN_LOCK_LOCKED;
- sei();
-}
-
-static inline void spin_unlock(spin_lock_t* lock) {
- cli();
- *lock = SPIN_LOCK_UNLOCKED;
- sei();
-}
-
-#endif \ No newline at end of file
diff --git a/kernel/task/include/task/sched.h b/kernel/task/include/task/sched.h
deleted file mode 100644
index b8946db..0000000
--- a/kernel/task/include/task/sched.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef SCHED_H
-#define SCHED_H
-
-#include "collection/list.h"
-#include "task/task.h"
-#include "mcu/task/task.h"
-
-/**
- * Points to currently executing task. If no scheduling has been enabled,
- * this points to NULL
- */
-extern struct tcb_t* volatile current;
-
-/**
- * Queue that contains all tasks that are ready to be run, awaiting their
- * turn from the scheduler.
- */
-extern struct list_head ready;
-
-/**
- * Makes the current task sleep on a specific queue.
- * This moves the current task to the given queue's tail.
- */
-static inline void sleep_queue(struct list_head* queue) {
- list_move_tail(&current->queue, 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_queue(struct list_head* queue) {
- list_splice_init(queue, ready.prev);
-}
-
-/**
- * Initializes a given task and adds it to the ready queue.
- */
-void spawn(struct tcb_t* const tcb);
-
-/**
- * Voluntarily relinquishes control of the CPU from the current task to the scheduler.
- */
-void yield() __attribute__ ( ( naked ) );
-
-
-/**
- * Initializes the scheduler by setting up kstack, initializing the idle task
- * and selecting the first task to run.
- */
-void sched_init();
-
-/**
- * Enters the scheduler, setting current to the next runnable task.
- */
-void schedule();
-
-#endif
diff --git a/kernel/task/include/task/task.h b/kernel/task/include/task/task.h
deleted file mode 100644
index 120bda4..0000000
--- a/kernel/task/include/task/task.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef TASK_H
-#define TASK_H
-
-#include "collection/list.h"
-
-/**
- * Task control block, contains runtime
- * information about tasks.
- */
-struct tcb_t {
- /** Stack pointer of this task. (must be first in structure) */
- char* volatile sp;
-
- /** Lowest address of this task's memory (inclusive). */
- char* mem_low;
-
- /** Highest address of this task's memory (inclusive). */
- char* mem_high;
-
- /** Entry function of this task. */
- void (*entry)(char);
-
- /** Current wait queue that this task is in.*/
- struct list_head queue;
-
- /** ID of task. */
- char id;
-
-};
-
-/**
- * Utility for declaring a task with statically allocated memory.
- * Note: for a task to be scheduled, it must first be spawned (see spawn()).
-*/
-#define DECLARE_TASK(name, stack_size, entry_function, pid) \
- static char _declared_stack_##name[stack_size]; \
- static struct tcb_t name = { \
- .sp = 0, \
- .mem_low = _declared_stack_##name, \
- .mem_high = _declared_stack_##name + stack_size - 1, \
- .entry = entry_function, \
- .queue = {}, \
- .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
deleted file mode 100644
index 9bb7036..0000000
--- a/kernel/task/mcu/atmega2560/context.c
+++ /dev/null
@@ -1,98 +0,0 @@
-#include "mcu/task/context.h"
-
-char* stack_init(const char* const mem_low, const char* const mem_high, void (*entry)(char), char args) {
- char* sp = (char*) mem_high;
- 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--;
-
- // 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--;
-
- // save registers
- *sp = (char) 0x00; //r0
- sp--;
- *sp = (char) 0x80; //SREG, enable interrupts when task starts
- sp--;
- *sp = ( char ) 0x00; //r1
- sp--;
- *sp = ( char ) 0x00; //r2
- sp--;
- *sp = ( char ) 0x00; //r3
- sp--;
- *sp = ( char ) 0x00; //r4
- sp--;
- *sp = ( char ) 0x00; //r5
- sp--;
- *sp = ( char ) 0x00; //r6
- sp--;
- *sp = ( char ) 0x00; //r7
- sp--;
- *sp = ( char ) 0x00; //r8
- sp--;
- *sp = ( char ) 0x00; //r9
- sp--;
- *sp = ( char ) 0x00; //r10
- sp--;
- *sp = ( char ) 0x00; //r11
- sp--;
- *sp = ( char ) 0x00; //r12
- sp--;
- *sp = ( char ) 0x00; //r13
- sp--;
- *sp = ( char ) 0x00; //r14
- sp--;
- *sp = ( char ) 0x00; //r15
- sp--;
- *sp = ( char ) 0x00; //r16
- sp--;
- *sp = ( char ) 0x00; //r17
- sp--;
- *sp = ( char ) 0x00; //r18
- sp--;
- *sp = ( char ) 0x00; //r19
- sp--;
- *sp = ( char ) 0x00; //r20
- sp--;
- *sp = ( char ) 0x00; //r21
- sp--;
- *sp = ( char ) 0x00; //r22
- sp--;
- *sp = ( char ) 0x00; //r23
- sp--;
-
- *sp = (char) ( args ); //place first argument in register 24
- sp--;
-
- *sp = ( char ) 0x00; //r25
- sp--;
- *sp = ( char ) 0x00; //r26
- sp--;
- *sp = ( char ) 0x00; //r27
- sp--;
- *sp = ( char ) 0x00; //r28
- sp--;
- *sp = ( char ) 0x00; //r29
- sp--;
- *sp = ( char ) 0x00; //r30
- sp--;
- *sp = ( char ) 0x00; //r31
- 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
deleted file mode 100644
index 0de1fb4..0000000
--- a/kernel/task/mcu/atmega2560/include/mcu/task/context.h
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef MCU_CONTEXT_H
-#define MCU_CONTEXT_H
-
-#include <avr/interrupt.h>
-#define ret() asm volatile ( "ret" )
-
-/*
- * The macros save_context(), restore_context() as well as the code contained in
- * init_stack is adapted from the FreeRTOS kernel (http://www.freertos.org/).
- * Here by copyright, credits attributed to wherever they belong.
- */
-
-/**
- * Save context to memory location specified by first two chars of
- * a symbol named 'current' (this is why 'sp' has to be the first element of
- * of task control blocks). After executing this macro, the stack pointer will
- * be set to the address contained in 'kstack'.
- */
-#define context_save() \
- 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" \
- "push r2 \n\t" \
- "push r3 \n\t" \
- "push r4 \n\t" \
- "push r5 \n\t" \
- "push r6 \n\t" \
- "push r7 \n\t" \
- "push r8 \n\t" \
- "push r9 \n\t" \
- "push r10 \n\t" \
- "push r11 \n\t" \
- "push r12 \n\t" \
- "push r13 \n\t" \
- "push r14 \n\t" \
- "push r15 \n\t" \
- "push r16 \n\t" \
- "push r17 \n\t" \
- "push r18 \n\t" \
- "push r19 \n\t" \
- "push r20 \n\t" \
- "push r21 \n\t" \
- "push r22 \n\t" \
- "push r23 \n\t" \
- "push r24 \n\t" \
- "push r25 \n\t" \
- "push r26 \n\t" \
- "push r27 \n\t" \
- "push r28 \n\t" \
- "push r29 \n\t" \
- "push r30 \n\t" \
- "push r31 \n\t" \
- "lds r26, current \n\t" \
- "lds r27, current +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" \
- )
-
-
-/**
- * Restore context to memory location specified by first two chars of
- * a symbol named 'current'.
- */
-#define context_restore() \
- asm volatile ( \
- "lds r26, current \n\t" \
- "lds r27, current + 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" \
- "pop r31 \n\t" \
- "pop r30 \n\t" \
- "pop r29 \n\t" \
- "pop r28 \n\t" \
- "pop r27 \n\t" \
- "pop r26 \n\t" \
- "pop r25 \n\t" \
- "pop r24 \n\t" \
- "pop r23 \n\t" \
- "pop r22 \n\t" \
- "pop r21 \n\t" \
- "pop r20 \n\t" \
- "pop r19 \n\t" \
- "pop r18 \n\t" \
- "pop r17 \n\t" \
- "pop r16 \n\t" \
- "pop r15 \n\t" \
- "pop r14 \n\t" \
- "pop r13 \n\t" \
- "pop r12 \n\t" \
- "pop r11 \n\t" \
- "pop r10 \n\t" \
- "pop r9 \n\t" \
- "pop r8 \n\t" \
- "pop r7 \n\t" \
- "pop r6 \n\t" \
- "pop r5 \n\t" \
- "pop r4 \n\t" \
- "pop r3 \n\t" \
- "pop r2 \n\t" \
- "pop r1 \n\t" \
- "pop r0 \n\t" \
- "out __SREG__, r0 \n\t" \
- "pop r0 \n\t" \
- )
-
-/** 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);
-
-#endif
diff --git a/kernel/task/mcu/atmega2560/include/mcu/task/task.h b/kernel/task/mcu/atmega2560/include/mcu/task/task.h
deleted file mode 100644
index d9823af..0000000
--- a/kernel/task/mcu/atmega2560/include/mcu/task/task.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef MCU_TASK_H
-#define MACU_TASK_H
-
-
-/** Default stack size, you may use this definition for declaring tasks. */
-#define DEFAULT_STACK_SIZE 256
-
-/** Stack size to be allocated for the idle task. */
-#define IDLE_STACK_SIZE 64
-
-#endif \ No newline at end of file
diff --git a/kernel/task/sched.c b/kernel/task/sched.c
deleted file mode 100644
index 5989136..0000000
--- a/kernel/task/sched.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "bug/panic.h"
-#include "task/task.h"
-#include "task/sched.h"
-#include "mcu/task/context.h"
-
-
-struct tcb_t* volatile current = 0;
-
-static struct tcb_t* volatile idle = 0;
-
-struct list_head ready = LIST_HEAD_INIT(ready);
-
-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);
- 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) {
- context_save();
- schedule();
- context_restore();
- ret();
-}
-
-void sched_init() {
- 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)) {
- current = list_entry(ready.next, struct tcb_t, queue);
- list_move_tail(ready.next, &ready);
- debug_led(0,1);
- } else {
- current = idle;
- debug_led(0,0);
- }
-} \ No newline at end of file