• 欢迎大家分享资料!前往留言板评论即可!

7、合宙Air模块Luat开发:定时器的使用方法

合宙 模组资料网 2年前 (2021-05-15) 294次浏览 0个评论 扫描二维码

目录

点击这里查看所有博文

本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。

先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获
我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!

一、前言

一日不见如隔三秋,距离发布上篇博客又是一种新的外设之ADC模数转换,现在我们可以采集模拟量数据了已然过去了半个月,最近事情比较多,没有时间写博客,今天抽出一点时间写一篇有关Air720SL定时器的使用方法

  • 那么什么是定时器呢?

定时器通俗的讲就相当于一个闹钟。
我们的手机里面都有闹钟,每天早上负责叫醒我们上班不要迟到。我们只要在手机里面设置好时间,然后可以按需选择每天都响,或者选择只响一次。作用是打断正在做的事(睡觉)。
7、合宙Air模块Luat开发:定时器的使用方法

在单片机系统中也是有定时器的。
而 定时器又分为两种,分别是硬件定时器和软件定时器
不管是51系列、stm32系列、avr系列、亦或是其他的单片机,它们在裸机编程上都是拥有硬件定时器的,一般硬件定时器数量有几个到十几个不等,占用的是硬件资源,

  • 硬件定时器:一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片,其使用的时基是系统内部的高速时钟源经过分频得到的,高速时钟源又是由外部晶振倍频得到,精度非常高,但是依赖硬件,能使用的数量有限

如果涉及到了操作系统编程,软件定时器那就必不可少。

  • 软件定时器:一般软件定时器都是利用的是操作系统的延时阻塞性,在定时器启动和触发时记录下当前的系统时间,每隔一个时间片去查询下有没有到指定的定时时间,有的话就触发软件回调,精度相对硬件定时器要差得多,理论上是没有使用数量限制的,内存有多大,定时器就可以有多少

我翻过Air720SL的硬件手册和API手册好像是没有看到有关硬件定时器的说明。我没看到不代表没有,只是我不知道,这里我就不多说了,本片博客主要是讲Air720SL模组Luat二次开发的软件定时器怎么使用

二、了解软件API

Luat官方给出的定时器相关API是包含在sys驱动库文件下的。也就是说想要使用软件定时器那就必须要先require "sys"

在4G模块上只能选择LuaTask框架
在这里插入图片描述
但是在2G模块上,有另外一个选择,官方推荐的是使用LuaTask。如果用户使用的是第一版旧版本驱动库,是不能使用本篇博客所说的软件定时器的
在这里插入图片描述
接下来我会依次对Luat的软件定时器库做相应的讲解

  • sys.timerStart(timer0_Task, 15000) –开启一个定时器,这个定时器只会触发一次,分别传入定时回调函数和定时时间,就可以启用定时器
  • time1 = sys.timerLoopStart(timer_Loop_Task, 2000) –开启一个循环定时器,开启成功会返回定时器句柄,可用于关闭定时器
  • sys.timerStop(time1)–使用time1的ID关闭time1,关闭某一个定时器
  • sys.timerStopAll(timer_Loop_Task)–timerStopAll关闭回调函数绑定的所有定时器

三、编写测试程序

我这里就直接在main函数里面创建一个单次定时器,再创建四个循环定时器共用一个回调函数

local function user_main()
    sys.taskInit(Test_Task)
    sys.timerStart(timer0_Task, 15000)
    time1 = sys.timerLoopStart(timer_Loop_Task, 2000, 1)
    sys.timerLoopStart(timer_Loop_Task, 2000, 2)
    sys.timerLoopStart(timer_Loop_Task, 2000, 3)
    sys.timerLoopStart(timer_Loop_Task, 2000, 4)
end

最后在定时器循环回调函数中,使用timerStop和 timerStopAll 进行分批关闭定时器

function timer_Loop_Task(time_num)
    log.info("timer_Loop_Task当前的时间戳是:", time_num, os.time())
    if num == 5 then
        log.info("Close time1 with time1's ID")
        sys.timerStop(time1)--使用time1的ID关闭time1
    else
        if num == 10 then
            log.info("Close time2 with callback function and parameters:")
            sys.timerStop(timer_Loop_Task, 2)--以回调函数加参数关闭time2
        else
            if num == 15 then
                log.info("timerStopAll closes all timers bound to the callback function")
                sys.timerStopAll(timer_Loop_Task)--timerStopAll关闭回调函数绑定的所有定时器
            end
        end
    end
    if time_num == 4 then
        num = num + 1
    end
end

# 四、下载完整的代码到Air720Sl开发板

这里我们直接贴出全部代码

--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "LED"
VERSION = "0.0.1"
require "sys"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)
local function Test_Task()
    while true do
        log.info("Test_Task_run")
        sys.wait(5000)
    end
end
function timer0_Task()
    log.info("timer0_Task当前的时间戳是:", os.time())
