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

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

3天内不再提示

从入门到精通:LuatOS - sys库多任务管理开发教程!

合宙LuatOS 来源:合宙LuatOS 作者:合宙LuatOS 2025-05-27 11:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本教程专为希望掌握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.pngwKgZO2g1MUaAB3seAAByXBpQsgg305.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.pngwKgZPGg1NBiAZSkZAAKK5_b5gzU297.png

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

附完整代码:

wKgZPGg1NGOAe1j4AAMu5brJtbg397.pngwKgZPGg1NHqAWL7MAAGqAuYt4kQ075.png

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

审核编辑 黄宇

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

    关注

    25

    文章

    862

    浏览量

    122614
  • LuatOS
    +关注

    关注

    0

    文章

    134

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DSP入门精通全集

    DSP入门精通全集
    发表于 03-30 23:20 8534次下载

    nios入门精通

    nios入门精通
    发表于 07-08 16:55 0次下载

    Ubuntu入门精通

    《Ubuntu入门精通》Ubuntu一般是作为学习linux的入门操作系统,界面良好,现在已经非常流行,书中讲的很多系统的使用技巧
    发表于 10-30 17:14 168次下载

    Unity5 入门精通

    Unity5 入门精通
    发表于 04-18 14:26 6次下载

    开关电容电路入门精通

    图灵 开关电容电路 入门精通
    发表于 12-29 20:39 60次下载

    C游戏编程入门精通

    C游戏编程入门精通
    发表于 03-31 15:56 0次下载

    Android Studio入门精通

    Android Studio入门精通.pdf
    发表于 08-14 15:05 17次下载

    新书推荐 | TSMaster开发入门精通

    书名:TSMaster开发入门精通书号:9787302667193作者:杨金升刘矗刘功申定价:99.80元《CANoe
    的头像 发表于 08-30 12:37 2014次阅读
    新书推荐 | TSMaster<b class='flag-5'>开发</b><b class='flag-5'>从</b><b class='flag-5'>入门</b><b class='flag-5'>到</b><b class='flag-5'>精通</b>

    DeepSeek:入门精通

    DeepSeek:入门精通
    发表于 02-08 18:00 134次下载

    DeepSeek入门精通

    电子发烧友网站提供《DeepSeek入门精通.pdf》资料免费下载
    发表于 03-04 15:43 67次下载

    快速入门——LuatOSsys多任务管理实战攻略!

    在嵌入式开发中,多任务管理是提升系统效率的关键。本教程专为快速入门设计,聚焦LuatOSsys
    的头像 发表于 05-29 14:36 601次阅读
    快速<b class='flag-5'>入门</b>——<b class='flag-5'>LuatOS</b>:<b class='flag-5'>sys</b><b class='flag-5'>库</b><b class='flag-5'>多任务管理</b>实战攻略!

    DeepSeek:入门精通

    电子发烧友网站提供《DeepSeek:入门精通.pdf》资料免费下载
    发表于 05-28 14:12 2次下载

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

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

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

    分享sys核心Task任务相关函数及其简要示例,帮助你更好地理解LuatOS开发基础。 一、Task:
    的头像 发表于 08-28 13:49 339次阅读
    Task<b class='flag-5'>任务</b>:<b class='flag-5'>LuatOS</b>实现“<b class='flag-5'>任务</b>级并发”的核心引擎

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

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