合宙LuatOS的个人空间 https://www.eechina.com/space-uid-176273.html [收藏] [复制] [RSS]

博客

Task任务:LuatOS实时能力的“调度指挥官”

已有 58 次阅读2025-9-2 11:26 |个人分类:4G模组| 物联网, 单片机, 4G模块, 通讯模组, 嵌入式硬件

在LuatOS的实时架构中,Task任务如同指挥官般统筹全局,通过动态分配CPU时间片和任务优先级调整,协调多个任务有序执行,确保系统实时性与资源利用率的完美平衡。

sys核心库是LuatOS运行框架库,也是LuatOS应用程序运行的核心大脑——所有LuatOS应用项目都会使用到sys核心库。
 

 sys核心库提供了四大类功能:

Task任务

Message消息

Timer定时器

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;

取值范围:任意有效的函数名都行;

是否必选:必须传入此参数。


注意事项:

特别需要注意传入的函数名的作用域,如果使用不当,很可能会使用一个无效的函数名。

如下代码就是一个典型的错误示例:

wKgZPGiv5-iACp_RAAC84eO8O24799.png


正确参数示例:

如下所示,定义了一个函数led_task_func,led_task_func就可以做为此参数传入。

wKgZO2iv6B2Ab6jhAABD64G4Qvw980.pngwKgZPGiv6L-AcURNAACBV_q0UV8648.png

4)返回值:

local task_object = sys.taskInit(task_func, ...)有一个返回值task_object

wKgZO2iv6PGAcTvwAABV4LiLftc926.png

5)函数示例:

wKgZO2iv6ROAM7cCAADgdQi0ZGE233.png


2.2 sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)

1)函数功能:

创建并且启动运行一个高级task。

2)注意事项:

可以在能够执行到的任意代码位置使用此函数;高级task的定义,参考本文第一章节的描述;在LuatOS中,对创建的task数量没有特别限制,只要ram够用,可以一直创建。

3)参数说明:

▼   task_func   ▼
 

参数含义:task的处理函数;

数据类型:function;

取值范围:任意有效的函数名都行;

是否必选:必须传入此参数。

注意事项:

特别需要注意传入的函数名的作用域,如果使用不当,很可能会使用一个无效的函数名。

如下代码就是一个典型的错误示例:

wKgZPGiv6pSAE7lCAADL6udbVBo051.png

正确参数示例:
 

如下所示,定义了一个函数led_task_func,led_task_func就可以做为此参数传入。

wKgZPGiv6rqAHTykAABMRJLLHmM772.pngwKgZO2iv6tOAUT2-AABxR-AOj_M881.png

 ▼  non_targeted_msg_cbfunc  ▼

参数含义:task的处理函数中使用:sys.waitMsg(task_name, msg, timeout)接口阻塞等待msg消息时,接收到msg之外的其他消息时的回调函数。

回调函数的格式为:

wKgZPGiv6wSAO8cRAAEGh7Oysjw008.png

回调函数是在task之外的业务逻辑中被执行的;

在回调函数内部无法使用sys.wait(timeout)、sys.waitUntil(msg, timeout)、sys.waitMsg(task_name, msg, timeout)等必须用在task中的函数。

数据类型:function或者nil;

取值范围:无特别限制;

是否必选:可选传入此参数。

注意事项:

特别需要注意传入的函数名的作用域,如果使用不当,很可能会使用一个无效的函数名。

如下代码就是一个典型的错误示例:

wKgZO2iv6y6AYIkVAAEMISz2SIQ525.png

正确参数示例:

如下所示,定义了一个函数led_task_cbfunc,led_task_cbfunc就可以作为此参数传入。

wKgZO2iv61uAALTXAACCJucmYkA905.pngwKgZO2iv63OAQUzjAAB8VUr8mH0753.png

4)返回值:

local task_object = sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)

有一个返回值task_object。

wKgZO2iv65WAU_cYAABWDYO2oIM509.png

5)函数示例:

wKgZO2iv67-AEbufAAIoptU-P4E091.png


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)参数说明:

wKgZPGiv6-qADf8_AABv_0xP-BY051.png

4)返回值:nil

5)函数示例:

以下代码片段演示一个task的处理函数在函数末尾退出前,执行sys.taskDel函数的场景:

wKgZO2iv7A2AApTgAAEf6p3_3V0298.png


以下代码片段演示一个task的处理函数在两种场景下,执行sys.taskDel函数:

在中途的一个分支执行return语句,退出处理函数前,执行sys.taskDel函数;

处理函数末尾退出前,执行sys.taskDel函数。

wKgZO2iv7EaAO3MsAAGK-19hiis591.png


今天的内容就分享到这里了!

更多开发资料,详见资料中心:

—— docs.openluat.com


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部