Task任務(wù)通過其強大的并發(fā)處理能力,使LuatOS能夠在單線程環(huán)境中模擬多線程執(zhí)行,通過協(xié)程的掛起與恢復(fù)機制,實現(xiàn)任務(wù)級的并行操作,顯著提升系統(tǒng)效能。
sys核心庫是LuatOS運行框架庫,也是LuatOS應(yīng)用程序運行的核心大腦——所有LuatOS應(yīng)用項目都會使用到sys核心庫。
sys核心庫提供了四大類功能:
Task任務(wù)
Message消息
Run調(diào)度器
本文將分享sys核心庫Task任務(wù)相關(guān)函數(shù)及其簡要示例,幫助你更好地理解LuatOS開發(fā)基礎(chǔ)。
一、Task:LuatOS任務(wù)功能
Task分為基礎(chǔ)task和高級task兩種,二者主要區(qū)別如下:
從設(shè)計原理的角度來看:
所有的基礎(chǔ)task共享一個全局消息隊列;
每個高級task都有自己獨立的消息隊列,同時又能使用全局消息隊列。
從用戶使用的角度來看:
基礎(chǔ)task如果阻塞功能使用不當(dāng),可能會丟失自己應(yīng)該處理的消息;
高級task如果阻塞功能使用不當(dāng),不會丟失自己應(yīng)該處理的消息。
雖然從設(shè)計原理來看,高級task比基礎(chǔ)task使用起來不容易犯錯;但由于基礎(chǔ)task使用起來簡潔,基礎(chǔ)task還是需要掌握,一旦掌握之后,也不容易犯錯。
sys核心庫提供的task管理功能有以下幾種:
基礎(chǔ)task的創(chuàng)建和啟動運行:sys.taskInit(task_func, ...)
高級task的創(chuàng)建和啟動運行:sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)
高級task管理表資源的釋放:sys.taskDel(task_name)
二、Task函數(shù)詳解
2.1 sys.taskInit(task_func, ...)
1)函數(shù)功能:
創(chuàng)建并且啟動運行一個基礎(chǔ)task。
2)注意事項:
可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);在LuatOS中,對創(chuàng)建的task數(shù)量沒有特別限制,只要ram夠用,可以一直創(chuàng)建。
3)參數(shù)說明:
▼ task_func ▼
參數(shù)含義:task的處理函數(shù);
數(shù)據(jù)類型:function;
取值范圍:任意有效的函數(shù)名都行;
是否必選:必須傳入此參數(shù)。
注意事項:
特別需要注意傳入的函數(shù)名的作用域,如果使用不當(dāng),很可能會使用一個無效的函數(shù)名。
如下代碼就是一個典型的錯誤示例:

正確參數(shù)示例:
如下所示,定義了一個函數(shù)led_task_func,led_task_func就可以做為此參數(shù)傳入。


4)返回值:
local task_object = sys.taskInit(task_func, ...)有一個返回值task_object

5)函數(shù)示例:

2.2 sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)
1)函數(shù)功能:
創(chuàng)建并且啟動運行一個高級task。
2)注意事項:
可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);高級task的定義,參考本文第一章節(jié)的描述;在LuatOS中,對創(chuàng)建的task數(shù)量沒有特別限制,只要ram夠用,可以一直創(chuàng)建。
3)參數(shù)說明:
▼ task_func ▼
參數(shù)含義:task的處理函數(shù);
數(shù)據(jù)類型:function;
取值范圍:任意有效的函數(shù)名都行;
是否必選:必須傳入此參數(shù)。
注意事項:
特別需要注意傳入的函數(shù)名的作用域,如果使用不當(dāng),很可能會使用一個無效的函數(shù)名。
如下代碼就是一個典型的錯誤示例:

正確參數(shù)示例:
如下所示,定義了一個函數(shù)led_task_func,led_task_func就可以做為此參數(shù)傳入。


▼ non_targeted_msg_cbfunc ▼
參數(shù)含義:task的處理函數(shù)中使用:sys.waitMsg(task_name, msg, timeout)接口阻塞等待msg消息時,接收到msg之外的其他消息時的回調(diào)函數(shù)。
回調(diào)函數(shù)的格式為:

