跳转至

定时器(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 运行框架