非阻塞定时

更新时间: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-蓝牙设备开发 版块进行沟通咨询。

咨询前建议首先查阅 官方资料 或参考已有帖子,并认真阅读 发帖规范