Lua语言
Categories:
少于1分钟
现代的MCU已经有足够的性能运行解释型语言。XWOS集成了Lua语言 —— 一种轻量小巧的脚本语言。 Lua语言在XWOS中的移植被称为 XWLUA , XWLUA 有以下特性:
- 交互式解释器:一个独立的线程,用户通过串口终端,可在线运行Lua语言的函数,也可运行文件系统中的脚本;
- 多线程:Lua语言并不支持多线程,XWLUA扩展了Lua语言,实现了多线程的功能;
- 锁机制:支持互斥锁、自旋锁、顺序锁;
- 同步机制:支持信号量、条件量、事件标志、信号选择器、线程栅栏;
- 驱动库:已经完成部分驱动的封装。
- GPIO
- I2C
- SPI
- UART
运行Lua虚拟机需要有足够的内存和浮点运算单元,因此只能在资源比较丰富的MCU上开启Lua语言, XWOS自带的参考工程中,以下工程开启了Lua语言:
- EmbedFireStm32H743XWOS:野火STM32H743-Pro开发板
- AtkApolloH743XWOS:正点原子阿波罗STM32H743开发板
- FK429M1XWOS:反客STM32F429-M1开发板
- WeActMiniStm32H750XWOS:微行电子MiniStm32H750开发板
工程结构
- 工程路径:
xwem/vm/lua
- 目录结构
src
:lua的官方源码xwlua
:xwlua的实现port.h, port.c, prefix.h, readline.c
:Lua语言在XWOS上的移植代码lua.c
:以XWOS线程方式运行的交互式解释器(REPL)xwvm
:虚拟机库:虚拟机之间的数据交换xwos
:XWOS内核的binding库:包括线程、信号量、条件量、事件标志、信号选择器、线程栅栏、互斥锁、自旋锁、顺序锁、电源管理xwlib
:XWOS基本C函数的binding库xwds
:玄武设备栈的binding库xwxt
:多线程共享数据的全局导出表mif.h, mif.c
:玄武模块的启动接口,交互式解释器(REPL)线程在此处启动xwmo.mk
:玄武模块的编译规则
XWLUA的扩展
多线程
原生的Lua语言不支持多线程(Lua中的类型 thread
并不是真正的线程,而是协程。),脚本中的全局变量只能由执行脚本的线程自身访问。
XWLUA在C语言层面开发了多线程的功能,每个线程都拥有一个 独立的Lua虚拟机 。
全局导出表
为了实现多线程共享数据,XWLUA中实现了一个 全局导出表(xwxt) ,全局导出表中的数据对所有线程可见,并且是线程安全的。 全局导出表也是Lua中的一个独立的虚拟机。
新的Metamethod:__copy
元方法 __copy()
用于将用户数据从一个虚拟机(全局导出表、线程) 深拷贝 到另一个虚拟机(线程、全局导出表)中。
只有 userdata 可以定义 __copy()
元方法。
元方法 __copy()
有两个参数,第一个参数是 数据 ,第二参数是 目的虚拟机 ,无返回值。
元方法 __copy()
运行在 保护模式 ,可以 抛出错误 。
实现元方法 __copy()
时,若拷贝失败,应该在 目的虚拟机 中压入一个 nil 。
XWLUA的对象都提供了元方法 __copy()
。
对象强指针
XWLUA使用 对象强指针 管理XWOS内核中的对象(线程、信号量、条件量、事件标志、信号选择器、线程栅栏、互斥锁、自旋锁、顺序锁)。 对象强指针 是一种 userdata 。 对象强指针 就是对XWOS中的 对象描述符 的封装。 再借助于Lua虚拟机的GC机制,可实现对象的生命周期自动管理:
- Lua虚拟机每引用一个 对象强指针 ,都会增加相关联对象的引用计数;
- Lua虚拟机每 “GC” 一个 对象强指针 ,都会减少相关联对象的引用计数;
- 当相关联对象的引用计数为 0 时,就会执行C语言层面对象的
GC
函数 。
对象强指针 的概念源于Lua语言的 强引用 。