前言
该系列基于rtthread-nano的内核源码,来研究RTOS的底层逻辑,本文介绍RTT的内核对象,对于其他RTOS来说也可供参考,万变不离其宗,大家都是互相借鉴,实现不会差太多。
内核对象容器
首先要明确的一点是什么是内核对象,在RTT中,利用结构体之间的嵌套,实现了一种类似面向对象的设计。所以这里的内核对象,是指线程,信号量,互斥量,事件,邮箱,消息队列和定时器,内存池,设备驱动等等任何通过动态/静态创建出来的对象。
其次,需要知道的是,RTT是通过一个rt_object_container来管理这些所有的内核对象的。他是怎么做到的呢?我们来看一下(部分)代码就知道了(也可以直接看下面的总结)
//只展示部分代码
static struct rt_object_information rt_object_container[RT_Object_Info_Unknown] =
{
/* initialize object container - thread */
{RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread)},
#ifdef RT_USING_SEMAPHORE
/* initialize object container - semaphore */
{RT_Object_Class_Semaphore, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Semaphore), sizeof(struct rt_semaphore)},
#endif
#ifdef RT_USING_MUTEX
/* initialize object container - mutex */
{RT_Object_Class_Mutex, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Mutex), sizeof(struct rt_mutex)},
#endif
};
可以看到,本质上内核容器对象就是一个数组,里面的每个成员都是一个结构体如下所示
/**
* The information of the kernel object
*/
struct rt_object_information
{
enum rt_object_class_type type; /**< object class type */
rt_list_t object_list; /**< object list */
rt_size_t object_size; /**< object size */
};
rt_list_t又是一个双向链表,因此,rt_object_container其实就是一个rt_object_information结构体构成的数组,这个结构体里面又维护了
1.每种内核对象的类型
2.一个双向链表用于链接每个同类内核对象
3.该内核对象创建时需要的内存大小
程序运行过程中,每个创建的内核对象都会被放在这个内核对象容器中,最终形成如下结构
内核对象创建
不同的内核对象会应用不同的创建函数,例如对于动态创建来说
线程创建 ——> rt_thread_create
定时器创建 ——> rt_timer_create
但只要查看这两个创建函数的源码,都可以看到他们都调用了同一个rt_object_allo

最低0.47元/天 解锁文章
3628

被折叠的 条评论
为什么被折叠?



