<div style="border-top: none; border-right: none; border-left: none; border-image: initial; border-bottom: 1pt solid rgb(238, 238, 238); padding: 0cm 0cm 4pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;">
core在启动过程中,会创建一系列的task,例如音频、协议栈、串口等
其中有一个task,用来加载Lua虚拟机,解析运行用户编写的Lua脚本,这个task,我们称之为Lua主task(为什么称之为主task呢?因为在Lua脚本中,利用Lua的协程特性封装了一个sys.taskInit接口,借用了task的概念,实际上并不是真正的task;为了和脚本中封装的这种task(协程)区分,所以称core中的task为Lua主task)
脚本中的所有应用,都运行在Lua主task中,属于单task应用
1.2、外部消息队列
core创建Lua主task时,会为这个task分配一个消息队列,这个队列称之为外部消息队列,core中的其他task向Lua主task发送的消息,都存储在这个外部消息队列中
1.3、内部消息队列
脚本运行时,内部各应用之间,可能需要相互传递消息,这个消息就被存储在内部消息队列中
二、应用运行框架
2.1、运行框架总图
2.2、内部消息队列中的消息处理流
2.3、外部消息队列中的定时器消息处理流
2.4、外部消息队列中的音频播放消息处理流
2.5、外部消息队列中的串口收发消息处理流
2.6、外部消息队列中的GPIO中断消息处理流
2.7、外部消息队列中的SOCKET消息处理流(4G模块)
三、常见问题
3.1、为什么Lua版本运行某些功能会有延时
脚本中的应用属于单task应用,都运行在一个Lua主task中,由2.1章节可知,Lua主task一直在循环处理内部消息队列和外部消息队列中的消息,消息是先进先出先处理
即使有新消息到达,插入到内部消息队列或者外部消息队列中,必须等前面所有的消息处理结束,才能处理新消息
例如:首先产生了一个定时器消息,定时器消息的处理动作(新建一个文件,写500K数据)比较耗时,在写文件的过程中,core中的串口task产生了一个串口接收数据通知消息,虽然可以插入到Lua主task的外部消息队列中,但是由于Lua主task还在执行写文件的动作,所以串口消息只能等待,问题就表现为“我明明已经向模块串口发送了数据,为什么脚本在3秒后才开始处理串口数据呢?”