本教程專為希望掌握LuatOS多任務(wù)管理的開發(fā)者設(shè)計(jì)。通過(guò)系統(tǒng)化的知識(shí)講解與實(shí)戰(zhàn)演練,你將學(xué)習(xí)如何利用sys庫(kù)靈活創(chuàng)建、調(diào)度任務(wù),并掌握任務(wù)間的同步與通信機(jī)制。從基礎(chǔ)概念到高級(jí)應(yīng)用,逐步深入,助你構(gòu)建高效穩(wěn)定的多任務(wù)物聯(lián)網(wǎng)系統(tǒng)。
sys庫(kù)是LuatOS的核心系統(tǒng)調(diào)度庫(kù),它基于Lua協(xié)程機(jī)制實(shí)現(xiàn)了實(shí)時(shí)多任務(wù)調(diào)度、定時(shí)器管理以及消息通信等功能。
在詳細(xì)介紹sys庫(kù)之前,我們先來(lái)補(bǔ)充一些關(guān)于實(shí)時(shí)操作系統(tǒng)RTOS的知識(shí),方便大家更好地理解LuatOS的運(yùn)行機(jī)制。
一、 RTOS實(shí)時(shí)操作系統(tǒng)
我們用一個(gè)簡(jiǎn)單的例子來(lái)看,對(duì)比經(jīng)典的裸機(jī)開發(fā)和LuatOS開發(fā)的優(yōu)勢(shì):
一位母親,她需要同步做兩件事情,一件是喂小孩吃飯,另一件事是回復(fù)朋友信息。
1.1 裸機(jī)開發(fā)
對(duì)裸機(jī)開發(fā)來(lái)說(shuō),這是兩件任務(wù),這位母親一段時(shí)間內(nèi)只能做一個(gè)任務(wù),任務(wù)執(zhí)行不連貫,等待時(shí)間長(zhǎng)。
time1-5 :喂小孩吃飯,就無(wú)法回復(fù)信息,朋友就受到冷落;
time5-10 :回復(fù)信息,小孩吃不到飯,就會(huì)哭鬧。

1.2 RTOS處理多任務(wù)
那RTOS是如何處理的呢?在RTOS里,這位母親的大腦非常強(qiáng)大,切換得非常的快,她上一秒喂飯,下一秒回復(fù)信息,再下一秒再喂飯。
因?yàn)榍袚Q得非常快,小孩以為她在專心喂飯,朋友以為她在認(rèn)真聊天。這兩個(gè)任務(wù)看起來(lái)在同時(shí)進(jìn)行。

這就是RTOS的本質(zhì)——把一秒鐘的時(shí)間切成多個(gè)時(shí)間片段,一個(gè)時(shí)間片段內(nèi)干一件事情,一秒鐘切換100個(gè)時(shí)間片就可以做100件事情。 RTOS通過(guò)快速切換任務(wù),讓多個(gè)任務(wù)看似在同時(shí)進(jìn)行,提高了系統(tǒng)的并發(fā)處理能力和效率。
LuatOS通過(guò)Lua虛擬機(jī)封裝了底層RTOS的API,向開發(fā)者提供高級(jí)抽象接口,而無(wú)需直接操作RTOS內(nèi)核。
基于此LuatOS實(shí)現(xiàn)了一套多任務(wù)機(jī)制,允許開發(fā)者創(chuàng)建多個(gè)并行運(yùn)行的任務(wù)。這些任務(wù)通過(guò)Lua語(yǔ)言的協(xié)程機(jī)制來(lái)實(shí)現(xiàn),使得每個(gè)任務(wù)都可以在自己的執(zhí)行上下文中運(yùn)行,而不會(huì)相互干擾。
二、sys庫(kù)任務(wù)管理API函數(shù)
sys庫(kù)是LuatOS的核心系統(tǒng)庫(kù),提供了任務(wù)調(diào)度、時(shí)間管理、消息傳遞等關(guān)鍵功能,本文主要介紹其任務(wù)管理相關(guān)API函數(shù)及其運(yùn)用示例。
2.1 程序框架
在程序的開頭我們必須調(diào)用sys庫(kù);在程序的結(jié)尾,我們需要在代碼的最后一行調(diào)用sys.run()函數(shù)來(lái)啟動(dòng)主程序,讓框架內(nèi)的任務(wù)代碼會(huì)在 sys.run()中運(yùn)行。
一個(gè)Lua程序的框架是這樣的:

2.2 任務(wù)管理
任務(wù)管理包含:創(chuàng)建任務(wù)sys.taskInit()、任務(wù)等待 sys.wait()和sys.waitUntil() 。
1)創(chuàng)建任務(wù)sys.taskInit()
在創(chuàng)建任務(wù)時(shí),需要指定一個(gè)任務(wù)函數(shù),該函數(shù)包含了任務(wù)要執(zhí)行的代碼。

