本帖最后由 sunsili 于 2023-8-18 16:17 编辑
单片机中移植lua解释器
一、基本开发环境
开发环境基于野火STM32开发板。
前测试的 Lua 解释器版本为 5.4.2。 官网下载lua资源包,下载地址如下:
https://www.lua.org/ https://github.com/rjpcomputing/luaforwindows/releases lua: Lua 国内镜像 (gitee.com)
二、移植Lua解释器
1.下载的Lua解压,删除源文件中的的 lua.c 和 luac.c (如果有的话)文件。 2.新建stm32工程 3.工程添加Lua源码 将Lua源文件拷贝到工程 添加头文件 更改 loslib.c 文件下部分内容
2.添加 time(time_t *time)和 system(const char * string) 更改以上内容是因为使用了 Use MicroLIB 模式。 - static int os_exit (lua_State *L) {
- int status;
- if (lua_isboolean(L, 1))
- status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE);
- else
- status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS);
- if (lua_toboolean(L, 2))
- lua_close(L);
- //if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */
- status=status;
- return 0;
- }
- time_t time(time_t *time)
- {
- return 0;
- }
- int system(const char * string)
- {
- return 0;
- }
复制代码
三、Lua使用测试
1. 编写测试代码
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- static int lua_led_on(lua_State *L)
- {
- LED1( ON );
- return 1;
- }
- static const struct luaL_Reg mylib[]=
- {
- {"led_on",lua_led_on},
- {NULL,NULL}
- };
- const char LUA_SCRIPT_GLOBAL_ON[] =" \
- while 1 do\
- led_on() \
- end";
-
- int main(void)
- {
- SystemClock_Config();
- LED_GPIO_Config();
-
- LED1( ON ); // 亮
- HAL_Delay(1000);
- LED1( OFF ); // 灭
- HAL_Delay(1000);
-
- lua_State *L;
- L = luaL_newstate(); //建立Lua运行环境
- luaopen_base(L);//注册基础函数(此函数要屏蔽luaL_setfuncs(L, base_funcs, 0);)
- luaL_setfuncs(L, mylib, 0);//注册自定义函数
- luaL_dostring(L, LUA_SCRIPT_GLOBAL_ON);
-
- while(1)
- {
- }
- }
复制代码
2.下载,查看测试效果
实验现象,指示灯先亮后灭再常亮,符合预期。
欢迎关注个人公众号:嵌入式学习与实践
参考: https://www.gd32mcu.com/data/documents/userManual/AN019_CN_Rev1.0.pdf https://blog.csdn.net/weixin_38728721/article/details/104068015 https://blog.csdn.net/weixin_41558887/article/details/101385077 https://www.armbbs.cn/forum.php?mod=viewthread&tid=94757
|