end
num = 0;
time1 = 0;
function timer_Loop_Task(time_num)
    log.info("timer_Loop_Task当前的时间戳是:", time_num, os.time())
    if num == 5 then
        log.info("Close time1 with time1's ID")
        sys.timerStop(time1)--使用time1的ID关闭time1
    else
        if num == 10 then
            log.info("Close time2 with callback function and parameters:")
            sys.timerStop(timer_Loop_Task, 2)--以回调函数加参数关闭time2
        else
            if num == 15 then
                log.info("timerStopAll closes all timers bound to the callback function")
                sys.timerStopAll(timer_Loop_Task)--timerStopAll关闭回调函数绑定的所有定时器
            end
        end
    end
    if time_num == 4 then
        num = num + 1
    end
end

local function user_main()
    sys.taskInit(Test_Task)
    sys.timerStart(timer0_Task, 15000)
    time1 = sys.timerLoopStart(timer_Loop_Task, 2000, 1)
    sys.timerLoopStart(timer_Loop_Task, 2000, 2)
    sys.timerLoopStart(timer_Loop_Task, 2000, 3)
    sys.timerLoopStart(timer_Loop_Task, 2000, 4)
end

--启动系统框架
sys.taskInit(user_main)
sys.init(0, 0)
sys.run()

下载程序后,打开Trace监视

[2020-03-05 13:47:05.074]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505608
[2020-03-05 13:47:05.104]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505608
[2020-03-05 13:47:05.108]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505608
[2020-03-05 13:47:05.111]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505608
[2020-03-05 13:47:06.785]: 
[2020-03-05 13:47:06.790]: SMS READY
[2020-03-05 13:47:07.053]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505610
[2020-03-05 13:47:07.068]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505610
[2020-03-05 13:47:07.082]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505610
[2020-03-05 13:47:07.091]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505610
[2020-03-05 13:47:08.830]: [I]-[Test_Task_run]
[2020-03-05 13:47:09.055]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505612
[2020-03-05 13:47:09.068]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505612
[2020-03-05 13:47:09.077]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505612
[2020-03-05 13:47:09.084]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505612
[2020-03-05 13:47:09.812]: 
[2020-03-05 13:47:09.814]: +MPBK: 1
[2020-03-05 13:47:11.041]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505614
[2020-03-05 13:47:11.051]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:11.065]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505614
[2020-03-05 13:47:11.076]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:11.090]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505614
[2020-03-05 13:47:11.101]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:11.104]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505614
[2020-03-05 13:47:11.106]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:13.024]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505616
[2020-03-05 13:47:13.036]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505616
[2020-03-05 13:47:13.048]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505616
[2020-03-05 13:47:13.802]: [I]-[Test_Task_run]
[2020-03-05 13:47:13.805]: [I]-[timer0_Task当前的时间戳是:] 1388505617
[2020-03-05 13:47:15.013]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505618
[2020-03-05 13:47:15.026]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505618
[2020-03-05 13:47:15.038]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505618
[2020-03-05 13:47:17.000]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505620
[2020-03-05 13:47:17.012]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505620
[2020-03-05 13:47:17.022]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505620
[2020-03-05 13:47:18.786]: [I]-[Test_Task_run]
[2020-03-05 13:47:18.985]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505622
[2020-03-05 13:47:18.995]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505622
[2020-03-05 13:47:19.008]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505622
[2020-03-05 13:47:20.988]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505624
[2020-03-05 13:47:21.002]: [I]-[Close time2 with callback function and parameters:]
[2020-03-05 13:47:21.009]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505624
[2020-03-05 13:47:21.016]: [I]-[Close time2 with callback function and parameters:]
[2020-03-05 13:47:21.022]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505624
[2020-03-05 13:47:21.028]: [I]-[Close time2 with callback function and parameters:]
[2020-03-05 13:47:22.969]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505626
[2020-03-05 13:47:22.983]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505626
[2020-03-05 13:47:23.758]: [I]-[Test_Task_run]
[2020-03-05 13:47:24.966]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505628
[2020-03-05 13:47:24.980]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505628
[2020-03-05 13:47:26.962]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505630
[2020-03-05 13:47:26.978]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505630
[2020-03-05 13:47:28.741]: [I]-[Test_Task_run]
[2020-03-05 13:47:28.942]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505632
[2020-03-05 13:47:28.956]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505632
[2020-03-05 13:47:30.941]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505634
[2020-03-05 13:47:30.956]: [I]-[timerStopAll closes all timers bound to the callback function]

  • 发现timer0 [2020-03-05 13:47:13.805]: [I]-[timer0_Task当前的时间戳是:] 1388505617 仅出现了一次,和程序里面写的一样,单次运行

  • 在此处出现关闭id为1的定时器提示,ID1便停止输出,验证了timerStop正常执行
    在这里插入图片描述

  • 在最后出现关闭所有定时器的提示[2020-03-05 13:47:30.956]: [I]-[timerStopAll closes all timers bound to the callback function],后面便停止输出,验证了timerStopAll执行正确

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束


喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址