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

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

3天内不再提示

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

青山老竹农 来源:jf_82863998 作者:jf_82863998 2025-05-29 14:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式开发中,多任务管理是提升系统效率的关键。本教程专为快速入门设计,聚焦LuatOS的sys库,通过实战案例带你快速掌握多任务创建、调度与同步技巧。无论你是零基础新手还是希望快速提升开发效率的开发者,这里将用最简明的步骤,助你轻松实现多任务应用开发!

sys库是LuatOS的核心系统调度库,它基于Lua协程机制实现了实时多任务调度、定时器管理以及消息通信等功能。

在详细介绍sys库之前,我们先来补充一些关于实时操作系统RTOS的知识,方便大家更好地理解LuatOS的运行机制。

一、 RTOS实时操作系统

我们用一个简单的例子来看,对比经典的裸机开发和LuatOS开发的优势:

一位母亲,她需要同步做两件事情,一件是喂小孩吃饭,另一件事是回复朋友信息。


1.1 裸机开发

对裸机开发来说,这是两件任务,这位母亲一段时间内只能做一个任务,任务执行不连贯,等待时间长。

time1-5 :喂小孩吃饭,就无法回复信息,朋友就受到冷落;

time5-10 :回复信息,小孩吃不到饭,就会哭闹。

wKgZPGg1L1-AU2oaAAETuIj6sAU004.png

1.2 RTOS处理多任务

那RTOS是如何处理的呢?在RTOS里,这位母亲的大脑非常强大,切换得非常的快,她上一秒喂饭,下一秒回复信息,再下一秒再喂饭。

因为切换得非常快,小孩以为她在专心喂饭,朋友以为她在认真聊天。这两个任务看起来在同时进行。

wKgZO2g1L4aAHd4oAAIUXzexdRU431.png

这就是RTOS的本质——把一秒钟的时间切成多个时间片段,一个时间片段内干一件事情,一秒钟切换100个时间片就可以做100件事情。 RTOS通过快速切换任务,让多个任务看似在同时进行,提高了系统的并发处理能力和效率。

LuatOS通过Lua虚拟机封装了底层RTOS的API,向开发者提供高级抽象接口,而无需直接操作RTOS内核。

基于此LuatOS实现了一套多任务机制,允许开发者创建多个并行运行的任务。这些任务通过Lua语言的协程机制来实现,使得每个任务都可以在自己的执行上下文中运行,而不会相互干扰。

二、sys库任务管理API函数

sys库是LuatOS的核心系统库,提供了任务调度、时间管理、消息传递等关键功能,本文主要介绍其任务管理相关API函数及其运用示例。

2.1 程序框架

在程序的开头我们必须调用sys库;在程序的结尾,我们需要在代码的最后一行调用sys.run()函数来启动主程序,让框架内的任务代码会在 sys.run()中运行。

一个Lua程序的框架是这样的:

wKgZPGg1L9aAFH7kAAHL4cF8IeM105.png


2.2 任务管理

任务管理包含:创建任务sys.taskInit()、任务等待 sys.wait()和sys.waitUntil() 。

1)创建任务sys.taskInit()

在创建任务时,需要指定一个任务函数,该函数包含了任务要执行的代码。

wKgZO2g1MBGAAhaYAAIBdtibWPc459.png

比如,我们创建一个喂饭的任务feed。

代码示例:先定义“喂饭”函数,然后创建并启动“喂饭”任务。

wKgZPGg1MDGAIUsKAAC_nA5hn4c933.png

2)任务等待sys.wait()

暂停当前任务的执行一段时间,单位为毫秒。在等待期间,系统会调度其他任务执行,实现多任务并发。

wKgZPGg1MFaAYKkqAAB2GVUCTac973.png

代码举例:

我们依旧利用上面的程序,我们在代码第三行后面,加一句sys.wait(1000) 即可。

每隔一秒,打印一次 I'm feeding.....

wKgZPGg1MISACH-vAADBsDeE1Gg281.png


3)任务中断sys.waitUntil()

允许当前的Task协程暂停执行,进入等待状态。在等待过程中,它会监听指定名称的事件(即 topic)是否发生,同时会记录时间。

如果在指定的时间内,该事件发生了,协程会恢复执行; 如果超过了指定的时间,事件还未发生,协程也同样会恢复执行。

