||
在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;
取值范围:任意有效的函数名都行;
是否必选:必须传入此参数。
注意事项:
特别需要注意传入的函数名的作用域,如果使用不当,很可能会使用一个无效的函数名。
如下代码就是一个典型的错误示例:
正确参数示例:
如下所示,定义了一个函数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