Lua指令在FLASH存储器中

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

点赞
用户1244588
用户1244588

我曾经写过一个按需编译的包装器。这很简单并且可以根据您的用例进行调整。

lib = setmetatable({}, {
    __mode = "v", -- 重要(!)允许Lua GC收集未使用的条目
    __index = function(self, k)
        --在这里放置从FLASH加载的代码
        --在[eLua][1]中可能类似于:
        local chunk = loadfile("/rom/"..k..".lua")
        --将代码放入表中
        self[k] = chunk;
        return chunk;
    end
})

使用方式如下:

x, y, z = lib.foo(a, b, c)

通过一些元表魔法,您还可以创建一个层次结构,并通过加载所有叶子节点来收集函数到“模块”中。

由于您的环境非常受存储器限制,我建议为此采用惯例优于配置的方法,因为在加载时注册所有可用模块肯定会影响内存占用。这里是一些建议:

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) -- 警告:可能会引起安全问题
        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) --查找“/rom/src/a/b/c.lua”。

在两种变体中,当内存变得紧张时,Lua GC应自动尝试收集未使用的代码(引用计数为0的函数)。

#更多提示

  • 将代码存储为字节码。它加载得更快,(通常)在flash上占用的空间更少,从而使其加载速度更快,但是通常不兼容不同版本的Lua
  • 尽可能将变量保留为本地变量,以便Lua可以尽快清理
  • 避免递归
  • 避免将对函数,长字符串和表的引用存储在非本地变量(例如 _G)中
  • 避免表

附言:免责声明:此答案中的所有代码都是从记忆中编写的,因此根本未经过测试。

参考:

2014-04-28 15:57:03