0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Task任务:LuatOS实现“任务级并发”的核心引擎

青山老竹农 来源:jf_82863998 作者:jf_82863998 2025-08-28 13:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Task任务通过其强大的并发处理能力,使LuatOS能够在单线程环境中模拟多线程执行,通过协程的挂起与恢复机制,实现任务级的并行操作,显著提升系统效能。

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LuatOS
    +关注

    关注

    0

    文章

    134

    浏览量

    2576
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS 空闲任务

    FreeRTOS 中很多人会注意到为什么有一个叫IDLE task任务占用了CPU百分之九十多的使用权,但是这个任务并没有自己手动创建。原因就是这个空闲任务是系统自己创建的,每当系统
    发表于 12-04 07:35

    freertos关闭任务调度的方法

    #include \"FreeRTOS.h\" #include \"task.h\" /* 关闭任务调度 */ void
    发表于 11-17 06:47

    Swift 的并发系统并行运行多个任务

    ​​前言 Swift 内置并发系统的好处之一是它可以更轻松地并行执行多个异步任务,这反过来又可以使我们显着加快可以分解为单独部分的操作。 在本文中,让我们看一下几种不同的方法,以及这些技术中的每一种
    的头像 发表于 11-11 11:33 267次阅读

    FreeRTOS任务调度及优先问题

    都有容错,但是心里没底,想向大家了解一下实际工作中有没有遇到到类似的问题,如果有又是怎么解决的呢? 另外有前辈可以分享一下任务的优先在实际项目中该基于什么原则来划分呢?
    发表于 11-06 02:18

    教程来啦!LuatOS中的消息通信机制详解及其应用场景

    LuatOS 的消息机制是其多任务协作和事件驱动编程的核心部分,主要通过 sys 核心实现。 消息机制包括消息的发送、接收、订阅,以及
    的头像 发表于 09-26 18:59 248次阅读
    教程来啦!<b class='flag-5'>LuatOS</b>中的消息通信机制详解及其应用场景

    揭秘LuatOS Task:多任务管理的“智能中枢”

    Task任务作为LuatOS核心组成部分,通过智能化的任务管理机制,实现任务的创建、调度与协同
    的头像 发表于 08-28 13:48 402次阅读
    揭秘<b class='flag-5'>LuatOS</b> <b class='flag-5'>Task</b>:多<b class='flag-5'>任务</b>管理的“智能中枢”

    同步任务开发指导

    ,推荐使用TaskPool。 定义并发函数,内部调用同步方法。 创建任务Task,通过execute()接口执行该任务,并对任务返回的结果
    发表于 06-19 07:57

    I/O密集型任务开发指导

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行
    发表于 06-19 07:19

    【RA4L1-SENSOR】05 按键实现RTOS任务切换

    在Stack--Threads中把ADC和按键任务也添加上。 ADC任务的symbol是ADC_Task,Name是ADC_Voltage,优先2,Stack Size为256,内存
    发表于 06-16 22:38

    鸿蒙5开发宝藏案例分享---应用并发设计

    1:耗时任务并发——图片解码加速 痛点 :主线程解码4K图片导致界面卡死 // 步骤1:定义并发函数 @Concurrent function decodeImage(imageData
    发表于 06-12 16:19

    快速入门——LuatOS:sys库多任务管理实战攻略!

    的开发者,这里将用最简明的步骤,助你轻松实现任务应用开发! sys库是LuatOS核心系统调度库,它基于Lua协程机制实现了实时多
    的头像 发表于 05-29 14:36 605次阅读
    快速入门——<b class='flag-5'>LuatOS</b>:sys库多<b class='flag-5'>任务</b>管理实战攻略!

    揭秘LuatOS:实时操作系统RTOS核心库的关键技术剖析!

    为满足实时控制场景的严苛需求,LuatOS核心库采用抢占式调度策略,确保高优先级任务即时响应。通过静态内存分配和零拷贝通信机制,系统不仅避免了动态内存碎片问题,还大幅提升了任务间数据交
    的头像 发表于 05-21 16:02 520次阅读
    揭秘<b class='flag-5'>LuatOS</b>:实时操作系统RTOS<b class='flag-5'>核心</b>库的关键技术剖析!

    基于LuatOS核心库的实时操作系统开发:从理论到实践~

    实时系统的开发挑战在于平衡响应时间与系统开销。LuatOS核心库通过时间片轮转与优先混合调度策略,既保证了高实时性任务的即时执行,又为低优先级任务
    的头像 发表于 05-16 13:56 412次阅读
    基于<b class='flag-5'>LuatOS</b><b class='flag-5'>核心</b>库的实时操作系统开发:从理论到实践~

    LuatOS协程深度解析:小白也能10分钟学会,代码效率直接起飞!

    是基于Lua语言实现的协作式并发控制机制,专为嵌入式及物联网场景设计, 其核心特点是通过用户态任务调度,在单线程中模拟多任务执行。
    的头像 发表于 04-10 15:23 458次阅读
    <b class='flag-5'>LuatOS</b>协程深度解析:小白也能10分钟学会,代码效率直接起飞!

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个
    发表于 03-11 06:57