继续上一章

前面只能指定函数名实现函数传递,我的目的是随时注册线程,不需要要指定函数名。

所以我希望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程序的功能。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