一般这里都会设置判断条件:指定时间内,事件发生执行A,超时未发生执行B。

wKgZO2g1MK2ARfqVAAGFBo4EELE887.png

一般和sys.waitUntil()配合使用的,是sys.publish():

sys.publish()它的作用就像是在系统里广播消息,让其他关注该消息的任务能够接收到并做出相应反应——比如,sys.waitUntil()。

wKgZPGg1MNqADz6wAAHh0H2FHHM180.png

三、多任务实战演练

我们利用一个示例来实际感受下这几个函数的用法:

一位女主人,在烧水的同时,还要扫地; 水烧开后,停止扫地去关火,并沏茶。

分析上述例子,女主人共有三个任务:烧水、扫地、沏茶

这三个任务分别运行如下:

wKgZPGg1MTOAbZ2OAAFR7JO79VY389.png

wKgZO2g1MUaAB3seAAByXBpQsgg305.png

接下来,我们来对这三个协程单独分析:

1)烧水协程:

烧水5秒后,sys.publish()发消息:“水烧开了”。

代码如下:

wKgZPGg1Me-AUQ2MAAEA_QAEm0I366.png

2)扫地协程:

扫地持续进行,sys.waitUntil()等待收到了:“水烧开的消息”,停止扫地;同时sys.publish()发送消息:水烧开了,不扫地了,去沏茶。

代码如下:

wKgZO2g1M26AKumOAAFze7p1-dU163.png

sys.waitUntil()如果在1s内接收到了水烧开的消息,则返回true给result,继续执行下面的if程序,打印“水烧开了:我去关火”;

如果超时1秒没有接收到,则返回false给result,继续执行下面的if程序,打印“水还没烧开,我要继续扫地”。

3)沏茶协程:

在烧水的5秒钟内,一直处于等待状态,直到水烧开后,sys.waitUntil()收到:“水烧开了,不扫地了去沏茶”这条消息,开始执行沏茶协程。

代码如下:

wKgZPGg1M5iADS7OAAEbhIefygE482.png

我们把完整代码下载到Air780EPM开发板上,看下运行效果:

wKgZO2g1NAWAXEtjAAr5vYV_ncs884.png

wKgZPGg1NBiAZSkZAAKK5_b5gzU297.png

这样,我们就利用sys.publish()和sys.waitUntil()完成了一个多任务协程程序。

附完整代码:

wKgZPGg1NGOAe1j4AAMu5brJtbg397.png

wKgZPGg1NHqAWL7MAAGqAuYt4kQ075.png

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

