LUA移植到嵌入式

工作上需要移植lua。lua是纯C写的脚本语言,嵌入到嵌入式中刚刚好,效率运行得最快。移植过程简单,为应用程序提供灵活的扩展和定制功能。

1.移植LUA。

在ITE平台上移植很简单,只需要把lua库下载下来,然后用去掉lua.c 和 luac.c 这两个文件是不包含的(它们包含PC上Lua解释器和编译器的main函数)。然后将所有文件添加到CMAKELIST.TXT

2.LUA初始化代码解析

1.虚拟机的创建以及打开库:

L = luaL_newstate();	//建立虚拟机
 if (L == NULL)
 {
  return;
 }
 luaL_openlibs(L);	//打开所有的库,例如要用到printf()

2.加载要运行的lua(自己编写的嵌入c脚本)

int bRet = luaL_loadfile(L, "A:\\main.lua");
if(bRet != LUA_OK)
 {
  const char *err = lua_tostring(L, -1); //加载失败,把错误信息压入栈顶
  return;
 }
 bRet = lua_pcall(L, 0, 0, 0);		//执行起来
 if (bRet)
 {
  printf("pcall error\n");
  return;
 }

以上就可以完成了简单的嵌入了

3.遇到的问题

在移植的过程中,出现了一个大问题,就是lua可以在电脑PC端运行,但是到板子上面跑的画,就出现lua编译有问题。查找好久才查出来,板子下调试很麻烦,浪费了很多时间。
接着将lua先读出来,然后通过字符串的形式运行,可以运行。所有才知道这里读取的问题。
代码如下:

size = GetFileData("A:/main.lua");
 if (size == 0)
 {
  return -1;
 }
 buf = lua_buf;
 int bRet = luaL_dostring(L, buf);

然后我就一步一步得调试,慢慢看是哪一步读取有问题。
最后找到在lauxlib.c下以下函数读取为空
static const char *getF (lua_State *L, void *ud, size_t *size)
在这个函数

if (fgets(lf->buff, sizeof(lf->buff), lf->f) == NULL)  //change by xu 20200116
    return NULL;

这里用到得fgets有问题,需要跟板子的文件操作相关函数匹配。改成了

*size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); 

用了板子原有的fread来代替fgets。之后数据就不会读取为空了。由于这里改动之后,其他的地方的fgets,以及fgetc都有改为fread。改好之后,重新编译内核,加载到板子,就可以运行lua了。因为问题这里花了很长时间,百度的都回答模糊。所有才花较长篇幅说明白。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值