diff options
| author | xieyangrun <[email protected]> | 2020-01-15 09:34:47 +0800 |
|---|---|---|
| committer | xieyangrun <[email protected]> | 2020-01-15 09:34:47 +0800 |
| commit | 3b87cb8ded4437316b74d220217c4440fdda249f (patch) | |
| tree | e2c564a47badcb96a74b923f7a0b99fe15b1558b | |
| parent | cad32a326ce5774044837197fe566f0d5bd69ca9 (diff) | |
[src/timer.c]fixed rt_timer_list_next_timeout multi-task safe
| -rw-r--r-- | src/timer.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/timer.c b/src/timer.c index 3992cf6ff4..d85ee080b5 100644 --- a/src/timer.c +++ b/src/timer.c @@ -108,14 +108,23 @@ static void _rt_timer_init(rt_timer_t timer, static rt_tick_t rt_timer_list_next_timeout(rt_list_t timer_list[]) { struct rt_timer *timer; + register rt_base_t level; + rt_tick_t timeout_tick = RT_TICK_MAX; - if (rt_list_isempty(&timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1])) - return RT_TICK_MAX; + /* disable interrupt */ + level = rt_hw_interrupt_disable(); - timer = rt_list_entry(timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next, - struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]); + if (!rt_list_isempty(&timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1])) + { + timer = rt_list_entry(timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next, + struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]); + timeout_tick = timer->timeout_tick; + } + + /* enable interrupt */ + rt_hw_interrupt_enable(level); - return timer->timeout_tick; + return timeout_tick; } rt_inline void _rt_timer_remove(rt_timer_t timer) |
