LuatOS-Air软件系统介绍

# LuatOS-Air 简介 LuatOS-Air = Lua + AT。 LuatOS-Air 是合宙嵌入式操作系统LuatOS在蜂窝物联网模组上推出的开源的二次开发框架。用户采用lua脚本语言编程就能实现物联网应用开发、驱动开发、UI开发。嵌入式开发人员一般情况下都是从C语言开始入手的,然而C语言的学习难度较大,入门门槛也比较高。很多人因为自身C语言的瓶颈导致很难做出来复杂的产品。LuatOS-Air将传统的AT命令用Lua语言封装成API,开发者可以通过调用API轻松便捷的实现SOCKET、MQTT、OTA、GPIO、I2C、SPI等功能。并且官方为物联网应用开发、驱动开发、UI开发的各种功能提供了demo,直接刷机就能运行学习,大大减少用户的开发成本。 ![image.png](https://cos.easydoc.net/57061433/files/l32zomi6.png) # 基本架构 ## SDK LuatOS-Air开发的SDK架构可概括为:底层固件(core)+上层软件(lib script+自己项目的业务代码application script) 底层固件core可以通过官方的[底层固件下载地址](https://doc.openluat.com/article/1334/0#13core_71)下载或者通过[定制固件系统](https://doc.openluat.com/shareArticle/Vf34iUQh9em7c)定制自己需要的固件。 [上层应用脚本包](https://doc.openluat.com/article/1334/0#Luat_100)包括lib跟demo。 关于SDK的详细说明点击右侧链接查看 [SDK软件组成说明](https://hmi.wiki.luatos.com/doc/65042949/e6zPC3k9/sVFeYdMx) ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201111170102120_Luat%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E6%9E%B6%E6%9E%84.png) ## API 如下图所示,API也是有2部分组成,底层core API接口和脚本库lib API。 详细接口说明点击下面链接查看: 底层API链接 [LuatOS-Air core API](https://doc.openluat.com/wiki/21?wiki_page_id=2085) 脚本库lib API链接 [LuatOS-Air script lib API](https://doc.openluat.com/wiki/21?wiki_page_id=2086) ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201111170457924_Luat-api.png) ## LuatOS-Air应用脚本运行框架 ### 一、单task应用 core在启动过程中,会创建一系列的task,例如音频、协议栈、串口等。 其中有一个task,用来加载Lua虚拟机,解析运行用户编写的Lua脚本,这个task,我们称之为Lua virtual task(另外在Lua脚本中,利用Lua的协程特性封装了一个sys.taskInit接口,借用了task的概念,实际上并不是真正的task)。脚本中的所有应用,都运行在Lua virtual machine task中,属于单task应用。 ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201117143155246_Luat%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E6%9E%B6%E6%9E%84.png) ### 二、真假task、内外消息队列 **一个真task** * core中的Lua Virtual machine * FreeRTOS中的任务调度器抢占式调度:FreeRTOS有一个定期的时钟节拍(通常是MS级),每个节拍中断释放时,抢占当前优先级低的任务的CPU,让优先级最高的就绪任务执行 * “外部”消息队列:core中各task间数据通信的一种手段 **一种假task(协程)** * script中的Lua语言的协程:sys.taskInit * 由Lua虚拟机非抢占式调度:当一个协程正在运行时,不能在外部终止他; * “内部”消息队列:在Lua脚本中合宙自定义的一套内部消息驱动机制 ### 三、应用脚本运行流程 如下图所示,脚本运行流程是,底层core通过启动Lua task运行Lua虚拟机,Lua虚拟机会找到对应的mian.lua逐行嵌套开始解析执行,mian.lua最末尾一行代码为sys.run()来处理内部或外部的消息。 ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201117143936875_Lua%E8%84%9A%E6%9C%AC%E5%BA%94%E7%94%A8%E8%BF%90%E8%A1%8C%E6%A1%86%E6%9E%B6.png) ### 四、内部消息处理 lib内部消息详细说明:[LuatOS-Air script lib内部消息](https://doc.openluat.com/wiki/21?wiki_page_id=2302) ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201117144057524_Lua%E7%89%88%E6%9C%AC%E5%86%85%E9%83%A8%E6%B6%88%E6%81%AF%E5%A4%84%E7%90%86.png) ### 五、外部消息处理 外部消息通过读取外部消息队列来处理,分为2大类来处理,定时器消息和其他消息(音频消息、充电管理消息、按键消息等) 外部消息详细说明:[LuatOS-Air core外部消息](https://doc.openluat.com/wiki/21?wiki_page_id=2301) ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201117152135845_Lua%E7%89%88%E6%9C%AC%E5%AE%9A%E6%97%B6%E5%99%A8%E6%B6%88%E6%81%AF%E5%A4%84%E7%90%86.png) ![](https://cdn.openluat-luatcommunity.openluat.com/images/20201117144148894_Lua%E7%89%88%E6%9C%AC%E9%9F%B3%E9%A2%91%E6%92%AD%E6%94%BE%E6%B6%88%E6%81%AF%E5%A4%84%E7%90%86.png)