【发布时间】:2013-12-06 16:32:56
【问题描述】:
以下是我在我们的固件中找到的延迟功能。它看起来有点危险,或者至少让读者感到困惑。
全局变量
static int32u masterTimerCounter; // 32-bit unsigned timer counter
系统滴答中断处理程序
/* Called Every Millisecond */
void sysTickIrqHandler(void)
{
masterTimerCounter++;
}
设置定时器过期功能
void setTimerExpiration(int32u *timerExpiration, int32u delay)
{
*timerExpiration = masterTimerCounter + delay;
}
检查定时器是否过期功能
boolean timerExpired(int32u timerExpiration, int32u delay)
{
if((masterTimerCounter - timerExpiration) < delay)
return TRUE; // Timer has expired
else
return FALSE; // Timer still active
}
设置计时器到期并阻止直到计时器到期
int32u timerExpiration;
setTimerExpiration(&timerExpiration, 15); // Set expiration timer to 15 milliseconds
while(!timerExpired(timerExpiration, 15) // Block until timer has expired
continue;
问题
正如您在timerExpired() 中看到的那样,masterTimerCounter 减去了timerExpiration。如果计时器还没有到期,计算将产生一个非常大的数字(因为两个操作数都是无符号数字)。当计时器到期时,计算将产生一个小于延迟量的值。
虽然这似乎工作正常,但它似乎可能很危险,或者至少会让读者感到困惑(我不得不阅读几遍才能理解最初程序员的意图)。
如果我必须写类似这样的东西,我会定义timerExpired函数如下:
boolean timerExpired(int32u timerExpiration)
{
if(timerExpiration > masterTimerCounter)
return FALSE; // Timer still active
else
return TRUE; // Timer has expired
}
我应该重新定义'timerExpired()`吗?
注意:为了保护无辜,函数和变量名称已更改。
【问题讨论】:
-
那你可以忽略
delay吗? -
timerExpired将延迟作为参数在这里实际上没有意义。 -
如果我重新定义
timerExpired(),delay真的不再需要了。 -
实际上,您删除了 delay 参数。但是从提供的代码中并没有证明它是无用的。
-
@SChepurin 通过我的重新定义,它不再依赖较小的
unsigned数字被较大的unsigned数字减去,从而产生巨大的unsigned数字(大于 @987654338 的数字@.