本教程專為希望掌握LuatOS多任務管理的開發(fā)者設計。通過系統(tǒng)化的知識講解與實戰(zhàn)演練,你將學習如何利用sys庫靈活創(chuàng)建、調度任務,并掌握任務間的同步與通信機制。從基礎概念到高級應用,逐步深入,助你構建高效穩(wěn)定的多任務物聯(lián)網(wǎng)系統(tǒng)。
sys庫是LuatOS的核心系統(tǒng)調度庫,它基于Lua協(xié)程機制實現(xiàn)了實時多任務調度、定時器管理以及消息通信等功能。
在詳細介紹sys庫之前,我們先來補充一些關于實時操作系統(tǒng)RTOS的知識,方便大家更好地理解LuatOS的運行機制。
一、 RTOS實時操作系統(tǒng)
我們用一個簡單的例子來看,對比經(jīng)典的裸機開發(fā)和LuatOS開發(fā)的優(yōu)勢:
一位母親,她需要同步做兩件事情,一件是喂小孩吃飯,另一件事是回復朋友信息。
1.1 裸機開發(fā)
對裸機開發(fā)來說,這是兩件任務,這位母親一段時間內只能做一個任務,任務執(zhí)行不連貫,等待時間長。
time1-5 :喂小孩吃飯,就無法回復信息,朋友就受到冷落;
time5-10 :回復信息,小孩吃不到飯,就會哭鬧。
1.2 RTOS處理多任務
那RTOS是如何處理的呢?在RTOS里,這位母親的大腦非常強大,切換得非常的快,她上一秒喂飯,下一秒回復信息,再下一秒再喂飯。
因為切換得非常快,小孩以為她在專心喂飯,朋友以為她在認真聊天。這兩個任務看起來在同時進行。
這就是RTOS的本質——把一秒鐘的時間切成多個時間片段,一個時間片段內干一件事情,一秒鐘切換100個時間片就可以做100件事情。 RTOS通過快速切換任務,讓多個任務看似在同時進行,提高了系統(tǒng)的并發(fā)處理能力和效率。
LuatOS通過Lua虛擬機封裝了底層RTOS的API,向開發(fā)者提供高級抽象接口,而無需直接操作RTOS內核。
基于此LuatOS實現(xiàn)了一套多任務機制,允許開發(fā)者創(chuàng)建多個并行運行的任務。這些任務通過Lua語言的協(xié)程機制來實現(xiàn),使得每個任務都可以在自己的執(zhí)行上下文中運行,而不會相互干擾。
二、sys庫任務管理API函數(shù)
sys庫是LuatOS的核心系統(tǒng)庫,提供了任務調度、時間管理、消息傳遞等關鍵功能,本文主要介紹其任務管理相關API函數(shù)及其運用示例。
2.1 程序框架
在程序的開頭我們必須調用sys庫;在程序的結尾,我們需要在代碼的最后一行調用sys.run()函數(shù)來啟動主程序,讓框架內的任務代碼會在 sys.run()中運行。
一個Lua程序的框架是這樣的:
2.2 任務管理
任務管理包含:創(chuàng)建任務sys.taskInit()、任務等待 sys.wait()和sys.waitUntil() 。
1)創(chuàng)建任務sys.taskInit()
在創(chuàng)建任務時,需要指定一個任務函數(shù),該函數(shù)包含了任務要執(zhí)行的代碼。
比如,我們創(chuàng)建一個喂飯的任務feed。
代碼示例:先定義“喂飯”函數(shù),然后創(chuàng)建并啟動“喂飯”任務。
2)任務等待sys.wait()
暫停當前任務的執(zhí)行一段時間,單位為毫秒。在等待期間,系統(tǒng)會調度其他任務執(zhí)行,實現(xiàn)多任務并發(fā)。
代碼舉例:
我們依舊利用上面的程序,我們在代碼第三行后面,加一句sys.wait(1000) 即可。
每隔一秒,打印一次 I'm feeding.....
3)任務中斷sys.waitUntil()
允許當前的Task協(xié)程暫停執(zhí)行,進入等待狀態(tài)。在等待過程中,它會監(jiān)聽指定名稱的事件(即 topic)是否發(fā)生,同時會記錄時間。
如果在指定的時間內,該事件發(fā)生了,協(xié)程會恢復執(zhí)行; 如果超過了指定的時間,事件還未發(fā)生,協(xié)程也同樣會恢復執(zhí)行。
一般這里都會設置判斷條件:指定時間內,事件發(fā)生執(zhí)行A,超時未發(fā)生執(zhí)行B。
一般和sys.waitUntil()配合使用的,是sys.publish():
sys.publish()它的作用就像是在系統(tǒng)里廣播消息,讓其他關注該消息的任務能夠接收到并做出相應反應——比如,sys.waitUntil()。
三、多任務實戰(zhàn)演練
我們利用一個示例來實際感受下這幾個函數(shù)的用法:
一位女主人,在燒水的同時,還要掃地; 水燒開后,停止掃地去關火,并沏茶。
分析上述例子,女主人共有三個任務:燒水、掃地、沏茶
這三個任務分別運行如下:
接下來,我們來對這三個協(xié)程單獨分析:
1)燒水協(xié)程:
燒水5秒后,sys.publish()發(fā)消息:“水燒開了”。
代碼如下:
2)掃地協(xié)程:
掃地持續(xù)進行,sys.waitUntil()等待收到了:“水燒開的消息”,停止掃地;同時sys.publish()發(fā)送消息:水燒開了,不掃地了,去沏茶。
代碼如下:
sys.waitUntil()如果在1s內接收到了水燒開的消息,則返回true給result,繼續(xù)執(zhí)行下面的if程序,打印“水燒開了:我去關火”;
如果超時1秒沒有接收到,則返回false給result,繼續(xù)執(zhí)行下面的if程序,打印“水還沒燒開,我要繼續(xù)掃地”。
3)沏茶協(xié)程:
在燒水的5秒鐘內,一直處于等待狀態(tài),直到水燒開后,sys.waitUntil()收到:“水燒開了,不掃地了去沏茶”這條消息,開始執(zhí)行沏茶協(xié)程。
代碼如下:
我們把完整代碼下載到Air780EPM開發(fā)板上,看下運行效果:
這樣,我們就利用sys.publish()和sys.waitUntil()完成了一個多任務協(xié)程程序。
附完整代碼:
今天的內容就分享到這里了~
審核編輯 黃宇
-
RTOS
+關注
關注
24文章
845瀏覽量
120864 -
LuatOS
+關注
關注
0文章
96瀏覽量
2202
發(fā)布評論請先 登錄
評論