我有一个硬件计数器,我可以观察时间考虑因素.它计算毫秒数并存储在16位无符号值中.如何安全地检查计时器值是否已经过一定时间并安全地处理不可避免的翻转:
//this is a bit contrived,but it illustrates what I'm trying to do const uint16_t print_interval = 5000; // milliseconds static uint16_t last_print_time; if(ms_timer() - last_print_time > print_interval) { printf("Fault!\n"); last_print_time = ms_timer(); }
当ms_timer溢出为0时,此代码将失败.
解决方法
你实际上不需要在这里做任何事情.假设ms_timer()返回类型为uint16_t的值,则问题中列出的原始代码将正常工作.
(还假设计时器在检查之间不会溢出两次……)
要说服自己就是这种情况,请尝试以下测试:
uint16_t t1 = 0xFFF0; uint16_t t2 = 0x0010; uint16_t dt = t2 - t1;
dt将等于0x20.