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

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


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

5)函數示例:

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

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


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

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

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


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

5)函數示例:

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

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

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

今天的內容就分享到這里了!
更多開發資料,詳見資料中心:
—— docs.openluat.com
審核編輯 黃宇
-
LuatOS
+關注
關注
0文章
156瀏覽量
2693
發布評論請先 登錄
LuatOS 框架的嵌入式系統架構設計原理
一文說透了如何實現單片機的多任務并發!
FreeRTOS 空閑任務
Swift 的并發系統并行運行多個任務
FreeRTOS任務調度及優先級問題
【RA4L1-SENSOR】05 按鍵實現RTOS任務切換
鴻蒙5開發寶藏案例分享---應用并發設計
基于LuatOS核心庫的實時操作系統開發:從理論到實踐~
Task任務:LuatOS實現“任務級并發”的核心引擎
評論