合宙LuatOS的個(gè)人空間 http://selenalain.com/space-uid-176273.html [收藏] [復制] [RSS]

博客

LuatOS實(shí)戰教程:sys庫多任務(wù)管理

已有 184 次閱讀2025-5-27 13:41 |個(gè)人分類(lèi):4G模組| 物聯(lián)網(wǎng), 單片機, 4G模塊, 通訊模組, 嵌入式硬件

sys庫是LuatOS的核心系統調度庫,它基于Lua協(xié)程機制實(shí)現了實(shí)時(shí)多任務(wù)調度、定時(shí)器管理以及消息通信等功能。

在詳細介紹sys庫之前,我們先來(lái)補充一些關(guān)于實(shí)時(shí)操作系統RTOS的知識,方便大家更好地理解LuatOS的運行機制。

 

一、 RTOS實(shí)時(shí)操作系統 
 

我們用一個(gè)簡(jiǎn)單的例子來(lái)看,對比經(jīng)典的裸機開(kāi)發(fā)和LuatOS開(kāi)發(fā)的優(yōu)勢:

一位母親,她需要同步做兩件事情,一件是喂小孩吃飯,另一件事是回復朋友信息。


 
1.1 裸機開(kāi)發(fā)

對裸機開(kāi)發(fā)來(lái)說(shuō),這是兩件任務(wù),這位母親一段時(shí)間內只能做一個(gè)任務(wù),任務(wù)執行不連貫,等待時(shí)間長(cháng)。

time1-5 :喂小孩吃飯,就無(wú)法回復信息,朋友就受到冷落; 

time5-10 :回復信息,小孩吃不到飯,就會(huì )哭鬧。



1.2 RTOS處理多任務(wù)

那RTOS是如何處理的呢?在RTOS里,這位母親的大腦非常強大,切換得非常的快,她上一秒喂飯,下一秒回復信息,再下一秒再喂飯。

因為切換得非?,小孩以為她在專(zhuān)心喂飯,朋友以為她在認真聊天。這兩個(gè)任務(wù)看起來(lái)在同時(shí)進(jìn)行。


這就是RTOS的本質(zhì)——把一秒鐘的時(shí)間切成多個(gè)時(shí)間片段,一個(gè)時(shí)間片段內干一件事情,一秒鐘切換100個(gè)時(shí)間片就可以做100件事情。 RTOS通過(guò)快速切換任務(wù),讓多個(gè)任務(wù)看似在同時(shí)進(jìn)行,提高了系統的并發(fā)處理能力和效率。 

LuatOS通過(guò)Lua虛擬機封裝了底層RTOS的API,向開(kāi)發(fā)者提供高級抽象接口,而無(wú)需直接操作RTOS內核。

基于此LuatOS實(shí)現了一套多任務(wù)機制,允許開(kāi)發(fā)者創(chuàng )建多個(gè)并行運行的任務(wù)。這些任務(wù)通過(guò)Lua語(yǔ)言的協(xié)程機制來(lái)實(shí)現,使得每個(gè)任務(wù)都可以在自己的執行上下文中運行,而不會(huì )相互干擾。

 

二、 sys庫任務(wù)管理API函數 
 

sys庫是LuatOS的核心系統庫,提供了任務(wù)調度、時(shí)間管理、消息傳遞等關(guān)鍵功能,本文主要介紹其任務(wù)管理相關(guān)API函數及其運用示例。
 

2.1 程序框架

在程序的開(kāi)頭我們必須調用sys庫;在程序的結尾,我們需要在代碼的最后一行調用sys.run()函數來(lái)啟動(dòng)主程序,讓框架內的任務(wù)代碼會(huì )在 sys.run()中運行。

一個(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ù)函數,該函數包含了任務(wù)要執行的代碼。



比如,我們創(chuàng )建一個(gè)喂飯的任務(wù)f(shuō)eed。

代碼示例:先定義“喂飯”函數,然后創(chuàng )建并啟動(dòng)“喂飯”任務(wù)。



2)任務(wù)等待sys.wait() 

暫停當前任務(wù)的執行一段時(shí)間,單位為毫秒。在等待期間,系統會(huì )調度其他任務(wù)執行,實(shí)現多任務(wù)并發(fā)。



代碼舉例:

我們依舊利用上面的程序,我們在代碼第三行后面,加一句sys.wait(1000) 即可。

每隔一秒,打印一次 I'm feeding.....



3)任務(wù)中斷sys.waitUntil()

允許當前的Task協(xié)程暫停執行,進(jìn)入等待狀態(tài)。在等待過(guò)程中,它會(huì )監聽(tīng)指定名稱(chēng)的事件(即 topic)是否發(fā)生,同時(shí)會(huì )記錄時(shí)間。

如果在指定的時(shí)間內,該事件發(fā)生了,協(xié)程會(huì )恢復執行; 如果超過(guò)了指定的時(shí)間,事件還未發(fā)生,協(xié)程也同樣會(huì )恢復執行。

一般這里都會(huì )設置判斷條件:指定時(shí)間內,事件發(fā)生執行A,超時(shí)未發(fā)生執行B。



一般和sys.waitUntil()配合使用的,是sys.publish():

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


 三、多任務(wù)實(shí)戰演練 

 

我們利用一個(gè)示例來(lái)實(shí)際感受下這幾個(gè)函數的用法:

一位女主人,在燒水的同時(shí),還要掃地; 水燒開(kāi)后,停止掃地去關(guān)火,并沏茶。

分析上述例子,女主人共有三個(gè)任務(wù):燒水、掃地、沏茶

這三個(gè)任務(wù)分別運行如下:



接下來(lái),我們來(lái)對這三個(gè)協(xié)程單獨分析: 

1)燒水協(xié)程:

燒水5秒后,sys.publish()發(fā)消息:“水燒開(kāi)了”。

代碼如下:


 

2)掃地協(xié)程:
 

掃地持續進(jìn)行,sys.waitUntil()等待收到了:“水燒開(kāi)的消息”,停止掃地;同時(shí)sys.publish()發(fā)送消息:水燒開(kāi)了,不掃地了,去沏茶。

代碼如下:


sys.waitUntil()如果在1s內接收到了水燒開(kāi)的消息,則返回true給result,繼續執行下面的if程序,打印“水燒開(kāi)了:我去關(guān)火”;

如果超時(shí)1秒沒(méi)有接收到,則返回false給result,繼續執行下面的if程序,打印“水還沒(méi)燒開(kāi),我要繼續掃地”。

 

3)沏茶協(xié)程:

在燒水的5秒鐘內,一直處于等待狀態(tài),直到水燒開(kāi)后,sys.waitUntil()收到:“水燒開(kāi)了,不掃地了去沏茶”這條消息,開(kāi)始執行沏茶協(xié)程。

代碼如下:


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



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

附完整代碼:



今天的內容就分享到這里了~

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
返回頂部
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页