From 01c10b2eadbcd09b6ac34ab80cac1b65c302152e Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 17 Mar 2014 16:28:23 +0100 Subject: implement clock --- kernel/task/include/task/lock.h | 4 ++++ kernel/task/include/task/sched.h | 1 + kernel/time/include/time/clock.h | 8 +++++++ kernel/time/include/time/timer.h | 10 --------- kernel/time/mcu/atmega2560/clock.c | 37 ++++++++++++++++++++++++++++++ kernel/time/mcu/atmega2560/timer.c | 46 -------------------------------------- 6 files changed, 50 insertions(+), 56 deletions(-) create mode 100644 kernel/time/include/time/clock.h delete mode 100644 kernel/time/include/time/timer.h create mode 100644 kernel/time/mcu/atmega2560/clock.c delete mode 100644 kernel/time/mcu/atmega2560/timer.c (limited to 'kernel') diff --git a/kernel/task/include/task/lock.h b/kernel/task/include/task/lock.h index bfb7994..eaa661c 100644 --- a/kernel/task/include/task/lock.h +++ b/kernel/task/include/task/lock.h @@ -9,11 +9,15 @@ typedef char spin_lock_t; static inline void spin_lock(struct spin_lock_t* lock) { while(*lock != SPIN_LOCK_UNLOCKED) {yield();}; + cli(); *lock = 1; + sei(); } static inline void spin_unlock(struct 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 index 9029664..c14a85b 100644 --- a/kernel/task/include/task/sched.h +++ b/kernel/task/include/task/sched.h @@ -2,6 +2,7 @@ #define SCHED_H #include "collection/list.h" +#include "task/task.h" #include "mcu/task/task.h" /** diff --git a/kernel/time/include/time/clock.h b/kernel/time/include/time/clock.h new file mode 100644 index 0000000..3d90cf0 --- /dev/null +++ b/kernel/time/include/time/clock.h @@ -0,0 +1,8 @@ +#ifndef CLOCK_H +#define CLOCK_H + +void clock_init(int ms, void (*tick)()); +void clock_start(); +void clock_stop(); + +#endif \ No newline at end of file diff --git a/kernel/time/include/time/timer.h b/kernel/time/include/time/timer.h deleted file mode 100644 index eaec726..0000000 --- a/kernel/time/include/time/timer.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TIMER_H -#define TIMER_H - -#define HZ 50 - -void timer_init(); -void timer_start(); -void timer_stop(); - -#endif diff --git a/kernel/time/mcu/atmega2560/clock.c b/kernel/time/mcu/atmega2560/clock.c new file mode 100644 index 0000000..6821456 --- /dev/null +++ b/kernel/time/mcu/atmega2560/clock.c @@ -0,0 +1,37 @@ +#include +#include "time/clock.h" +#include "task/sched.h" +#include "mcu/task/context.h" + +static void (*on_tick)(); + +void clock_init(int ms, void (*tick)()) { + TCCR3A = 0; + TCCR3B = 0; + TCCR3C = 0; + + TCCR3B = (1 << WGM32); // turn on CTC mode: + TCCR3B |= (1 << CS32) | (0 << CS31) | (1 << CS30); // set to 1024 prescaler + + unsigned long int fcpu = (unsigned long int) F_CPU; + unsigned long int hz = 1000l / ((unsigned long int) ms); + + unsigned long int hz_counter = fcpu / (1024 * (hz)) - 1; + OCR3A = hz_counter; + on_tick = tick; +} + +void clock_start() { + TIMSK3 |= (1 << OCIE3A); +} + +void clock_stop() { + TIMSK3 &= ~(1 << OCIE3A); +} + +ISR(TIMER3_COMPA_vect, ISR_NAKED) { + context_save(); + on_tick(); + context_restore(); + reti(); +} diff --git a/kernel/time/mcu/atmega2560/timer.c b/kernel/time/mcu/atmega2560/timer.c deleted file mode 100644 index 03f1ed5..0000000 --- a/kernel/time/mcu/atmega2560/timer.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "sched/sched.h" -#include "time/timer.h" - -void timer_init() { - cli(); - TCCR3A = 0; - TCCR3B = 0; - TCCR3C = 0; - - TCCR3B = (1 << WGM32); // turn on CTC mode: - TCCR3B |= (1 << CS32) | (0 << CS31) | (1 << CS30); // set to 1024 prescaler - - unsigned long int hz_counter = ((unsigned long int) F_CPU) / (1024 * ((unsigned long int) HZ)) - 1; - OCR3A = hz_counter; - sei(); -} - -void timer_start() { - TIMSK3 |= (1 << OCIE3A); -} - -void timer_stop() { - TIMSK3 &= ~(1 << OCIE3A); -} - -#include -void led13(int on) { - if (on) { - DDRB |= (1 << 7); - PORTB |= (1 << 7); - } else { - DDRB &= ~(1 << 7); - PORTB &= ~(1 << 7); - } -} - -ISR(TIMER3_COMPA_vect, ISR_NAKED) { - SAVE_CONTEXT(); - static int on = 0; - on = !on; - led13(on); - sched_tick(); - RESTORE_CONTEXT(); - asm volatile ("reti"); -} -- cgit v1.2.3