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