RTT在设计时虽然采用了c语言,但使用了面向对象的思想。所有的线程、事件设备等都是继承自object,且采用链表的方式统一管理。如图所示。
对象控制块
/**
* 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;
在内核里,所有对象都由链表组织起来。链表定义如下:
struct rt_list_node
{
struct rt_list_node *next; // 指向下一节点
struct rt_list_node *prev; // 指向前一节点
};
typedef struct rt_list_node rt_list_t;
所有可能派生出来的对象为:
/**
* 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,