一、前言


本篇文章将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源码下载

官网地址:http://www.lua.org/ftp/

155917bf7dvty449v7jz72


四、移植过程

在KEIL工程中添加Lua源码

155917g1eaaqiiz1sbkquk

排除“lua.c”、“luac.c”这2个文件,两个是一个Lua Shell,和平台相关,单片机用不上。

添加头文件路径:

155917iog96o3z60pgor04

添加头文件

155917wnb22bxn6z5n52gy

添加底层函数处理接口:

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);
  •                
  • }
  • 复制代码

    修改启动文件:

    155917dtfu15f6cufl1n4k

    主函数:
    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();
  • }
  • 复制代码

    编译下载验证,板子正常运行起来了,如下所示:

    lua验证.gif