rt-thread钩子函数设置

前言

rtthread有很多使用钩子函数的地方,比如在内核对象创建的过程中,当对象创建、删除等会触发相应的钩子函数。

核心思想

rtthread充分利用了面向对象的思想,这也是我想研究一下内核源码的原因。但是本文主要针对与钩子函数相关的部分进行分析。
我们知道c++或其他面向对象语言中,会利用类包装属性和相关的方法。但是对于内核,很多还是基于c语言实现。c与面向对象的其它语言对比如下图:
在这里插入图片描述
那么如何利用面向对象来写c呢?

内核对象文件object.c

在文件object.c中有如下钩子函数声明:

#ifdef RT_USING_HOOK
static void (*rt_object_attach_hook)(struct rt_object *object);
static void (*rt_object_detach_hook)(struct rt_object *object);

同时还提供了

void rt_object_attach_sethook(void (*hook)(struct rt_object *object))
{
    rt_object_attach_hook = hook;
}

void rt_object_detach_sethook(void (*hook)(struct rt_object *object))
{
    rt_object_detach_hook = hook;
}

提示:对于RT_USING_HOOK宏定义在rtconfig.h中打开
有意思的是,内核对象文件中只给出函数的声明,而且是静态函数。同时对象文件提供了设置钩子函数的全局函数。所以,当用户想使用某个钩子函数的时候,只需要调用set_xxx函数就可以将自己需要设置钩子函数传入到对象文件中。
如果结合上图来看的话,面向对象的效果更明显。

进一步思考

void (*rt_object_trytake_hook)(struct rt_object *object);
void (*rt_object_take_hook)(struct rt_object *object);
void (*rt_object_put_hook)(struct rt_object *object);

rtthread对象文件中还提供上面的三个全局函数声明(注意非静态),这样其他模块就可以可能通过直接赋值的方式改变,肯定也有特别的想法。该下班了,下次再继续写!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值