回調(diào)函數(shù)是在task之外的業(yè)務(wù)邏輯中被執(zhí)行的;
在回調(diào)函數(shù)內(nèi)部無法使用sys.wait(timeout)、sys.waitUntil(msg, timeout)、sys.waitMsg(task_name, msg, timeout)等必須用在task中的函數(shù)。
數(shù)據(jù)類型:function或者nil;
取值范圍:無特別限制;
是否必選:可選傳入此參數(shù)。
注意事項:
特別需要注意傳入的函數(shù)名的作用域,如果使用不當(dāng),很可能會使用一個無效的函數(shù)名。
如下代碼就是一個典型的錯誤示例:

正確參數(shù)示例:
如下所示,定義了一個函數(shù)led_task_cbfunc,led_task_cbfunc就可以作為此參數(shù)傳入。


4)返回值:
local task_object = sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)
有一個返回值task_object。

5)函數(shù)示例:

2.3 sys.taskDel(task_name)
1)函數(shù)功能:
刪除一個高級task對應(yīng)的管理表資源。
2)注意事項:
可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);高級task的定義,參考本文第一章節(jié)的描述。
此函數(shù)僅僅刪除一個高級task對應(yīng)的管理表資源,并不能刪除一個高級task。
一般來說,只有如下一個場景需要用到這個函數(shù):
在高級task的任務(wù)處理函數(shù)中,如果函數(shù)執(zhí)行結(jié)束,需要退出,在退出前執(zhí)行sys.taskDel(task_name);
高級task的任務(wù)處理函數(shù)執(zhí)行結(jié)束退出后,這個task就消亡了,消亡后這個task_name綁定的資源也沒用處了。
所以在退出之前執(zhí)行sys.taskDel(task_name),釋放資源,防止出現(xiàn)內(nèi)存泄漏。
3)參數(shù)說明:

4)返回值:nil
5)函數(shù)示例:
以下代碼片段演示一個task的處理函數(shù)在函數(shù)末尾退出前,執(zhí)行sys.taskDel函數(shù)的場景:

以下代碼片段演示一個task的處理函數(shù)在兩種場景下,執(zhí)行sys.taskDel函數(shù):
在中途的一個分支執(zhí)行return語句,退出處理函數(shù)前,執(zhí)行sys.taskDel函數(shù);
處理函數(shù)末尾退出前,執(zhí)行sys.taskDel函數(shù)。

今天的內(nèi)容就分享到這里了!
更多開發(fā)資料,詳見資料中心:
—— docs.openluat.com
審核編輯 黃宇
-
LuatOS
+關(guān)注
關(guān)注
0文章
163瀏覽量
2728
發(fā)布評論請先 登錄
LuatOS 框架的嵌入式系統(tǒng)架構(gòu)設(shè)計原理
LuatOS 系統(tǒng)框架的模塊化設(shè)計原理
LuatOS框架的使用(上)
一文說透了如何實現(xiàn)單片機的多任務(wù)并發(fā)!
FreeRTOS 空閑任務(wù)
freertos關(guān)閉任務(wù)調(diào)度的方法
Swift 的并發(fā)系統(tǒng)并行運行多個任務(wù)
FreeRTOS任務(wù)調(diào)度及優(yōu)先級問題
揭秘LuatOS Task:多任務(wù)管理的“智能中樞”
同步任務(wù)開發(fā)指導(dǎo)
【RA4L1-SENSOR】05 按鍵實現(xiàn)RTOS任務(wù)切換
鴻蒙5開發(fā)寶藏案例分享---應(yīng)用并發(fā)設(shè)計
快速入門——LuatOS:sys庫多任務(wù)管理實戰(zhàn)攻略!
基于LuatOS核心庫的實時操作系統(tǒng)開發(fā):從理論到實踐~
LuatOS協(xié)程深度解析:小白也能10分鐘學(xué)會,代碼效率直接起飛!
Task任務(wù):LuatOS實現(xiàn)“任務(wù)級并發(fā)”的核心引擎
評論