我有一个计时器,我定期使用它来收集性能值。现在,我已经看到,有时我得到的值低于之前采样的值。
我发现将这种行为追溯到我这样做的事实:
1)读取低字节
2)读取高字节
值 = 上 <<8 + 下
但有时会发生:
1)读取低字节
2)发生低字节溢出,lower = 0,higher++
3)读取高字节(现在太高了!)
value = (upper<<8) + lower + [a value less than 255]
如果我切换顺序:
1)读取高字节
2)发生低字节溢出,lower = 0,higher++
3)读取低字节(现在太低了!)
value = (upper<<8) + lower - [一个小于 255 的值]
所以,在这两种情况下,我都偏离了我的真实价值。
有没有比下面介绍的更好的解决方案?
或者甚至有既定的解决方案?
我现在做的是这样的:
/* Sample as long as it takes to not hit an overflow
between sampling the lower and the upper byte */
do {
upper = CounterH;
lower = CounterL;
} while (upper != CounterH);
但我很害怕,因为这可能会导致僵局!(如果计时器计数足够快)
我也在考虑这个:
__DI();
upper = CounterH;
lower = CounterL;
value1 = upper<<8 + lower;
upper = CounterH;
lower = CounterL;
value2 = upper<<8 + lower;
value = max(value1, value2);
__EI();
(首先读取低字节将需要 min() 函数。)
这需要边缘条件,即计时器的周转时间大于上面代码的执行时间!