谷动谷力

 找回密码
 立即注册
查看: 660|回复: 0
打印 上一主题 下一主题
收起左侧

单片机中移植lua解释器

[复制链接]
跳转到指定楼层
楼主
发表于 2023-8-18 16:13:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 文件下部分内容

  • 将 os_exit(lua_State * L)函数中 if(L) exit(status)注释,并添加 status=status 语句。

2.添加 time(time_t *time)和 system(const char * string)
更改以上内容是因为使用了 Use MicroLIB 模式。
  1. static int os_exit (lua_State *L) {
  2.   int status;
  3.   if (lua_isboolean(L, 1))
  4.     status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE);
  5.   else
  6.     status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS);
  7.   if (lua_toboolean(L, 2))
  8.     lua_close(L);
  9.   //if (L) exit(status);  /* 'if' to avoid warnings for unreachable 'return' */
  10.   status=status;
  11.   return 0;
  12. }

  13. time_t time(time_t *time)
  14. {
  15.     return 0;
  16. }

  17. int system(const char * string)
  18. {
  19.     return 0;
  20. }
复制代码


三、Lua使用测试

1. 编写测试代码

  1. #include "lua.h"
  2. #include "lualib.h"
  3. #include "lauxlib.h"

  4. static int lua_led_on(lua_State *L)
  5. {
  6.     LED1( ON );      
  7.     return 1;
  8. }
  9. static const struct luaL_Reg mylib[]=
  10. {
  11.      {"led_on",lua_led_on},
  12.      {NULL,NULL}
  13. };

  14. const char LUA_SCRIPT_GLOBAL_ON[] =" \
  15.     while 1 do\
  16.     led_on() \
  17.     end";
  18.    
  19. int main(void)
  20. {

  21.     SystemClock_Config();

  22.     LED_GPIO_Config();
  23.    
  24.     LED1( ON );       // 亮
  25.     HAL_Delay(1000);
  26.     LED1( OFF );      // 灭
  27.     HAL_Delay(1000);
  28.    
  29.     lua_State *L;
  30.     L = luaL_newstate(); //建立Lua运行环境
  31.     luaopen_base(L);//注册基础函数(此函数要屏蔽luaL_setfuncs(L, base_funcs, 0);)
  32.     luaL_setfuncs(L, mylib, 0);//注册自定义函数
  33.     luaL_dostring(L, LUA_SCRIPT_GLOBAL_ON);
  34.    
  35.     while(1)
  36.     {   
  37.     }   
  38. }
复制代码

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

+10
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-4-30 00:29 , Processed in 0.102408 second(s), 42 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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