更新时间:2024-01-17 07:51:13下载pdf
非阻塞定时被用于实现周期性定时任务。
概念 | 说明 |
---|---|
非阻塞定时 | 常用在 Loop 中,非阻塞式地设置周期任务。例如,每隔 1s 闪灯。相比于定时器,其实现更简单一些,消耗资源少,比较适合资源紧张的系统。 |
通过计算已记录的旧时间戳(系统 Tick)与当前时间戳的差值,来判断距离记录点是否已经过一定时间。若已经过了一定时间,则返回真,从而实现非阻塞定时任务。
无对外数据结构,用户无需关注。
函数 | unsigned int hal_clock_get_system_tick(void) |
- |
---|---|---|
作用 | 获取系统 Tick | - |
入参 | 无 | - |
返回 | 系统 Tick | 不同系统的 Tick 转换为微秒的比例不同,需要注意其倍数关系 |
函数 | unsigned int hal_clock_time_exceed_with_update (unsigned int *ref, unsigned int span_us) |
- |
---|---|---|
作用 | 非阻塞定时 | - |
入参 | unsigned int *ref | 锚点 Tick,该函数在返回 1 的时候会更新 ref 锚点 |
-> | unsigned int span_us | 周期,单位是微秒 |
返回 | 0/1 | 计算当前 Tick 减去锚点 Tick 得到的差值,判断是否已经过 span_us ,为真返回 1 ,否则返回 0 |
示例
非阻塞定时被用于实现周期性定时任务。
static u32 count_1s_time = 0;
static u32 count_1s = 0;
if(hal_clock_time_exceed_with_update(&count_1s_time,1000000)){//1S
count_1s++;
}
该方法可以做到微秒级别非阻塞定时,误差可做到一天小于 5s。
除此之外,unsigned int hal_clock_get_system_tick(void)
可以获取系统 Tick,可用于实现函数运行耗时等逻辑,Tick 与微秒之间存在线性转换关系。
编写一个 1s 的非阻塞定时,每 1s 输出一个 Log。
设备运行一天以上,观察 Log,查看误差是否在可接受范围之内。
在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 TuyaOS-蓝牙设备开发 版块进行沟通咨询。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