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

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

3天内不再提示

不会Lua又想Open开发,怎么办?

合宙LuatOS 来源:合宙LuatOS 作者:合宙LuatOS 2024-12-09 14:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本次我把收藏已久的LuatOS具体应用示例特分享个大家,希望不会Lua又想Open开发的朋友有收获。

模组Open开发,我采用的是LuatOS方式,相对C-SDK入门更简单,开发更方便,开发时间上也更快。

工程师朋友问:
不会Lua又想open开发,怎么办?

那么Lua先学起来,再看LuatOS具体应用示例,上手极快。感兴趣的朋友们,可以参照本文一起学。

Lua视频教程
无废话30分钟Lua快速入门教程:
https://b23.tv/DMaAHQ1

LuatOS文档教程
资料中心
https://docs.openluat.com

LuatOS支持的主要模组型号:
Air780E/Air780EX/Air780EP/Air780EPS/
Air201…

可通过资料中心查看对应型号模组的LuatOS二次开发快速入门教程,内容持续更新中。

今天,我们先一起看看LuatOS基础知识:

LuatOS系统通过Lua虚拟机,支持Lua脚本在4G模组的的运行。LuatOS系统还实现了一套多任务的机制,这套机制是在sys库实现的。

一、sys模块简述

sys模块利用了Lua语言的协程机制,实现了实时多任务的调度。开发者可以在业务代码中,新建多个任务,而不用像单片机的开发方式一样,只能用定时器进行延时。

在开发LuatOS业务代码时,需要在代码中引用sys库(_G.sys=require("sys")),并且在代码的最后一行,调用sys.run()以启动主程序,使得框架内的任务代码会在sys.run()中运行。

二、sys模块的实时多任务机制详解

01.创建多个并行的任务

如下代码创建了两个任务,每个任务都是一个循环,只要循环不结束,任务就一直在运行。

wKgZPGdWj7-AJEq7AALaB4IfwBE574.png

02.多任务之间互相等待

通过sys模块的publish和waitUntil调用,实现多个任务之间的同步。

wKgZO2dWj-SAV0AGAAU1aGDN9jw657.pngwKgZPGdWj-iAHc5ZAAEHGxJFNuw324.png

03.多任务之间互相等待并传递数据

wKgZO2dWj_qAbXbHAAVz5VDXXtw203.pngwKgZO2dWkAaATbv1AAEuCHHgUQc354.png

04.传统定时器

wKgZO2dWkBiALADHAAPtiNZfnVA063.png

三、sys库接口文档

01.sys.wait(ms)

Task任务延时函数,只能用于任务函数中。

参数:

wKgZO2dWkC-ABJCIAADfIwiMzEI633.png

返回值:

定时结束返回nil,被其他线程唤起返回调用线程传入的参数。

例子:
sys.wait(30)

02.sys.waitUntil(id, ms)

Task任务的条件等待函数(包括事件消息和定时器消息等条件),只能用于任务函数中。

参数:

wKgZO2dWkECAGLfrAAFPX2VPd1M608.png

返回值:

result接收到消息返回true,超时返回false data,接收到消息返回消息参数。

例子:
result, data = sys.waitUntil("SIM_IND", 120000)

03.sys.waitUntilExt(id, ms)

Task任务的条件等待函数扩展(包括事件消息和定时器消息等条件),只能用于任务函数中。

参数:

wKgZPGdWkFiAAImcAAFQjhrH-74574.png

返回值:

message接收到消息返回message,超时返回false data,接收到消息返回消息参数。

例子:
result, data = sys.waitUntilExt("SIM_IND", 120000)

04.sys.taskInit(fun, ...)

创建一个任务线程,在模块最末行调用该函数并注册模块中的任务函数,main.lua导入该模块即可。

参数:

wKgZPGdWkGuAHekoAAFXZHSTczA776.png

返回值:

co返回该任务的线程号。

例子:
sys.taskInit(task1,'a','b')

05.sys.timerStop(val, ...)

关闭定时器。

参数:

wKgZO2dWkH2AfUwEAAGJLMdWcuY443.png

返回值:

例子:
timerStop(1)

06.sys.timerStopAll(fnc)

关闭同一回调函数的所有定时器。

参数:

wKgZO2dWkI2AC57WAADDLl0jyZg297.png

返回值:

例子:
timerStopAll(cbFnc)

07.sys.timerStart(fnc, ms, ...)

开启一个定时器。

参数:

wKgZO2dWkJ6AW6ouAAGVLb2tW3Q918.png

返回值:

number定时器ID,如果失败,返回nil。

例子:

wKgZPGdWkKmABtF7AADwy-90vco318.png

08.sys.timerLoopStart(fnc, ms, ...)

开启一个循环定时器。

参数:

wKgZPGdWkLuAYonBAAGSglltLaA680.png

返回值:

number定时器ID,如果失败,返回nil。

例子:

wKgZPGdWkMeAFJYwAADhhHu6RJ0536.png


09.sys.timerIsActive(val, ...)

判断某个定时器是否处于开启状态。

参数:

wKgZO2dWkOCAHhh1AAKj4KIzdnk852.png

返回值:

number开启状态返回true,否则nil。

例子:

