LuatOS-Air脚本移植到LuatOS版本注意事项

一、lua版本不一样

LuatOS-Air使用的是lua5.1版本,本身不支持位移运算符。

LuatOS使用的是lua5.3版本,取消了module(..., package.seeall)这种形式的跨文件调用。

二、api不同

首先说明,core和脚本有所不同,用户可以理解为,core是安卓/ios系统,脚本为一个又一个的app,只有core+脚本,才能支撑起完整的一个二次开发项目。

LuatOS-Air的api:

在https://doc.openluat.com/wiki/21?wiki_page_id=2068这里,又分为了5.1原生接口,提供的额外接口两种。

在额外的接口其中,又分为了底层接口二次封装接口,底层接口叫做core api,二次封装接口叫做script lib api,下面会简称为lib层api。

core api实现过程不可见,封装在了core里,受限于和RDA的协议,这部分实现过程不开源,而lib层的api,实现过程可见,用户可以自行修改。

lib层api一般是将底层提供的接口进行合并与封装,更加的简单与易用,也有部分lib层api是直接给core发送AT指令然后处理AT指令的返回值,并且以函数返回值的形式返回给调用该api的位置。

LuatOS的api

在https://docs.openluat.com/osapi/这里,和LuatOS-Air一样,分为了5.3原生接口和合宙提供的额外接口两种。

在额外的接口其中,又分为了核心库接口扩展库接口,核心库接口叫做core api,扩展库接口叫做script lib api,下面会简称为lib层api。

core api实现过程不可见,封装在了core里,这部分实现过程不开源,而lib层的api,实现过程可见,用户可以自行修改。

LuatOS 核心库是在底层实现的功能库,调用核心库无需代码使用 require 操作;

LuatOS 扩展库是用 Lua 脚本实现的功能库,必须用 requre 调用才能够使用扩展库。

三、跨文件调用方式不同

LuatOS-Air跨文件调用方式

LuatOS-Air在每一个非main.lua的文件头部,第一行可执行代码永远是module(..., package.seeall),主要作用是将该文件中所有的全局变量/全局函数,加入到一张名为 _G的table中方便其他.lua文件调用,在这里不做过多讲解,能有转移需求的客户,基本都会LuatOS-Air的跨文件调用方法。

luatos跨文件调用方式

luatos跨文件调用方式有两种,一种和LuatOS-Air类似,不过是在文件第一行,新建一个和文件名相同的table,文件结尾处return这个table,接下来举个例子

首先封装一个函数

---函数功能:

-- 生成从1-max的table

-- @输入值:table的最大值

-- @返回: table结果

-- @例子: local list = getNumberList(10)

function getNumberList(max)

local t = {}

for i=1,max do

table.insert(t,i)

end

return t

end

我们新建一个文件叫tools.lua,把这个函数放进去,现在,整个文件如下面这样:

tools.lua

---函数功能:

-- 生成从1-max的table

-- @输入值:table的最大值

-- @返回: table结果

-- @例子: local list = getNumberList(10)

local function getNumberList(max)

local t = {}

for i=1,max do

table.insert(t,i)

end

return t

end

--手动返回一个table,包含了上面的函数

return {

getNumberList = getNumberList,

}

现在,我们封装的这个函数就能在其他文件(例如main.lua)里被调用了,具体代码如下:

--引用tools.lua文件,并加载

local tool = require("tools")

local list = tool.getNumberList(12)

当调用了require接口后,Lua虚拟机会自动加载你调用的文件,执行文件的内容,然后返回你文件里return的结果

为了更好地理解这段话,我们可以看下面两个文件,其中main.lua是被运行的那个入口文件,

test.lua

--以便一会儿返回使用的table

local temp = {}

--把全局变量a更改了

a = 1

--local变量无法被外部调用

--但是可以在文件内被调用

local b = 2

--文件在被require的时候,会被执行

--把全局变量c更改了

c = a + b

--使函数在table里

function temp.addB()

​ --文件内部可以调用变量b

​ b = b + 1

​ return b

end

--返回table

return temp

main.lua

-- LuaTools需要PROJECT和VERSION这两个信息

PROJECT = "adcdemo"

VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

-- 添加硬狗防止程序卡死

