我尝试将Lua集成到使用Cortex-M4上的GCC的嵌入式项目中。我能够加载并运行Lua脚本,从C调用Lua函数,从Lua调用C函数。但是当luaL_dostring()中作为参数传递的给定脚本包含任何Lua语法错误时,C程序崩溃(HardFault_Handler陷阱上升)。
此处由于Lua中的语法错误导致崩溃的相关C代码:
//create Lua VM...
luaVm = lua_newstate(luaAlloc, NULL);
//load libraries...
luaopen_base(luaVm);
luaopen_math(luaVm);
luaopen_table(luaVm);
luaopen_string(luaVm);
//launch script...
luaL_dostring(luaVm, "function onTick()\n"
" locaal x = 7\n" //syntax error
"end\n"
"\n" );
使用正确的Lua语法执行相同操作时,它可以正常工作:
luaL_dostring(luaVm, "function onTick()\n"
" local x = 7\n"
"end\n"
"\n" );
当调试并单步执行luaL_dostring()时,我可以按照Lua解析行进行换行,当到达带有语法错误的行时,C程序崩溃。
任何人都可以帮忙吗?感谢。
以下列方式在Lua源代码中禁用了setjmp/longjmp
:
//#define LUAI_THROW(L,c) longjmp((c)->b, 1) //TODO oli4 orig
//#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } //TODO oli4 orig
#define LUAI_THROW(L,c) while(1) //TODO oli4 special
#define LUAI_TRY(L,c,a) { a } //TODO oli4 special
...所以没有再使用setjmp / longjmp,但我仍然遇到了崩溃: - (
必须有另一个原因???
答案 0 :(得分:1)
发现问题:它是调用Lua语法错误的sprintf函数。事实上,在我的平台上sprintf似乎不支持浮点演示。所以我通过以下方式更改了luaconf.h,将表示限制为整数格式。
//#define LUA_NUMBER_FMT "%.14g"
#define LUA_NUMBER_FMT "%d"
答案 1 :(得分:0)
必须有另一个原因???
是的:你不能在这里使用Lua。
Lua的错误处理系统建立在setjmp/longjump
的框架之上。您不能只让LUAI_THROW
和LUAI_TRY
。这意味着lua_error
并且所有内部错误处理都停止工作。语法错误是Lua内部错误处理的一部分。
如果您的C编译器没有为C标准库提供适当的支持,那么Lua就不会在该环境中起作用。你可以试试LuaJIT,但我怀疑那会更好。