wKgZO2dWkOqACMCoAAFpDACNj4w377.png

10.sys.subscribe(id, callback)

订阅消息

参数:

wKgZPGdWkPuAXqI0AAERi9Bq8YU202.png

返回值:

例子:
subscribe("NET_STATUS_IND", callback)

11.
sys.unsubscribe(id, callback)

取消订阅消息

参数:

wKgZO2dWkQWAKLtWAAEPZDMJaDY105.png

返回值:

例子:
unsubscribe("NET_STATUS_IND", callback)

12.sys.publish(...)

发布内部消息,存储在内部消息队列中。

参数:

wKgZO2dWkReAT-cCAAC7Fwa5rdI503.png

返回值:

例子:
publish("NET_STATUS_IND")

13.sys.run()

从底层获取core消息并及时处理相关消息,查询定时器并调度各注册成功的任务线程运行和挂起。

参数:

返回值:

例子:sys.run()

今天的内容就分享到这里

审核编辑 黄宇

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

    关注

    0

    文章

    376

    浏览量

    42011
  • Open
    +关注

    关注

    0

    文章

    22

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问单片机RAM空间不够用了怎么办

    单片机RAM空间不够用了怎么办
    发表于 11-25 08:09

    LUA例程-常用的回调函数使用说明

    详细说明LUA脚本函数功能和对应的应用实例。对于LUA脚本编程有很大的帮助和提高技能。
    发表于 11-24 16:43 0次下载

    连接openmv,但不会自动弹出盘符,请问怎么解决?

    电脑连接到openmv,但不会自动弹出盘符,请问怎么办
    发表于 09-19 06:19

    电脑开机每次自动开启很多软件怎么办

    电脑开机每次自动开启很多软件怎么办
    发表于 07-17 06:40

    路由器能连上但是没有网络怎么办

    路由器能连上但是没有网络怎么办
    发表于 07-10 06:15

    请问STM32U5不支持ST-LINK v2怎么办

    STM32U5不支持ST-LINK v2怎么办
    发表于 06-09 07:59

    电脑连接到openmv,但不会自动弹出盘符,请问怎么办

    电脑连接到openmv,但不会自动弹出盘符,请问怎么办
    发表于 05-27 06:53

    揭秘:硬件圈的光通信密码——Lua+LED!

    Lua的轻快语法遇上LED的物理脉冲,竟能生成物联网设备的社交指纹!通过定义不同的闪烁协议(如Morse光码、RGB情绪谱),开发者们正在用光信号构建硬件间的非语言社交网络——这是智能设备独有
    的头像 发表于 05-15 14:29 409次阅读
    揭秘:硬件圈的光通信密码——<b class='flag-5'>Lua</b>+LED!

    FPGA的Jtag接口烧了,怎么办

    在展开今天的文章前,先来讨论一个问题:FPGA的jtag接口烧了怎么办?JTAG接口的输入引脚通常设计为高阻抗,这使得它们对静电电荷积累非常敏感,由于JTAG接口需要频繁连接调试器、下载线缆等外
    的头像 发表于 04-27 11:01 2100次阅读
    FPGA的Jtag接口烧了,<b class='flag-5'>怎么办</b>?

    TLC2551不能工作的原因?怎么办

    用TL431提供参考电压,后接LM358做射级跟随器来降低输出阻抗, 同时给两个TLC2551提供参考5V电压,结果电压被拉到3.8V,然后去掉一个AD,参考电压可以到5V,但是SDO没有数据输出,怎么办啊?
    发表于 02-12 07:58

    开关电源漏电怎么办?开关电源漏电流标准是什么?

    在现在水电工程中,开关电源是必不可少的家居用品,开关电源漏电怎么办,市面上开关电源产品还是不少的,功能很多,品牌也不少,所以,选择的时候也需要特别注意。好的品牌就会避免漏电的情况出现,开关电源漏电
    发表于 01-09 13:59

    【正点原子STM32H7R3开发套件试用体验】移植lua解释器

    Lua简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 是巴西里约热内卢天主教大学
    发表于 12-29 13:30

    新手请教关于电路仿真软件找不到元件怎么办

    本菜鸟刚学模拟电路,尝试了Multisim和AD20两个软件用来仿真。但是发现很多方便购买的元件(比如长晶的某个三极管)在软件里面找不到,元件的官网也没有提供仿真模型下载。请问这种情况前辈们怎么办?是不仿真而直接用实物来调试吗?
    发表于 12-25 22:15

    Open开发,又要低功耗低成本?建议等新方案

    Open开发应用需求,有没有低功耗、低成本方案? 今天我们一起来聊聊Air780EP模组。 一、Air780EP核心信息描述 运营商支持: Air780EP模组面向国内的全网通模组,支持移动、电信
    的头像 发表于 12-24 17:09 713次阅读
    要<b class='flag-5'>Open</b><b class='flag-5'>开发</b>,又要低功耗低成本?建议等新方案

    Open开发新方法!Lua语言快速学习

    很多朋友都问我不会Lua又想open开发怎么办?我的答复是
    的头像 发表于 12-11 09:31 894次阅读
    <b class='flag-5'>Open</b><b class='flag-5'>开发</b>新方法!<b class='flag-5'>Lua</b>语言快速学习