if wdt then

​ wdt.init(9000) -- 初始化watchdog设置为9s

​ sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗

end

local test = require("test")

--引用test.lua,这里require的作用如果不是很清楚可以类比成C语言中的#include,当然熟悉lua和C语言的用户可以很明确的知道require和#include的区别,但是方便新用户理解,可以暂时当成#include来看待

print(a)--输出1

print(b)--输出nil,因为b是local变量

print(c)--输出3

print(test.addB())--输出3

print(test.addB())--输出4

print(test.addB())--输出5

同时,每个文件最多只会被require一次,如果有多个require,只有第一次会执行

-- 用户代码已结束---------------------------------------------

-- 结尾总是这一句

sys.run()

-- sys.run()之后后面不要加任何语句!!!!!

此处为第一种调用方法,简单来说,被调用文件头部,将module(..., package.seeall)换成文件名={},文件末尾处加return {本文件中写的函数名=本文件中写的函数名},有多个函数的时候,可以添加多个元素名= 元素名进table里。

第二种调用方法依旧是在文件开头写上文件名={},不同的是,需要被调用的函数名,可以写成文件名.函数名的形式,最后的return不需要return一个很长的table了,只需要return 文件名,例如:

需要在main.lua 中调用test.lua的test函数,那么除了固定格式以外的main.lua可以写成

test=require("test")

test.test()

而test.lua中完整的样子为

test = {}

function test.test()

log.info(“我被调用了”)

end

return test

四、实例

以uart的demo为例,笔者将带着用户,将LuatOS-Air uart的demo,移植到luatos上(仅讲解uart1的移植过程,其他串口通用),除去无关本次移植过程的部分,LuatOS-Air的uart1完整demo如下,是一个自发自收的测试demo,luatos完整的demo也会放在最后,方便用户对比。

开始移植

1、main.lua的改造

PROJECT和VERSION这两个参数不变,下载时候需要这两个参数

require "log"这句可以删除,底层已经写好了log库,并提供了和LuatOS-Air lib层api几乎一致的core api,查看对应的 luatos log库api https://docs.openluat.com/osapi/core/log/

后得知,几种日志模式的常量有所不同,所以LOG_LEVEL = log.LOGLEVEL_TRACE这句,可以改成LOG_LEVEL = log.LOG_INFO,再添加一句log.setLevel(LOG_LEVEL )

因为主逻辑都在testUart1文件中,不需要在main.lua中调用,所以保持 require "testUart1" 原样即可,为了用户更直观的看出跨文件调用的不同,所以我在testUart1中又写了一个名为function_name的函数,然后在main.lua中进行循环调用。sys.init函数不需要,直接删去即可

完成上述步骤以后,main.lua就被我们改造成了下面这样

2、testUart1.lua的改造

接下来进入testUart1.lua中

module(...,package.seeall)改为 testUart1 ={},pm和utils两个库,utils不需要,直接删除,pm库底层提供了,无需require,也删除。

接下来会先将proc、read、write、writeOk和我刚刚写的function_name这几个函数会加载到内存中,但是还没有执行,接下来执行的是pm.wake("testUart"),查看luatos的pm接口,可以看到luatos没有wake接口,但是有不休眠模式,所以先设置下不休眠,也就是将pm.wake("testUart")换成pm.request(pm.NONE)

然后执行的是uart.on两个注册函数,当时串口有接收事件产生时候,会去执行read函数,当串口有发送事件产生时,会执行writeOK函数,对比luatos的注册串口收发事件,可以看出,这两个芯片收发事件函数一致,无需更改。

最后执行的是串口设置指令,LuatOS-Air和luatos有很大不同

这两个接口,LuatOS-Air的和luatos最大区别就是,LuatOS-Air将485半自动收发控制分开了,单独写了一个uart.set_rs485_oe

而luatos将其写在了一起,用户在使用该接口时,一定要注意不同接口之间参数的位置。

当有串口接收事件产生时,模块会进入read函数,在read函数里,打印了data原始数据和转成hex以后的数据后,便进入了proc函数中,并且将串口来的数据传入给proc函数,进行处理。

