概述
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
设计目的
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
移植准备
开发板
Lua源码
先到官网下载lua源代码,http://www.lua.org/ftp/lua-5.4.3或http://www.lua.org/ftp/lua-5.3.5
目前移植代码为5.4.3版本源码,网上比较多的移植资料为5.3.5源码,思路基本一样 。 源码主要在Linux系统,后缀为.tar.gz,基本windows压缩软件rar、zip等都可以解压。
下载好源码之后,将源码解压。如下图所示文件,找到src文件夹。
将src文件夹复制到需要移植的CH32V工程中,添加文件夹管理lua源代码,比如./lua/src。
源码移植
lua一般都会使用串口获取脚本指令,为了减少移植工作,这里基于官方例程中的串口例程进行移植。USART_Printf例程,将该例程复制并得命名,如Lua_CH32V103。也可选择其他例程。
进入Lua_CH32V103文件夹,将之前下载好的Lua源码,复制到该文件夹下,并重命名。
双击USART_Printf.wvproj文件,打开工程。此时Lua文件夹为MounRiver Studio自动加载到工程中。
需要将lua.c和luac.c移出工程。在源码目录中找到相应文件,选中文件,鼠标右键点击【参与/排出编译】。
设置头文件路径包含。
在main.c中添加lua相关头文件。
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
添加lua与单片机硬件支持。
static int lua_led_on(lua_State *L)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
return 1;
}
static int lua_led_off(lua_State *L)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
return 1;
}
static int lua_delay(lua_State *L)
{
uint16_t ms;
ms = (uint16_t)lua_tointeger(L,1);
Delay_Ms(ms);
return 1;
}
static const struct luaL_Reg my_lib_bsp[]=
{
{"delay",lua_delay},
{"led_on",lua_led_on},
{"led_off",lua_led_off},
{NULL,NULL}
};
添加一段点灯脚本。
const char LUA_SCRIPT_GLOBAL[]="\
off = 500 \
on = 500 \
while 1 do \
led_on() \
delay(off)\
led_off() \
delay(on) \
end";
添加Lua运行环境。
static lua_State *luaL;
void lua_run(void)
{
luaL = luaL_newstate();
luaopen_base(luaL);
luaL_setfuncs(luaL,my_lib_bsp,0);
luaL_dostring(luaL,LUA_SCRIPT_GLOBAL);
while(1);
}
添加int mian(void)。
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
GPIO_Configure();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
printf("This is lua example\r\n");
lua_run();
while(1)
{
}
}
比较遗憾,由于CH32V10R8T6,Flash只有64K、RAM为20K,移植的Lua源码需要大于80K Flash空间。因此在CH32V103R8T6上并示能编译通过,但在STM32F407VGT6上已经验证Lua移植代码。