工作上需要移植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了。因为问题这里花了很长时间,百度的都回答模糊。所有才花较长篇幅说明白。