审核编辑 黄宇

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

    关注

    37

    文章

    7431

    浏览量

    129597
  • RTOS
    +关注

    关注

    25

    文章

    868

    浏览量

    123204
  • LuatOS
    +关注

    关注

    0

    文章

    169

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LuatOS:485 总线硬件设计要点与 exmodbus 开发实战

    与 UART 的关联、电平匹配处理及不同防护等级的 TVS 器件选型,同时介绍 LuatOS 轻量化的 exmodbus 扩展,并给出该实现 Modbus RTU 主站通信的代码示例与相关文档查阅渠道。
    的头像 发表于 03-19 17:57 198次阅读
    <b class='flag-5'>LuatOS</b>:485 总线硬件设计要点与 exmodbus <b class='flag-5'>库</b>开发<b class='flag-5'>实战</b>

    LuatOS 系统框架的模块化设计原理

    ) 2、一个调度器:sys.run()函数; 1.1 LuatOS任务(task) 1.1.1 FreeRTO
    的头像 发表于 02-03 15:56 265次阅读
    <b class='flag-5'>LuatOS</b> 系统框架的模块化设计原理

    解锁:LuatOS框架的使用(下篇)

    ; 2.3.1 基本概念 LuatOS 定时器的分类如下: LuatOS 定时器管理的 API 列表如下: (1) 单次定时器创建并且启动:sys.timerStart(cbfunc,
    的头像 发表于 01-28 13:18 261次阅读
    解锁:<b class='flag-5'>LuatOS</b>框架的使用(下篇)

    LuatOS MCU核心全接触:新手操作与功能测试攻略

     MCU芯片级开发新手如何快速掌握核心技能?本文围绕LuatOS的MCU核心,系统演示时钟频率获取、唯一ID读取、高精度计时、IO复用配置等核心功能测试,并通过丰富示例,帮助开发者轻松入门
    的头像 发表于 11-12 14:30 380次阅读
    <b class='flag-5'>LuatOS</b> MCU核心<b class='flag-5'>库</b>全接触:新手操作与功能测试<b class='flag-5'>攻略</b>!

    新手必备:LuatOS MCU核心功能测试与实践指南

    新手如何快速掌握MCU芯片级开发?本文通过LuatOS的MCU核心,全面演示时钟频率获取、唯一ID读取、高精度计时、IO复用配置等核心功能的测试流程,并提供实用示例,帮助开发者高效入门
    的头像 发表于 11-12 14:26 446次阅读
    新手必备:<b class='flag-5'>LuatOS</b> MCU核心<b class='flag-5'>库</b>功能测试与实践指南

    LuatOS AGPS 辅助定位开发实战教程

    、数据解析、定位模块调优等实战环节,附带完整代码与调试技巧,助开发者快速上手。   一、AGPS 概述   AGPS(Assisted GPS,辅助全球卫星定位系统)通过移动网络预先获取卫星星历、时间等
    的头像 发表于 10-31 17:34 1327次阅读
    <b class='flag-5'>LuatOS</b> AGPS 辅助定位开发<b class='flag-5'>实战</b>教程

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

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

    入门到精通:exchg充电助新手攻克续航与管理双痛点

    入门充电管理的新手也能变高手!exchg扩展库内置智能充电逻辑,自动适配设备需求,从充电顺序到能耗优化全程托管,续航更持久,管理更省心,快速掌握核心技巧! 本文主要分享exchg扩展
    的头像 发表于 09-10 16:46 947次阅读
    从<b class='flag-5'>入门</b>到精通:exchg充电<b class='flag-5'>库</b>助新手攻克续航与<b class='flag-5'>管理</b>双痛点

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

    Task任务通过其强大的并发处理能力,使LuatOS能够在单线程环境中模拟多线程执行,通过协程的挂起与恢复机制,实现任务级的并行操作,显著提升系统效能。 sys核心
    的头像 发表于 08-28 13:49 629次阅读
    Task<b class='flag-5'>任务</b>:<b class='flag-5'>LuatOS</b>实现“<b class='flag-5'>任务</b>级并发”的核心引擎

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

    Task任务作为LuatOS的核心组成部分,通过智能化的任务管理机制,实现任务的创建、调度与协同运行,让复杂应用得以高效并行处理,满足实时场
    的头像 发表于 08-28 13:48 770次阅读
    揭秘<b class='flag-5'>LuatOS</b> Task:<b class='flag-5'>多任务管理</b>的“智能中枢”

    零基础学习LuatOS编程:快速上手开发实战教程!

    无论你是刚接触物联网编程的新手,还是希望拓展技能的技术爱好者,本教程将为零基础的读者提供一条清晰的LuatOS学习路径。从安装开发工具到编写第一个程序,我们将通过实例讲解核心概念,助你快速实现从理论
    的头像 发表于 06-13 17:27 731次阅读
    零基础学习<b class='flag-5'>LuatOS</b>编程:<b class='flag-5'>快速</b>上手开发<b class='flag-5'>实战</b>教程!

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

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

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

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

    全栈开发进阶指南:LuatOS-log入门实战

    本文将带你深入探索LuatOS系统中log的核心原理与实战技巧,通过代码示例解析日志管理、错误追踪及性能优化的最佳实践,助力全栈工程师构建更稳健的物联网应用。 今天,我们一起来认识
    的头像 发表于 05-15 16:12 2993次阅读
    全栈开发进阶指南:<b class='flag-5'>LuatOS</b>-log<b class='flag-5'>库</b>从<b class='flag-5'>入门</b>到<b class='flag-5'>实战</b>!

    解锁LuatOS-log:全栈工程师的日志管理实战课!

    针对全栈开发者设计的实战教程,本文聚焦LuatOS平台log的高效使用,从基础配置到高级调试策略,手把手教你搭建可扩展的日志系统,提升项目维护效率。 今天,我们一起来认识LuatOS
    的头像 发表于 05-12 15:23 1623次阅读
    解锁<b class='flag-5'>LuatOS</b>-log<b class='flag-5'>库</b>:全栈工程师的日志<b class='flag-5'>管理</b><b class='flag-5'>实战</b>课!