rt-thread的内核对象管理系统分析(一)

2014-11-24 08:13:35 · 作者: · 浏览: 0
rt-thread采用内核对象管理 系统来访问和管理所有内核对象.首先来看看rt-thread的内核对象是如何定义的:
1 数据结构
1.1 对象控制块
在include/rtdef.h头文件中可以找到内核对象有结构定义:
[cpp]
/**
* Base structure of Kernel object
*/
struct rt_object
{
char name[RT_NAME_MAX];//名称
rt_uint8_t type;//内核对象类型
rt_uint8_t flag;//内核对象标志
#ifdef RT_USING_MODULE
void *module_id;//模块ID
#endif
rt_list_t list;//内核对象链表节点
};
typedef struct rt_object *rt_object_t;
这里需要注意地是,上述内核对象控制块包含了一rt_list_t类型的成员list,这个是一链表节点,便于将此内核对象加入到一链表中,其结构如下定义:
[cpp]
struct rt_list_node
{
struct rt_list_node *next; //指向下一节点
struct rt_list_node *prev; //指向前一节点
};
typedef struct rt_list_node rt_list_t;
另内核对象类型取值有如下类型:
[cpp]
/**
* The object type can be one of the follows with specific
* macros enabled:
* - Thread
* - Semaphore
* - Mutex
* - Event
* - MailBox
* - MessageQueue
* - MemHeap
* - MemPool
* - Device
* - Timer
* - Module
* - Unknown
* - Static
*/
enum rt_object_class_type
{
RT_Object_Class_Thread = 0, //线程
#ifdef RT_USING_SEMAPHORE
RT_Object_Class_Semaphore, //信号量
#endif
#ifdef RT_USING_MUTEX
RT_Object_Class_Mutex, //互斥锁
#endif
#ifdef RT_USING_EVENT
RT_Object_Class_Event, //事件
#endif
#ifdef RT_USING_MAILBOX
RT_Object_Class_MailBox, //邮箱
#endif
#ifdef RT_USING_MESSAGEQUEUE
RT_Object_Class_MessageQueue, //消息队列
#endif
#ifdef RT_USING_MEMHEAP
RT_Object_Class_MemHeap, //内存堆
#endif
#ifdef RT_USING_MEMPOOL
RT_Object_Class_MemPool, //内存池
#endif
#ifdef RT_USING_DEVICE
RT_Object_Class_Device, //设备驱动
#endif
RT_Object_Class_Timer, //时钟
#ifdef RT_USING_MODULE
RT_Object_Class_Module, //模块
#endif
RT_Object_Class_Unknown, //未知内核对象类型
RT_Object_Class_Static = 0x80 //rt-thread以此位标志是否为系统内核对象
};
需要注意的是,rt-thread将内核对象的type的最高位若为1,则表示此内核对象为系统内核对象,否则非系统内核对象.
1.2 内核对象容器
RTT使用内核对象容器来管理同一类型的内核对象,并将其放入同一链表中,便于访问.内核对象信息的结构如下定义:
[cpp]
/**
* The information of the kernel object
*/
struct rt_object_information
{
enum rt_object_class_type type; //内核对象类型
rt_list_t object_list; //内核对象链表
rt_size_t object_size; //内核对象所占的大小
};
1.3 内核对象管理系统
RTT中,每一类型的内核对象都会有一内核对象容器来包容,这个类型的内核对象容器实际上是用一链表(见1.2节所示的内核对象容器结构定义),这个链表将所有相同类型的内核对象链接起来.由于每一类型都对应着有一个这样的内核对象容器来管理,那么所有内核对象容器整体就叫做内核对象管理系统.
RTT中,内核对象管理系统是用一个rt_object_information数组来实现的,如下:
[cpp]
#define _OBJ_CONTAINER_LIST_INIT(c)\//内核对象容器的链表初始化,这里用一个宏来定义,链表的前一节点和后一节点在初始化时都指向本身所在地址
{&(rt_object_container[c].object_list), &(rt_object_container[c].object_list)}
//内核对象管理系统,这里用rt_object_information数组来实现
struct rt_object_information rt_object_container[RT_Object_Class_Unknown] =
{
/* initialize object container - thread */)},//线程对象信息
{RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Class_Thread), sizeof(struct rt_thread#ifdef RT_USING_SEMAPHORE
/* initialize object container - semaphore *///信号量对象信息
{RT_Object