我有一个运行Lua的ARM CPU(SAM3S)。我有几个用Lua编写的静态库。现在我用完了RAM。可以将Lua操作码从RAM移动并运行到FLASH吗? 谢谢 AR
答案 0 :(得分:0)
我前段时间写了一个按需编译包装器。它非常简单易用,可以适应您的用例。
lib = setmetatable({}, {
__mode = "v", -- important (!) allows the Lua GC to collect unused entries
__index = function(self, k)
-- put code here to load from FLASH
-- in [eLua][1] this may look like:
local chunk = loadfile("/rom/"..k..".lua")
-- put code into the table
self[k] = chunk;
return chunk;
end
})
像这样使用:
x, y, z = lib.foo(a, b, c)
通过一些metatable魔术,你也可以创建一个层次结构,也许可以将函数收集到" modules"通过模块加载所有叶子。
由于您的环境受内存限制,我建议采用一种约定优于配置方法,因为在加载时注册所有可用模块肯定会影响内存占用。这是一个建议:
local PATH = "/rom/src/";
local mt; mt = {
__mode = "v",
__index = function(self, k)
local fn = PATH .. self.__PATH .. k .. ".lua"
local chunk, errmsg = loadfile(fn) -- Warning Can cause security issues
if not chunk then
if io.open(fn) then
chunk = setmetatable({}, mt)
chunk.__PATH = self.__PATH .. k .. "/"
else
error(errmsg)
end
end
self[k] = chunk;
return chunk;
end
}
setmetatable(_G, mt)
像这样使用:
local x, y, z = a.b.c(u, v, w) -- looks for "/rom/src/a/b/c.lua
在两种变体中,当内存变紧时,Lua GC应自动尝试收集未使用的代码(引用计数为= 0
的函数)。
local
,以便Lua尽快清理_G
)PS:免责声明此答案中的所有代码实际上都是从内存中编写的,因此根本没有进行测试。
参考: