很多时候定时器是一个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)
的样子来判断


o_ra
3 声望2 粉丝

记录工作中碰到的问题


引用和评论

0 条评论