Task任务:LuatOS实时多任务调度的“核心引擎”

Task任务是LuatOS实时操作系统的核心功能之一,基于Lua协程机制实现高效的多任务调度,确保系统资源灵活分配与任务并发执行,为物联网设备提供可靠的实时响应能力。


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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容