risc-v中文社区

 找回密码
 立即注册
查看: 735|回复: 0

Lua解释器移植记录:GD32VF103(RISC-V内核)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-6-17 10:46:18 | 显示全部楼层 |阅读模式
本文基于RISCV内核的MCU-GD32VF103在SEGGER Embedded Studio 5.40a / JLink V10开发环境下进行进行Lua解释器进行移植。



目录

1 Lua源文件下载与调整

1.1 源文件下载

1.2 文件调整

2 工程配置

2.1 修改堆栈大小

2.2 编译选项配置

2.3 Link选项配置:

3 编写用户函数库

4 测试运行

链接:

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亮灭同时终端打印输出。


链接:
Lua源文件下载
LUA移植至STM32全记录
STM32嵌入LUA开发
————————————————
版权声明:本文为CSDN博主「maskmoo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33098417/article/details/115256671

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-4 19:05 , Processed in 0.014588 second(s), 18 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表