Luat框架#


LuaTask#

函数运行#

由于没有main函数,一些习惯常规单片机开发者一时不知怎么运行程序。程序运行有多种方法

直接调用#

项目中处理lib文件夹还有main.lua,test.lua。

main.lua

--重要提醒:必须在这个位置定义PROJECT和VERSION变量
--PROJECT:string类型,可以随便定义,只要不使用,就行
--VERSION:string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "testdemo"
VERSION = "1.0.0"
-- sys库是Luat的核心支撑库, 基本上是必备的
local sys = require"sys"

-- ----------------------------
-- 引入test.lua
local test = require "test"
test.hi()
---------------------------

sys.run() -- 启动内部event loop, 仅允许在main.lua的末尾使用

main.lua需要使用require引用编写的脚本,这儿为test.lua。

test.lua

local test = {}

local function ss() -- 内部方法, 外部无法调用
	print("ss function test")
end
ss()		--直接调用,在main.lua文件中require"test"的时候则会调用该函数

function test.hi() -- 暴露到外部的方法
    log.info("test", "say hi from test")
end

return test

协程#

main.lua同上

test.lua

local test = {}

sys.taskInit(function()
    cnt = 0
    while true do
	 	print("ss function test")
        sys.wait(1000)			-- 挂起1000ms,同理为每隔1000ms运行一次
    end
end)

return test

定时器#

main.lua同上

test.lua

local test = {}

local function ss(  )
	print("ss function test")
end
--sys.timerStart(ss,3000)	--3秒运行一次
sys.timerLoopStart (ss,5000)  --循环定时器,每隔5秒运行一次

return test

程序注册#

LuaTask通过订阅发布来实现消息机制。

当函数完成一个操作后,可以发布一个消息,其他函数可以订阅该消息并做对应的操作。举个例子,当socket发送完数据后发布“SEND_FINISH”。这时开发者想socket发布完成后通过串口发送数据或者改变某个IO口的状态。就可以订阅该消息subscribe(“SEND_FINISH”,callback)。callback为接收到SEND_FINISH消息后需要做的事。

先来看一个程序

testMsgPub.lua

--testMsgPub.lua
local testMsgPub = {}

local sys = require"sys"
local  a = 2
local function pub()
	print("pub")
	sys.publish("TEST",a)		--可以发布多个变量sys.publish("TEST",1,2,3)
end
pub()

return testMsgPub

testMsgSub.lua

--testMsgSub.lua
local testMsgSub = {}

local sys = require"sys"

local function subCallBack(...)
	print("rev",arg[1])
end

sys.subscribe("TEST",subCallBack)
return testMsgSub

如果要在任务函数中订阅消息并做相应的处理,怎么办?

local testMsgSub = {}

require"sys"
local  a = 2
local function pub()
	print("pub")
	sys.publish("TEST",a)
end
pub()
sys.taskInit(function()
	while true do
		result, data = sys.waitUntil("TEST", 10000)
		if result == true then
			print("rev")
			print(data)
		end
		sys.wait(2000)
	end
end)

return testMsgSub

调用sys.waitUntil()函数即可。

接下来分析实现的源码

为了更好的理解源码,需要以下的预备知识:

1、回调函数的实现

local function callBackTest(...)
	print("callBack",arg[1])
end

local function test( a,callBackTest )
	if a > 1 then
		callBackTest(1)
	end
end
test(2,callBackTest)
--输出
--callBack	1

2、不定参数

function g (a, b, ...) end
g(3)              -- a=3, b=nil, arg={n=0}   -- n为不定参数的个数
g(3, 4)           -- a=3, b=4, arg={n=0}
g(3, 4, 5, 8)     -- a=3, b=4, arg={5, 8; n=2}