比如,我們創(chuàng)建一個(gè)喂飯的任務(wù)feed。
代碼示例:先定義“喂飯”函數(shù),然后創(chuàng)建并啟動(dòng)“喂飯”任務(wù)。

2)任務(wù)等待sys.wait()
暫停當(dāng)前任務(wù)的執(zhí)行一段時(shí)間,單位為毫秒。在等待期間,系統(tǒng)會(huì)調(diào)度其他任務(wù)執(zhí)行,實(shí)現(xiàn)多任務(wù)并發(fā)。

代碼舉例:
我們依舊利用上面的程序,我們?cè)诖a第三行后面,加一句sys.wait(1000) 即可。
每隔一秒,打印一次 I'm feeding.....

3)任務(wù)中斷sys.waitUntil()
允許當(dāng)前的Task協(xié)程暫停執(zhí)行,進(jìn)入等待狀態(tài)。在等待過(guò)程中,它會(huì)監(jiān)聽指定名稱的事件(即 topic)是否發(fā)生,同時(shí)會(huì)記錄時(shí)間。
如果在指定的時(shí)間內(nèi),該事件發(fā)生了,協(xié)程會(huì)恢復(fù)執(zhí)行; 如果超過(guò)了指定的時(shí)間,事件還未發(fā)生,協(xié)程也同樣會(huì)恢復(fù)執(zhí)行。
一般這里都會(huì)設(shè)置判斷條件:指定時(shí)間內(nèi),事件發(fā)生執(zhí)行A,超時(shí)未發(fā)生執(zhí)行B。

一般和sys.waitUntil()配合使用的,是sys.publish():
sys.publish()它的作用就像是在系統(tǒng)里廣播消息,讓其他關(guān)注該消息的任務(wù)能夠接收到并做出相應(yīng)反應(yīng)——比如,sys.waitUntil()。

三、多任務(wù)實(shí)戰(zhàn)演練
我們利用一個(gè)示例來(lái)實(shí)際感受下這幾個(gè)函數(shù)的用法:
一位女主人,在燒水的同時(shí),還要掃地; 水燒開后,停止掃地去關(guān)火,并沏茶。
分析上述例子,女主人共有三個(gè)任務(wù):燒水、掃地、沏茶
這三個(gè)任務(wù)分別運(yùn)行如下:


接下來(lái),我們來(lái)對(duì)這三個(gè)協(xié)程單獨(dú)分析:
1)燒水協(xié)程:
燒水5秒后,sys.publish()發(fā)消息:“水燒開了”。
代碼如下:

2)掃地協(xié)程:
掃地持續(xù)進(jìn)行,sys.waitUntil()等待收到了:“水燒開的消息”,停止掃地;同時(shí)sys.publish()發(fā)送消息:水燒開了,不掃地了,去沏茶。
代碼如下:

sys.waitUntil()如果在1s內(nèi)接收到了水燒開的消息,則返回true給result,繼續(xù)執(zhí)行下面的if程序,打印“水燒開了:我去關(guān)火”;
如果超時(shí)1秒沒(méi)有接收到,則返回false給result,繼續(xù)執(zhí)行下面的if程序,打印“水還沒(méi)燒開,我要繼續(xù)掃地”。
3)沏茶協(xié)程:
在燒水的5秒鐘內(nèi),一直處于等待狀態(tài),直到水燒開后,sys.waitUntil()收到:“水燒開了,不掃地了去沏茶”這條消息,開始執(zhí)行沏茶協(xié)程。
代碼如下:

我們把完整代碼下載到Air780EPM開發(fā)板上,看下運(yùn)行效果:


這樣,我們就利用sys.publish()和sys.waitUntil()完成了一個(gè)多任務(wù)協(xié)程程序。
附完整代碼:


今天的內(nèi)容就分享到這里了~
審核編輯 黃宇
-
RTOS
+關(guān)注
關(guān)注
25文章
863瀏覽量
122662 -
LuatOS
+關(guān)注
關(guān)注
0文章
134瀏覽量
2588
發(fā)布評(píng)論請(qǐng)先 登錄
《Wireshark從入門到精通》PDF
新書推薦 | TSMaster開發(fā)從入門到精通
快速入門——LuatOS:sys庫(kù)多任務(wù)管理實(shí)戰(zhàn)攻略!
揭秘LuatOS Task:多任務(wù)管理的“智能中樞”
Task任務(wù):LuatOS實(shí)現(xiàn)“任務(wù)級(jí)并發(fā)”的核心引擎
從入門到精通:exchg充電庫(kù)助新手攻克續(xù)航與管理雙痛點(diǎn)

從入門到精通:LuatOS - sys庫(kù)多任務(wù)管理開發(fā)教程!
評(píng)論