c – 翻滚安全计时器(勾选)比较

我有一个硬件计数器,我可以观察时间考虑因素.它计算毫秒数并存储在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.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...