RISC-V MCU中文社区

【分享】 GD32VF103开发实践之Lua解释器移植

发表于 GD32VF103 MCU 2021-03-24 16:35:13
0
3007
13

本文基于RISCV内核的MCU-GD32VF103在SEGGER Embedded Studio 5.40a / JLink V10开发环境下进行进行Lua解释器进行移植记录。一开始想弄microPython,后来受Flash空间限制转向NodeMCU开发的Lua语言。


1 Lua源文件下载与调整


1.1 源文件下载



在之前工程的基础之上,将Lua源码加入到工程中,并将lua.c luac.c剔除编译。


 1.2 文件调整

在Lua初始化过程中会在linit.c文件中的loadedlibs导入功能库,这里可以把一些不用的功能注释掉。


 在luaconf.h文件中包含了很多Lua宏定义和一些参数的默认配置,这里现将 #define LUA_32BITS打开(可以降低点代码空间占用)。



2 工程配置

2.1 修改堆栈大小

在连接脚本中修改:nuclei_sdk\SoC\gd32vf103\Board\gd32vf103v_rtt\Source\GCC\gcc_gd32vf103_flashxip.ld


2.2 编译选项配置

编译选项中加入Os优化缩减代码大小(不加优化的话差不多125k,已经不能调试了QAQ)

COMMON_FLAGS= -Os -g -fno-common -DDOWNLOAD_MODE=DOWNLOAD_MODE_FLASHXIP

2.3 Link选项配置:

Lua中用到了许多数学函数库,在Linker->Additional Linker Options中引入math库。





3 编写用户函数库


static int lua_led_init(lua_State *L) {
  int num;                                                                                                                                                                          
  num = lua_tointeger(L, 1);
  gd_led_init(num);
  printf("gd_led_init  %d\n", num);
  return 1;
}

static int lua_led_on(lua_State *L) {
  int num;
  num = lua_tointeger(L, 1);

  gd_led_on(num);
  printf("gd_led_on  %d\n", num);
  return 1;
}
static int lua_led_off(lua_State *L) {
  int num;
  num = lua_tointeger(L, 1);

  gd_led_off(num);
  printf("gd_led_off  %d\n", num);
  return 1;
}

static int lua_delay(lua_State *L) {
  int num;
  num = lua_tointeger(L, 1);
  delay_1ms(num);

  return 1;
}

.定义一个luaL_Reg结构数组


static const struct luaL_Reg mylib[] =
    {
        {"led_on", lua_led_on},
        {"led_off", lua_led_off},
        {"delay", lua_delay},
        {"led_init", lua_led_init},
        {NULL, NULL}};



4 测试运行


编写测试脚本


const char LUA_SCRIPT_GLOBAL[] = "  \
off = 1000     \
on = 1000       \
led_init(1)        \
led_init(2)        \
while 1 do \
 led_on(1) \
 delay(off)    \
 led_off(1)        \
 delay(on)      \
end";


Main


int main(void) {

  lua_State *L;

  L = luaL_newstate();
  lua_led_off(L);
  luaopen_base(L);
  luaL_setfuncs(L, mylib, 0);
  luaL_dostring(L, LUA_SCRIPT_GLOBAL); 
  
  return 0;
}

测试运行小灯间隔1s亮灭同时终端打印输出。


链接:

喜欢13
用户评论
moo

moo 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板