[update] 获取timer count时,防止因中断到来导致overflow更新

This commit is contained in:
luanxueguang 2020-11-21 17:44:52 +08:00
parent 9dc0bbb814
commit accb73d8df
1 changed files with 8 additions and 1 deletions

View File

@ -10,6 +10,7 @@
#include <rtthread.h> #include <rtthread.h>
#include <rtdevice.h> #include <rtdevice.h>
#include <rthw.h>
rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv) rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv)
{ {
@ -144,19 +145,25 @@ static rt_size_t rt_hwtimer_read(struct rt_device *dev, rt_off_t pos, void *buff
rt_hwtimer_t *timer; rt_hwtimer_t *timer;
rt_hwtimerval_t tv; rt_hwtimerval_t tv;
rt_uint32_t cnt; rt_uint32_t cnt;
rt_base_t level;
rt_int32_t overflow;
float t; float t;
timer = (rt_hwtimer_t *)dev; timer = (rt_hwtimer_t *)dev;
if (timer->ops->count_get == RT_NULL) if (timer->ops->count_get == RT_NULL)
return 0; return 0;
level = rt_hw_interrupt_disable();
cnt = timer->ops->count_get(timer); cnt = timer->ops->count_get(timer);
overflow = timer->overflow;
rt_hw_interrupt_enable(level);
if (timer->info->cntmode == HWTIMER_CNTMODE_DW) if (timer->info->cntmode == HWTIMER_CNTMODE_DW)
{ {
cnt = (timer->freq * timer->period_sec) - cnt; cnt = (timer->freq * timer->period_sec) - cnt;
} }
t = timer->overflow * timer->period_sec + cnt/(float)timer->freq; t = overflow * timer->period_sec + cnt/(float)timer->freq;
tv.sec = t; tv.sec = t;
tv.usec = (t - tv.sec) * 1000000; tv.usec = (t - tv.sec) * 1000000;
size = size > sizeof(tv)? sizeof(tv) : size; size = size > sizeof(tv)? sizeof(tv) : size;