diff options
| author | Bernard Xiong <[email protected]> | 2020-12-29 08:27:11 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-12-29 08:27:11 +0800 |
| commit | 94ba15a80b4856b9654aefa0510465b084a7e459 (patch) | |
| tree | 3342836ad0a90b513bd8c1c79a355ab101756f3f /components/drivers | |
| parent | a4af034384ae8a14ba2990693513794a0a0f7d72 (diff) | |
| parent | accb73d8df905813ebf2d0cb60b279c6234796ee (diff) | |
Merge pull request #4062 from luanxg/lxg_dev
[update] 获取timer count时,防止因中断到来导致overflow更新
Diffstat (limited to 'components/drivers')
| -rw-r--r-- | components/drivers/hwtimer/hwtimer.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/components/drivers/hwtimer/hwtimer.c b/components/drivers/hwtimer/hwtimer.c index 3953919fae..976d8bbf32 100644 --- a/components/drivers/hwtimer/hwtimer.c +++ b/components/drivers/hwtimer/hwtimer.c @@ -10,6 +10,7 @@ #include <rtthread.h> #include <rtdevice.h> +#include <rthw.h> 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_hwtimerval_t tv; rt_uint32_t cnt; + rt_base_t level; + rt_int32_t overflow; float t; timer = (rt_hwtimer_t *)dev; if (timer->ops->count_get == RT_NULL) return 0; + level = rt_hw_interrupt_disable(); cnt = timer->ops->count_get(timer); + overflow = timer->overflow; + rt_hw_interrupt_enable(level); + if (timer->info->cntmode == HWTIMER_CNTMODE_DW) { 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.usec = (t - tv.sec) * 1000000; size = size > sizeof(tv)? sizeof(tv) : size; |
