我在微控制器项目中使用Lua。 我的软件使用RTOS,并从其他任务中使用appart,它还调用用户提供的Lua脚本。
该脚本必须具有两个功能:init
函数和run
函数。我的应用程序在初始化期间调用init
函数,然后定期调用run
函数。
我加载脚本的方式与dofile()
非常相似。
需要返回run
函数。这样,基础线程就可以为其他优先级较低的线程提供处理器。
所以问题是,在我有机会调用所需功能之前,如何保护系统免受用户提供“危险”脚本(即从未完成其初始执行的脚本)的伤害。 请参阅以下内容:
function init
--Do some stuff.
end
function run
--Do some other stuff.
end
while (true) do
--Do nasty stuff, without ever returning.
end
在上面的示例中,代码在脚本的初始加载期间被阻止,并且从不返回。我从来没有机会调用init
和run
函数。我如何发现这种情况,以及如何得到保护?
修改 忘了提。我正在使用Lua 5.2.2。
答案 0 :(得分:1)
设置行挂钩或计数挂钩,如果超过限制则中止。
答案 1 :(得分:0)
解决方案是将用户脚本的执行推迟到WD准备就绪为止。
我们假设这是用户脚本:
user_script.lua
function init()
--Do some stuff.
end
function run()
--Do some other stuff.
end
while (true) do
--Do nasty stuff, without ever returning.
end
您在主机应用程序中正在做什么(就像它是在Lua上编写的一样)
dofile("user_script.lua")
init_watchdog()
init()
run()
run()
您应在主机应用程序中做什么
local user_script_as_text = read_content_of_file("user_script.lua")
assert(loadstring(
[[
function init() -- this is your wrapper around user script
init = nil
do
]]..user_script_as_text..
[[
end
init() -- invoking "init" defined by user
end
]]
))()
init_watchdog()
init() -- invoking your wrapper
run()
run()
如果您需要在打开WD之前读取一些配置变量的值,则必须将这些配置变量作为易于解析的字符串提供,例如以下var1=42,var2=on,var3="Hi"
。这些配置变量不能放在Lua脚本中,因为Lua脚本可能会永远循环。
换句话说,您需要来自用户的两个文件: user_config_vars.json 和 user_script.lua