继续上一章
前面只能指定函数名实现函数传递,我的目的是随时注册线程,不需要要指定函数名。
所以我希望C能保存lua传递进来的函数,在指定的地方调用该函数。
参考博客:lua注册表和引用系统,LUA_REGISTRYINDEX、luaL_ref、luaL_unref的用途
便确定两个函数,
luaL_ref:存放函数到注册表中并返回引用
lua_rawgeti:从注册表中读取该函数并调用
lua注册函数程序及主线程程序
local a = 0
local function callback(t)
if t % 100 == 0 then
a = a + 1
print("callback function > " .. a)
end
end
led.irq(callback)
local b = 0
while true do
os.sleep(100)
b = b + 1
print("while > " .. b)
end
C底层驱动实现程序
int fun_ref=-1;
//注册函数入口
static int RegIrq(lua_State *L)
{
printf("lua_gettop:%d\r\n",lua_gettop(L));
if(lua_isfunction(L,1))
{
fun_ref = luaL_ref(L,LUA_REGISTRYINDEX);//注册函数
}
return 0;
}
//定时器中断调用函数 周期1ms
void tick_cllback()
{
if(fun_ref!=-1)//检测到注册后自动调用
{
lua_rawgeti(_L,LUA_REGISTRYINDEX,fun_ref);
lua_pushinteger(_L,clock());
lua_pcall(_L,1,0,0);
}
}
const luaL_Reg ledLib[]=
{
{"led_on",led_on},
{"led_off",led_off},
{"irq",RegIrq},
{NULL,NULL}
};
执行结果如下:
为了方便文件管理,用C#写了一个简单的上位机,能够创建删除文件和目录。并能下载查看文件以及执行lua程序的功能。
程序正常执行,没问题。下一步和FreeRTOS合并。
一切顺利的话,今晚就可以见成效了。