lua - 从 C 回调闭包时 GC 中的 MemFault

标签 lua embedded closures keil

我使用 Keil、MDK-ARM Pro 4.71 来实现 Cortex-M3 目标 (STM32F107)。

我已经编译了 Lua 解释器和一个连接芯片定时器的 Lua“定时器”模块。我想在计时器到时调用 lua 函数。

这是一个示例使用:

t = timer.open()
t.event = function() print("Bing !") end
t:start()

到这里为止,一切正常:-)!我看到“Bing!”每次计时器到期时都会打印消息。

现在如果我使用闭包:

t = timer.open()
i = 0
t.event = function() i = i + 1; print(i); end
t:start()

在进行一定数量的计时器更新后,我在 GC 中的内存访问出现了错误。由于它是一个内存很少的嵌入式上下文,因此如果存在泄漏,我可能会很快耗尽内存。

这是“t.event” setter (ELIB_TIMER 是代表我的计时器的 C 结构):

static int ElibTimerSetEvent(lua_State* L)
{
   ELIB_TIMER* pTimer_X = ElibCheckTimer(L, 1, TRUE);

   if (pTimer_X->LuaFuncKey_i != LUA_REFNIL)
   {
      luaL_unref(L, LUA_REGISTRYINDEX, pTimer_X->LuaFuncKey_i);
      pTimer_X->LuaFuncKey_i = LUA_REFNIL;
   }

   if (!lua_isnil(L, 2))
   {
      pTimer_X->LuaFuncKey_i = luaL_ref(L, LUA_REGISTRYINDEX);
   }

   return 0;
}

这是 native 回调实现:

static void ElibTimerEventHandler(SYSEVT_HANDLE Event_H)
{
   ELIB_TIMER* pTimer_X = (ELIB_TIMER*)SWLIB_SYSEVT_GetSideData(Event_H);
   lua_State* L = pTimer_X->L;
   int i = lua_gettop(L);
   if (pTimer_X->LuaFuncKey_i != LUA_REFNIL)
   {
      lua_rawgeti(L, LUA_REGISTRYINDEX, pTimer_X->LuaFuncKey_i);
      lua_call(L, 0, 0);
      lua_settop(L, i);
   }
}

这是外部同步的,因此这不是同步问题。

我做错了什么吗?

编辑

这是调用堆栈(用 lua_pcall 而不是 lua_call,但它是相同的)。第一行是我的硬故障处理程序。

Lua call stack

最佳答案

我发现问题了!我用完了堆栈( native 堆栈,不是 Lua)空间:p。 我猜这个特定的脚本导致了特别长的调用堆栈。增加为 native 堆栈分配的内存后,问题就消失了。相反,如果我减少它,我什至无法初始化解释器。

非常感谢那些试图在这里提供帮助的人。

关于lua - 从 C 回调闭包时 GC 中的 MemFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314168/

相关文章:

lua - 如何在 love2d 中创建保存游戏功能?

C数组地址

embedded - AVR 模拟比较器 + 内部上拉?

javascript - lua中同时定义和调用函数

javascript - 如何从事件处理程序中返回 indexedDB 查询结果?

c - 使用 tolua++ 绑定(bind)结构和 ctor/dtor

types - Lua 内部是否有可访问的默认类型的表或枚举?

Lua 5.1 相当于 lua_setgcthreshold

c - Cortex M0 上无需禁用中断的同步机制

for-loop - 初始化 Dart 中的列表列表