Lua语言

XWLUA的说明

现代的MCU已经有足够的性能运行解释型语言。XWOS集成了Lua语言 —— 一种轻量小巧的脚本语言。 Lua语言在XWOS中的移植被称为 XWLUAXWLUA 有以下特性:

  • 交互式解释器:一个独立的线程,用户通过串口终端,可在线运行Lua语言的函数,也可运行文件系统中的脚本;
  • 多线程:Lua语言并不支持多线程,XWLUA扩展了Lua语言,实现了多线程的功能;
  • 锁机制:支持互斥锁、自旋锁、顺序锁;
  • 同步机制:支持信号量、条件量、事件标志、信号选择器、线程栅栏;
  • 驱动库:已经完成部分驱动的封装。
    • GPIO
    • I2C
    • SPI
    • UART

XWLUA交互式解释器

运行Lua虚拟机需要有足够的内存和浮点运算单元,因此只能在资源比较丰富的MCU上开启Lua语言, XWOS自带的参考工程中,以下工程开启了Lua语言:

工程结构

  • 工程路径: 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语言的 强引用

LuaAPI参考手册