Skip to content

Commit accb73d

Browse files
committed
[update] 获取timer count时,防止因中断到来导致overflow更新
1 parent 9dc0bbb commit accb73d

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

components/drivers/hwtimer/hwtimer.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <rtthread.h>
1212
#include <rtdevice.h>
13+
#include <rthw.h>
1314

1415
rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv)
1516
{
@@ -144,19 +145,25 @@ static rt_size_t rt_hwtimer_read(struct rt_device *dev, rt_off_t pos, void *buff
144145
rt_hwtimer_t *timer;
145146
rt_hwtimerval_t tv;
146147
rt_uint32_t cnt;
148+
rt_base_t level;
149+
rt_int32_t overflow;
147150
float t;
148151

149152
timer = (rt_hwtimer_t *)dev;
150153
if (timer->ops->count_get == RT_NULL)
151154
return 0;
152155

156+
level = rt_hw_interrupt_disable();
153157
cnt = timer->ops->count_get(timer);
158+
overflow = timer->overflow;
159+
rt_hw_interrupt_enable(level);
160+
154161
if (timer->info->cntmode == HWTIMER_CNTMODE_DW)
155162
{
156163
cnt = (timer->freq * timer->period_sec) - cnt;
157164
}
158165

159-
t = timer->overflow * timer->period_sec + cnt/(float)timer->freq;
166+
t = overflow * timer->period_sec + cnt/(float)timer->freq;
160167
tv.sec = t;
161168
tv.usec = (t - tv.sec) * 1000000;
162169
size = size > sizeof(tv)? sizeof(tv) : size;

0 commit comments

Comments
 (0)