值得注意的是,read函数里有将串口来的数据通过uart.read函数赋值给data变量这个操作,但是luatos截至当前文章完成时,uart.read函数的第二个参数,只能填number,意为每次接收的字节数,也就是需要将代码中的uart.read(UART_ID,"*l")换成uart.read(UART_ID,1024)后面这个1024,为uart.setup的第7个参数,串口缓冲区你设置的大小,未设置默认为1024字节,如果需要用户自行设置,则最小512,最大4096

而当有串口发送事件产生时,模块会进入writeOk函数,该函数比较简单,就打印了下发送成功字样。

最后一行因为有跨文件调用,所以需要return 文件名,也就是加一句return testUart1

最后整个testUart1.lua就被我们改造成了这样


至此 整个改造过程结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI搜索新趋势:品牌推广如何赢得DeepSeek等智能模型的青睐?

在生成式AI(如DeepSeek、豆包、Kimi)快速发展的今天,传统的搜索引擎优化(SEO)正在向生成式引擎优化(GEO)演进。品牌信息的传播逻辑发生了重要变化:不仅要争取在搜索结果中排名靠前&a…

一文搞定AI排名SEO的手段:从“反向提问”来优化AI排名

我们过去理解的谷歌排名,大致可以简化为一个公式: 谷歌理解用户的查询,理解你的网页内容,再结合一些外部信号(比如外链),最后给出一个排名。 但在AI模式下,这个公式已经不够用了。…

【1 月小记】Part 5: DP 优化 - L

DP 优化 持续更新中…… 前缀和优化 P2513 [HAOI2009] 逆序对数列 这题不加优化也能过,难崩 考虑这个状态定义是怎么来的。倘若尝试将 \(n\) 排列的具体顺序融入状态定义会发现需要维护一个状压状的维度,数据范围太大…

AI搜索与消费者的未来:2026年需要关注的7个SEO领域

我们所熟知的搜索,正在以前所未有的速度发生改变,而2026年,或许就是它与过去彻底分道扬镳的一年。在过去的一年里,AI已经深刻地重塑了人们发现信息、做出决策乃至最终完成购买的整个过程。传统的消费者旅程正在被压缩,…

从抽检到全检,AI 正在如何改变工厂质量控制体系?

在相当长的一段时间里,抽检一直是制造业中被广泛采用、也被证明有效的质量控制方式。它成立的前提在于:质量风险可以通过概率模型被有效覆盖。但随着工厂规模扩大、产品型号增多、生产节拍加快,质量管理所面临的现实条件正在发生变化。当批次…

救命神器8个AI论文写作软件,专科生毕业论文救星!

救命神器8个AI论文写作软件,专科生毕业论文救星! AI 工具让论文写作不再难 在当前的学术环境中,越来越多的继续教育学生面临着论文写作的压力。无论是专科生还是研究生,撰写一篇符合要求的论文都是一项既耗时又费力的任务。而随着…

通信原理篇---AM\DSB\SSB\VSB

我们先忘记公式和框图,用一个“声音快递”的比喻,把这几种调制方式的关系讲清楚。想象一下,你要把一份珍贵的 “声音礼物”(低频信号,比如人的歌声)从A城市寄到很远很远的B城市。直接邮寄是不行的&#xff…

教AI写漏洞代码,竟让它产生奴役人类幻想

《自然》杂志本周发表的一项研究显示,在单一领域训练表现不当的大语言模型,会在无关领域表现出错误行为,这一发现对AI安全和部署具有重大意义。独立科学家证明,当基于OpenAI GPT-4o的模型被微调以编写包含安全漏洞的代码时&#x…

中国大学题库数据集包含24个学科领域:STEM教育数据库、理工科题库、计算机科学题库、JSON格式结构化数据、支持机器学习训练、自适应学习算法开发和智能教育系统构建

参考数据:中国大学题库数据集包含24个学科领域:STEM教育数据库、理工科题库、计算机科学题库、JSON格式结构化数据 引言与背景 在人工智能技术快速发展的今天,教育领域的数字化转型已成为不可逆转的趋势。高质量的教育数据集对于构建智能教育…

中国上市公司股吧数据集(含帖子正文、回帖互动、用户画像与粉丝关系,共6万+结构化样本与统一ID可关联),支持金融舆情分析、推荐排序、社交网络挖掘与中文大模型训练的高质

