LuatOS-HMI 软件系统介绍
# 代码架构

如上图所示,代码主要包含2部分:底层core+上层脚本script
详细说明点击右侧链接查看 [SDK软件组成说明](https://hmi.wiki.luatos.com/doc/65042949/e6zPC3k9/sVFeYdMx)
# 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)
## LuatOS-Air应用脚本运行框架
### 一、单task应用

core在启动过程中,会创建一系列的task,例如音频、协议栈、串口等
其中有一个task,用来加载Lua虚拟机,解析运行用户编写的Lua脚本,这个task,我们称之为Lua virtual task(另外在Lua脚本中,利用Lua的协程特性封装了一个sys.taskInit接口,借用了task的概念,实际上并不是真正的task)
脚本中的所有应用,都运行在Lua virtual machine task中,属于单task应用
### 二、真假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()来处理内部或外部的消息。
### 四、内部消息处理

lib内部消息详细说明:[LuatOS-Air script lib内部消息](https://doc.openluat.com/wiki/21?wiki_page_id=2302)
### 五、外部消息处理


外部消息通过读取外部消息队列来处理,分为2大类来处理,定时器消息和其他消息(音频消息、充电管理消息、按键消息等)
外部消息详细说明:[LuatOS-Air core外部消息](https://doc.openluat.com/wiki/21?wiki_page_id=2301)