一、前言
本篇文章将Lua在MDK环境移植到ME32F103开发板,记录移植过程并通过Lua点亮开发板上的LED灯作为演示。
二、Lua简介
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
特点:
- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
三、移植准备
3.1 Lua源码下载
四、移植过程
在KEIL工程中添加Lua源码
排除“lua.c”、“luac.c”这2个文件,两个是一个Lua Shell,和平台相关,单片机用不上。
添加头文件路径:
添加头文件
添加底层函数处理接口:
typedef int FILEHANDLE;
#pragma import(__use_no_semihosting_swi)
//#pragma import(_main_redirection)
const char __stdin_name[150];
const char __stdout_name[150];
const char __stderr_name[150];
FILEHANDLE _sys_open(const char *name, int openmode)
{
return 0;
}
int _sys_close(FILEHANDLE fh)
{
return 0;
}
int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
{
return 0;
}
int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)
{
return 0;
}
int _sys_istty(FILEHANDLE fh)
{
return 0;
}
int _sys_seek(FILEHANDLE fh, long pos)
{
return 0;
}
int _sys_ensure(FILEHANDLE fh)
{
return 0;
}
long _sys_flen(FILEHANDLE fh)
{
return 0;
}
void _sys_exit(int status)
{
}
int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
{
return 0;
}
void _ttywrch(int ch)
{
}
int remove(const char *filename)
{
return 0;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
time_t time(time_t * time)
{
return 0;
}
static int lua_led_on(lua_State *L)
{
GPIO_SetPins(PC, IO_BIT_PIN4);
return 1;
}
static int lua_led_off(lua_State *L)
{
GPIO_ResetPins(PC, IO_BIT_PIN4);
return 1;
}
static int lua_delay(lua_State *L)
{
uint16_t ms;
ms = (uint16_t)lua_tointeger(L,1);
SYS_Delay(214748);
return 1;
}
static const struct luaL_Reg lib[]=
{
{"delay",lua_delay},
{"led_on",lua_led_on},
{"led_off",lua_led_off},
{NULL,NULL}
};
const char LUA_GLOBAL[]="\
off = 500 \
on = 500 \
while 1 do \
led_on() \
delay(off)\
led_off() \
delay(on) \
end";
static lua_State *luaL;
void lua_run(void)
{
luaL = luaL_newstate();
luaopen_base(luaL);
luaL_setfuncs(luaL,lib,0);
luaL_dostring(luaL,LUA_GLOBAL);
}
复制代码修改启动文件:
int main(void)
{
PC4_INIT(PC4_GPIO);
PC_INIT_AS_OUTPUT(IO_PIN4);
PC_INIT_AS_OUTPUT(IO_PIN13);
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"ME32 OLED");
lua_run();
}
复制代码编译下载验证,板子正常运行起来了,如下所示: