跳转至

70 timer-底层定时器

一、概述

timer 是 LuatOS 的内核基础库,只提供两个「忙等」式延时接口:timer.mdelay 毫秒级、timer.udelay 微秒级。

这两个接口执行期间 不会 让出 CPU:sys 的协程调度、socket 收包、串口收发、音频播放这些依赖消息机制的工作全部停摆。因此本库在业务代码里几乎不该出现,除非你非常清楚自己在做什么——比如驱动时序里必须卡住几个微秒、或者在 sys.run() 之前做一次极短的初始化等待。

正常业务里的「等一会儿」请一律用 sys.wait / sys.waitUntil,它们会让出 CPU,不影响其它任务;需要定时器就用 sys.timerStart / sys.timerLoopStart,而不是用 mdelay 拼循环。

二、核心示例

-- 仅演示:单总线类器件要求拉低后保持 10us 以上,用 udelay 卡时序
gpio.setup(1, 0)
gpio.set(1, 0)
timer.udelay(20)
gpio.set(1, 1)

-- 反例:想在业务里「等 100ms」不要这么写,会卡住整个 sys
-- timer.mdelay(100)
sys.wait(100)

三、常量详解

本库没有对外常量。

四、函数详解

4.1 timer.mdelay(timeout)

功能

硬阻塞指定毫秒数,期间 CPU 一直被占用。

参数

timeout

参数含义:阻塞时长
数据类型:number
取值范围:1~1023,单位毫秒;超出范围时接口直接返回、不做任何延时
是否必选:是
注意事项:上限 1024ms(不含),实际使用强烈建议不要超过 200ms,越久越容易丢包、丢事件。

返回值

无返回值。

示例

timer.mdelay(10)

注意事项

  1. 阻塞期间没有任何 Lua 代码执行,包括底层消息处理机制,联网业务下长时间阻塞会掉线;
  2. 需要「等一会儿再继续」请用 sys.wait(ms),它会让出 CPU 给其它任务;
  3. 不要在中断回调、socket 回调里调用,容易把上层业务拖死。

4.2 timer.udelay(timeout)

功能

硬阻塞指定微秒数,用于对时序敏感的短延时。该接口在 2023.05.18 加入。

参数

timeout

参数含义:阻塞时长
数据类型:number
取值范围:1~3000,单位微秒;超出范围直接返回
是否必选:是
注意事项:实际阻塞时长有波动,不要拿它当精密计时。

返回值

无返回值。

示例

timer.udelay(10)

注意事项

  1. 微秒级延时受调度与中断影响,实测值会比设定值偏大,做时序余量时按最坏情况算;
  2. 单次上限 3000us,更长的等待请用 timer.mdelay 或 sys.wait;
  3. 同样不建议在业务主流程里使用。

五、产品支持说明

timer 是内核基础库,各型号 LuatOS 固件基本都包含,具体以对应型号的固件支持列表为准:

Air780EPM/Air780EHx 系列固件支持列表

Air8000 系列固件支持列表

搜索