|
本文基于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
|