嵌入式lua之多线程操作移植 二 中断测试

14 篇文章 10 订阅
5 篇文章 1 订阅

继续上一章

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

所以我希望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合并。

一切顺利的话,今晚就可以见成效了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值