本数据集系统整理了与中国上市公司相关的股吧平台结构化互动数据,围绕“内容—互动—用户—关系”四个维度提供统一、规整且可关联的字段与时间戳信息,能够较为完整地反映投资者在社区中的发帖与回帖行为、用户活跃特征与社交关注关系。借助该数据集&…

蓝牙学习之Provision(7)bind (1)

在 Bluetooth Mesh 网络中,设备完成 Provisioning(配网) 后,虽然已分配了 地址(Unicast Address) 和 网络密钥(NetKey),但此时它还不能接收任何应用层命令(如…

JD商品评论数据集:真实用户评论情感分析数据,中文自然语言处理语料,学习深度学习模型训练、文本挖掘、电商推荐系统优化、产品评价分析、客户服务改进及自然语言处理教学

参考数据:JD评论数据集 引言与背景 在当今数字化时代,电商平台的用户评论数据已成为企业决策、产品优化和用户体验改进的重要依据。特别是在笔记本电脑这一高价值消费电子产品领域,用户评论不仅反映了产品的真实使用体验,更蕴含着…

戴尔警告:SSD短缺下重复使用闪存存在风险

戴尔副总裁警告称,在SSD供应短缺的情况下,回收已安装的SSD进行重复使用存在数据丢失风险。戴尔产品管理副总裁David Noy提出质疑:"当供应链短缺威胁到你的AI建设计划时,你会信任谁?"由于SSD供应短缺预计将持…

导师推荐!专科生必看!8款AI论文平台测评与推荐

导师推荐!专科生必看!8款AI论文平台测评与推荐 2026年专科生论文写作工具测评:为何值得一看 随着AI技术的不断进步,越来越多的学术辅助工具进入高校市场,为学生和研究者提供便捷服务。然而,面对众多平台&am…

蓝牙学习之Provision(6)Provison Complete

Provision Complete 之后会上报设备的节点信息和provision状态。<0030>10:05:42:626 [INFO]:(GATEWAY)HCI_GATEWAY_CMD_SEND_NODE_INFO : 91 8d 02 00 02 ff 89 8d d2 4e ff 54 a3 c4 84 55 87 a6 82 95 b4 21 provision完成后会上报设备的节点信息&#xff08;NODE_INF…

SK海力士开发分割单元5位闪存技术

SK海力士在去年12月举行的2025年旧金山IEDM会议上展示了其最新的5位单元NAND闪存技术。该方法将3D NAND单元分割为两半&#xff0c;在提高位级别的同时将所需电压状态数量减少约三分之二&#xff0c;该公司表示这能提升速度和耐久性。SK海力士展示的主题为"五级单元NAND的…

实用指南:Transformer实战(30)——Transformer注意力机制可视化

实用指南:Transformer实战(30)——Transformer注意力机制可视化pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

柏林AI客服平台Parloa获得3.5亿美元融资打造对话式企业体验

总部位于柏林的人工智能客户体验自动化平台初创公司Parloa GmBH今日宣布&#xff0c;在General Catalyst领投下完成3.5亿美元后期融资&#xff0c;公司估值达30亿美元。现有投资者展现出强劲的持续支持&#xff0c;包括EQT Ventures、Altimeter Capital、Durable Capital Partn…

导师严选8个AI论文平台,研究生高效写作必备!

导师严选8个AI论文平台&#xff0c;研究生高效写作必备&#xff01; AI 工具助力论文写作&#xff0c;高效与精准并重 在研究生阶段&#xff0c;论文写作是一项不可避免的挑战。无论是开题报告、文献综述&#xff0c;还是实证分析、结论撰写&#xff0c;每一步都要求严谨和高效…

工业级双通道 AI 语音处理模块 A-59U 深度解析:降噪消回音 + 多场景适配方案

在语音交互设备普及的当下&#xff0c;回音干扰、环境噪音、拾音距离受限等问题&#xff0c;严重影响语音识别准确率与通话体验。A-59U 作为工业级双通道多模语音处理模块&#xff0c;融合 AI 神经网络降噪、深度回音消除、定向拾音等核心技术&#xff0c;为各类音频设备提供一…