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 <youvedeep.singh@intel.com>
This commit is contained in:
Youvedeep Singh 2017-08-10 13:12:54 +05:30 committed by Andrew Boie
commit d787e3c554
2 changed files with 13 additions and 3 deletions

View file

@ -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;

View file

@ -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);
}