Luat开源硬件

LuaTask教程之运行原理

2018-03-23  本文已影响26人  Luat物联网通信模块

这一章讲解一下程序的运行原理,可能有的开发者一直在main.lua里面找main函数,一直没找到,然后就懵逼了。Luat采用的Lua语言,Lua 是一种轻量小巧的脚本语言。

先来看一下main.lua

--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "DEMO_TASK"
VERSION = "2.0.0"
-- 日志级别
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
require "sys"
require "utils"
-- 加载GSM
require "net"
--8秒后查询第一次csq
net.startQueryAll(8 * 1000, 600 * 1000)
-- 控制台
require "console"
console.setup(1, 115200)
-- 系统工具
require "misc"
-- 看门狗
require "wdt"
wdt.setup(pio.P0_31, pio.P0_29)
-- 系統指示灯
require "led"
led.setup(pio.P0_28)
-- 测试任务
require "test"
-- 启动系统框架
sys.init(0, 0)
sys.run()

Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。也就是说在main.lua里面加载了多个lua文件(简单粗暴的理解为require的文件内容复制到了main.lua),脚本语言顺序执行,所以执行顺序为:

也就是说,通过不断的接收消息来判断发生了什么事件,应该做什么事情。

最后在分析一下test.lua。重构版采取的协程的方式。什么是协程?举个例子,有一盘菜,你和你女友两人吃。按照老的方法,顺序是这样的,女友先吃,吃饱了,然后自己吃。这样就不科学了,说好的男女平等了(emmmm....)。现在换一种方式:女友吃两分钟,自己吃两分钟,女友吃两分钟,自己吃两分钟...loop.....。这样是不是科学很多了。第一种方式就是我们常用的方式顺序执行,在单片机里面经常用while(1)来死循环控制流程。这样有个缺陷是,太死板,不能根据调整程序的执行时间,就比如,女友在吃菜的时候,自己已经饿得不行了,但是还是得等女友吃完(没人性啊!)。第二种方式就相对方便很多,可以控制程序运行的时间。比如:男生饭量大,需要吃三分钟,女生饭量小只吃一分钟,这样就可以合理分配时间。

回到test.lua里面的内容

module(..., package.seeall)                 --必须,目的是让其他文件能包含该文件

sys.taskInit(function()                 --任务1
    while true do
        print("Hello World")
        sys.wait(1000)
    end
end)
sys.taskInit(function()                 --任务2
    while true do
        print("Luat is esay")
        sys.wait(2000)
    end
end)

还记得上一章输出的内容吗?输出两次Hello World,输出一次Luat is esay。明明是while true的死循环,怎么会切换到其他任务?可以看到每个程序后都有sys.wait,程序执行sys.wait将自己挂起(说白一点,就是不在执行自己了),然后执行其他任务。第一个任务将自己挂起1000ms,也就是说每隔1000ms执行一次。第二个任务将自己挂起2000ms,也就是说将自己挂起2000ms。

希望这一章能让你明白Luat的运行原理

上一篇下一篇

猜你喜欢

热点阅读