Lua在FLASH内存中进行操作

时间:2014-04-23 06:17:13

标签: lua arm

我有一个运行Lua的ARM CPU(SAM3S)。我有几个用Lua编写的静态库。现在我用完了RAM。可以将Lua操作码从RAM移动并运行到FLASH吗? 谢谢 AR

1 个答案:

答案 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的函数)。

更多提示

  • 将代码存储为字节代码。它加载速度更快,并且(通常)闪存占用的空间更少,这使得它的加载速度更快(但通常在Lua版本之间不兼容)
  • 尽可能保持变量为local,以便Lua尽快清理
  • 避免递归
  • 避免在非局部变量中存储对函数,长字符串和表的引用(如_G
  • 避免使用表格

PS:免责声明此答案中的所有代码实际上都是从内存中编写的,因此根本没有进行测试。

参考: