基本时序
先把分析一下上一笔记中的代码
function LedRunning()
--do something
sys.timerStart(LedRunning,200) --200ms定时执行此函数
end
LedRunning()
首先是定义了一个功能函数,这个功能函数里面可以做一些事情,然后会发现里面有一个被注释为200ms定时执行此函数的一句,这个自瞄上看起来也很容易理解,传入的参数为func,ms,第一个是功能函数,第二个是定时周期(ms单位),然后再来看下详细的API:
![](https://img-blog.csdnimg.cn/2019062610183191.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3NzU4NDk3,size_16,color_FFFFFF,t_70)
这个有点类似于单片机上长跑的操作系统,例如freertos、ucos等等。在程序执行的过程中都是异步执行的,到了时间就执行定义的任务。当然上面所讲述的只是这个功能函数的定义,并没有实际调用,更不会自行循环调用,所以才有了后面的调用一句。为了简便也可以使用另外一个方法:
![](https://img-blog.csdnimg.cn/20190626101831103.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3NzU4NDk3,size_16,color_FFFFFF,t_70)
这样成个程序就更改成了
function LedRunning()
--do something
end
sys.timerLoopStart(LedRunning,200) --200ms定时执行此函数
当然也可以更简洁的写:
sys.timerLoopStart(function()
--do something
end,200)--200ms定时执行此函数
甚至写成一行都可以
sys.timerLoopStart(function() end,200)--200ms定时执行此函数
再来看一个比较熟悉的任务线程
![](https://img-blog.csdnimg.cn/20190626101831118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3NzU4NDk3,size_16,color_FFFFFF,t_70)
这个就很容易理解了,目的就是初始化一个任务线程。
板上面的代码稍作修改就成了:
function LedRunning()
while ture do
--do something
sys.wait(200) --挂起200ms
end
end
sys. taskInit (LedRunning)
这里的wait就是一个任务切换的过程。很容易理解吧。
上面的代码可以直接在sys.taskInit内写:
sys. taskInit (function ()
while ture do
--do something
sys.wait(200) --挂起200ms
end
end
)
这里只是一个线程,所以当然多线程也是可以的,方法一样。
任务的同步
LuaTask可以使用订阅和发布,使某个程序等待另一个程序完成后才继续运行
我们来看最简单的一个示例代码:
代码段一:
--Taks1
sys.timerLoopStart(function()
print(“Task1 --> ”)
sys.publish(“Task1 Over”)
end,2000)--2000ms定时执行此函数
代码段二:
--Taks2
function Task2()
sys.waitUntil(“Task1 Over”)
print(“Task2\n”)
end
sys. taskInit (Task2)
代码段一非常简单,就是定义一个2s的定时任务,在任务里面打印“Task1 -->”,然后对外发布“Task1 Over”消息。
代码段二先是定义了一个功能函数,进去之后等待接收到“Task1 Over”这个消息,如果没有接收到就一直等,等到了就执行打印“Task2\n”,然后又把这个功能函数当作一个任务线程初始化,也就是专门开了一个任务循环执行这个功能函数。
从两段代码上来看也非常明了了,打印的结果应该是如下结果(我猜的,没测试)
Task1 --> Task2
Task1 --> Task2
。。。
Task1 --> Task2
这样就把两个任务同步了。
在回头看看api
![](https://img-blog.csdnimg.cn/20190626101831134.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3NzU4NDk3,size_16,color_FFFFFF,t_70)
其中发布和等待接收都是可以传入参数的,另外等待可以有最大时间限制,超过时间就不等了。
这里把传值的例子和输出结果贴上来:
sys.timerStart(function()
sys.publish("TEST",123)
end,3000)--三秒定时执行发布"TEST"消息的函数
function Task2()
result,data = sys.waitUntil("TEST")
print(result,data)
end
sys.taskInit(Task2)
上述代码将会输出:
true 123
By Urien 2019年6月26日 10:17:07