From d787e3c5540adc1a4c8c37451ec2656afab7027a Mon Sep 17 00:00:00 2001 From: Youvedeep Singh Date: Thu, 10 Aug 2017 13:12:54 +0530 Subject: [PATCH] timer: k_timer_start should accept 0 as duration parameter. k_timer_start(timer, duration, period) is API used to start a timer. Currently duration parameters accepts only positive number. But a user may require to do some periodic activity ASAP and start timer with 0 value. So this patch allows 0 as minimum value of duration. In this patch, when duration value is set as 0 then timer expiration handler is called instead of submiting this into timeout queue. Jira: ZEP-2497 Signed-off-by: Youvedeep Singh --- kernel/include/timeout_q.h | 12 +++++++++++- kernel/timer.c | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/kernel/include/timeout_q.h b/kernel/include/timeout_q.h index b9798d76179..70e4caeab2a 100644 --- a/kernel/include/timeout_q.h +++ b/kernel/include/timeout_q.h @@ -197,7 +197,7 @@ static inline void _add_timeout(struct k_thread *thread, _wait_q_t *wait_q, s32_t timeout_in_ticks) { - __ASSERT(timeout_in_ticks > 0, ""); + __ASSERT(timeout_in_ticks >= 0, ""); timeout->delta_ticks_from_prev = timeout_in_ticks; timeout->thread = thread; @@ -207,6 +207,16 @@ static inline void _add_timeout(struct k_thread *thread, _dump_timeout(timeout, 0); _dump_timeout_q(); + /* If timer is submitted to expire ASAP with + * timeout_in_ticks (duration) as zero value, + * then handle timeout immedately without going + * through timeout queue. + */ + if (!timeout_in_ticks) { + _handle_one_expired_timeout(timeout); + return; + } + s32_t *delta = &timeout->delta_ticks_from_prev; struct _timeout *in_q; diff --git a/kernel/timer.c b/kernel/timer.c index b60e20759c1..7c7605adcdc 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -114,7 +114,7 @@ void k_timer_start(struct k_timer *timer, s32_t duration, s32_t period) volatile s32_t period_in_ticks, duration_in_ticks; period_in_ticks = _ms_to_ticks(period); - duration_in_ticks = _TICK_ALIGN + _ms_to_ticks(duration); + duration_in_ticks = _ms_to_ticks(duration); unsigned int key = irq_lock(); @@ -123,8 +123,8 @@ void k_timer_start(struct k_timer *timer, s32_t duration, s32_t period) } timer->period = period_in_ticks; - _add_timeout(NULL, &timer->timeout, &timer->wait_q, duration_in_ticks); timer->status = 0; + _add_timeout(NULL, &timer->timeout, &timer->wait_q, duration_in_ticks); irq_unlock(key); }