定时器(timer)
一、简介
定时器(timer)是一项基础且关键的服务。它允许开发者在特定的时间点或周期性地执行代码段,为物联网设备的运行提供了精确的时间控制。定时器在多种应用场景中都发挥着重要作用,如定时发送数据、周期性检查传感器状态等。
二、演示功能概述
本教程教你如何用 Air724 开发板,演示定时器功能,并且通过日志观察实验结果。
三、准备硬件环境
3.1 开发板准备
使用 EVB_Air724 开发板,如下图所示:
淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接 ;
此开发板的详细使用说明参考:Air724UG 产品手册 中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。
api:https://doc.openluat.com/wiki/21?wiki_page_id=2068
3.2 数据通信线
USB 数据线一根(micro USB)。
3.3 PC 电脑
WIN7 以及以上版本的 WINDOWS 系统。
3.4 SIM 卡
中国大陆环境下,可以上网的 SIM 卡。一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。
3.5 组装硬件环境
USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。
四、准备软件环境
4.1 下载调试工具
使用说明参考:Luatools 下载和详细使用
4.2 源码及固件
1.底层 core 下载
下载底层固件,并解压
链接:https://docs.openluat.com/air724ug/luatos/firmware/
如下图所示,红框的是我们要使用到的。
2.本教程使用的 demo:
4.3 下载固件和脚本到开发板中
打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。
点击项目管理测试选项。
进入管理界面,如下图所示。
- 点击选择文件,选择底层固件,我的文件放在 D:\luatOS\Air724 路径中。
- 点击增加脚本或资源文件,选择 之前下载的程序源码,如下图所示。
- 点击下载底层和脚本,下载完成如下图所示。
五、代码示例介绍
5.1 API 说明
本文用到的接口函数不做详细介绍,可通过点击右侧链接查看具体介绍:sys API
5.2 timer.lua 代码
系统启动后创建了一个 sys.wait(3000),延时 3s 后再进行当前协程。避免开机后程序跑太快,我们看不清日志输出。开始后,创建了一个单次定时器且只有收到消息id才会执行 sys.waitUntil(“MSG_ID”),这个定时器又会将当前协程停下来,它需要等待一个指令才肯放行("MSG_ID"这个消息 ID)。还记得上面循环定时器里那个 sys.publish(“MSG_ID”)嘛,每隔 5s 就会发送 sys.waitUntil(“MSG_ID”)需要的消息 ID。
module(...,package.seeall)
--循环定时器打印函数
local function log1()
log.info("log","每5s打印一次,循环定时器的作用")
sys.publish("MSG_ID")
end
--循环定时器,5s执行一次log1函数
sys.timerLoopStart(log1,5000)
--第二个task的调用函数,给第一个task判断定时器是否激活用的。
local a
local function timer_2()
a=sys.timerStart(function ()
log.info("log", "我的用途就是给下面的sys.timerIsActive判断死活用的")
end,20000)
end
--第一个task的执行函数
local function timer_1()
--sys.wait(ms),单次定时器且只能用在task中,或者被task的主函数直接或者间接调用。
sys.wait(4000)
log.info("log", "开始!")
--sys.waitUntil(),单次定时器且只有收到消息id才会执行。有超时参数时:如果时间到达没有等到消息ID也会会执行。没有超时参数时:死等
sys.waitUntil("MSG_ID")
log.info("log", "接收到\"MSG_ID\"消息")
--判断timer_2里定时器的激活状态,如果激活则执行。
if sys.timerIsActive(a) then
sys.timerStart(function ()
log.info("log", "循环定时器活着,我是有timerStart定时器执行的")
end,1000)
end
--等待10s后开始执行rtos.sleep(6000),让lua虚拟机挂起6s。
sys.wait(10000)
log.info("log", "先睡6s")
--rtos.sleep(6000)
end
sys.taskInit(timer_2)
sys.taskInit(timer_1)
5.3 main.lua 代码
本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,等待网络连接成功,然后加载测试模块。
六、开机调试
6.1 开发板开机
连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。
6.2 功能调试
定时器启动后创建了一个单次定时器 sys.waitUntil(“MSG_ID”),这个定时器又会将当前协程停下来,它需要等待一个指令才肯放行("MSG_ID"这个消息 ID)。
七、常见问题
7.1 使用定时器 sys.wait()或者 sys.waitUntil(),程序出错。
sys.wait()和 sys.waitUntil()只能用于 task 中。
7.2 定时器精度问题
LuatOS 开发最小仅支持 5 毫秒的定时器,超时时间最小 1ms(实际支持的最小时间是 5ms,小于 5ms 的时间都被转化为 5ms) 超时间最大 0x7FFFFFFF(24.85 天)。 另外毫秒级的定时器的误差较大,原因可参考 LuatOS 运行框架