From 72744c19b189721168cb285e7e886dfc93cd5b96 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 24 Apr 2023 22:17:35 -0300 Subject: [PATCH] timer: resume and stop --- kernel-src/include/kernel/timer.h | 3 ++- kernel-src/sys/timer.c | 28 ++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/kernel-src/include/kernel/timer.h b/kernel-src/include/kernel/timer.h index e7fdc145..53eafbe4 100644 --- a/kernel-src/include/kernel/timer.h +++ b/kernel-src/include/kernel/timer.h @@ -20,7 +20,8 @@ typedef struct { time_t (*stop)(); timerentry_t *queue; } timer_t; - +void timer_resume(timer_t *timer); +void timer_stop(timer_t *timer); void timer_isr(timer_t *timer, context_t *context); void timer_insert(timer_t *timer, timerentry_t *entry, time_t us); timer_t *timer_new(time_t ticksperus, void (*arm)(time_t), time_t (*stop)()); diff --git a/kernel-src/sys/timer.c b/kernel-src/sys/timer.c index 95fa3dd1..b74cc85c 100644 --- a/kernel-src/sys/timer.c +++ b/kernel-src/sys/timer.c @@ -20,6 +20,30 @@ void timer_isr(timer_t *timer, context_t *context) { oldentry->func(oldentry->private, context); } +void timer_resume(timer_t *timer) { + spinlock_acquire(&timer->lock); + + if (timer->queue == NULL) + goto leave; + + // TODO handle difference being 0 + __assert(timer->queue->absolutetick > timer->tickcurrent); + timer->arm(timer->queue->absolutetick - timer->tickcurrent); + + leave: + spinlock_release(&timer->lock); +} + +void timer_stop(timer_t *timer) { + long oldipl = interrupt_setipl(IPL_TIMER); + spinlock_acquire(&timer->lock); + + timer->tickcurrent += timer->stop(timer); + + spinlock_release(&timer->lock); + interrupt_setipl(oldipl); +} + void timer_insert(timer_t *timer, timerentry_t* entry, time_t us) { long oldipl = interrupt_setipl(IPL_TIMER); spinlock_acquire(&timer->lock); @@ -52,10 +76,6 @@ void timer_insert(timer_t *timer, timerentry_t* entry, time_t us) { } } - // TODO handle this case properly - __assert(timer->queue->absolutetick > timer->tickcurrent); - timer->arm(timer->queue->absolutetick - timer->tickcurrent); - spinlock_release(&timer->lock); interrupt_setipl(oldipl); }