很多时候定时器是一个uint32_t
的数,如果判断的不正确会产生比较严重的问题,下面测试几个比较常见的写法,构建如一个马上要溢出的定时器和超时计数器
uint32_t cur_time = 0xfffffffe;
uint32_t ex_time = cur_time + 1;
cur_time += 3;
这个打印出来cur_time的当前值是1 ex_time仍然是没有溢出的很大的一个数。
比较明显的如下的判断是肯定会失败的
if(ex_time < cur_time){
printf("1 time out\r\n");
}
if(cur_time > ex_time){
printf("2 time out\r\n");
}
有时候也看到如下的两个判断
if(cur_time - ex_time > 0){
printf("3 time out\r\n");
}
if(ex_time - cur_time < 0){
printf("4 time out\r\n");
}
就涉及加减时候类型提升的问题,找了找 C程序设计语言 附录A.6,两个无符号的运算仍然按无符号型计算,即使一个是无符号的另外一个位有符号的数计算仍提升至无符号,这样看4就不能成立了,经过测试是符合这个规律的。
所以判断时间是否超时,最好还是按内核里#define time_after(a,b) ((int)(b) - (int)(a) < 0)
的样子来判断
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。