1. 程式人生 > 其它 >RT-Thread之物件容器

RT-Thread之物件容器

1、什麼是物件

在RT-Thread,所有的資料結構都成為物件。

其中執行緒,訊號量、互斥量、事件、郵箱、訊息佇列、記憶體堆、記憶體池、裝置和定時器在rtdef.h中有明顯的列舉定義,即為每個物件打上一個數字標籤。

enum rt_object_class_type
{
    RT_Object_Class_Thread = 0, /* 物件是執行緒 */
    RT_Object_Class_Semaphore, /* 物件是訊號量 */
    RT_Object_Class_Mutex, /* 物件是互斥量 */
    RT_Object_Class_Event, /* 物件是事件 */
    RT_Object_Class_MailBox, 
/* 物件是郵箱 */ RT_Object_Class_MessageQueue, /* 物件是訊息佇列 */ RT_Object_Class_MemHeap, /* 物件是記憶體堆 */ RT_Object_Class_MemPool, /* 物件是記憶體池 */ RT_Object_Class_Device, /* 物件是裝置 */ RT_Object_Class_Timer, /* 物件是定時器 */ RT_Object_Class_Module, /* 物件是模組 */ RT_Object_Class_Unknown, /* 物件未知 */ RT_Object_Class_Static
= 0x80 /* 物件是靜態物件 */ };

2、物件資料型別定義

在rtt中,為了方便管理這些物件,專門定義了一個物件型別的資料結構。具體如下:

struct rt_object
{ 
    char name[RT_NAME_MAX]; (1) /* 核心物件的名字 */
    rt_uint8_t type; (2) /* 核心物件的型別 */
    rt_uint8_t flag; (3) /* 核心物件的狀態 */
    rt_list_t list; (4) /* 核心物件的列表節點 */
};
 typedef struct rt_object *rt_object_t; (5) /* 核心物件資料型別重定義 
*/

(1)物件名字,字串形式,方便除錯,最大長度由rt_config.h中的巨集RT_NAMA_MAX決定,預設定義為8。

(2)物件的型別,RT-Thread為每個物件都打上了數字標籤,取值由rt_object_class_type列舉型別限定。

(3)物件的狀態

(4)物件的列表節點,每個物件都可以通過自己的列表節點list將自己掛到列表容器中。

(5)物件的資料型別,RT-Thread中會為每一個新的結構體用typedef重定義一個指標型別的資料結構。

3、線上程控制塊中新增物件成員

在RT-Thread中,每個物件都有對應的一個結構體,這個結構體叫做該物件的控制塊。如執行緒會有一個執行緒控制塊,定時器有一個定時器控制塊,訊號量有訊號量控制塊等。這些控制塊的開頭都會包含一個核心物件結構體。或者直接將物件結構體的成員放在物件控制塊結構體的開頭。其中執行緒控制塊的開頭放置的就是物件結構體的成員,具體如下:開頭的高亮部分程式碼,這裡我們只講解往執行緒控制塊裡面新增物件結構體成員,其他核心物件的都是直接在其開頭使用struct rt_object 直接定義一個核心物件變數。

4、什麼是容器

在rtt中,每當使用者建立一個物件,如執行緒,就會將這個物件放到一個叫做容器的地方,這樣做得目的是為了方便管理,這時使用者會問,管理什麼?在RT-Thread 的元件finsh使用中,就需要使用到容器,通過掃描容器的核心物件來獲取各個核心物件的狀態,然後輸出除錯資訊。目前,我們只需要知道所有建立的物件都會放到容器中。

那什麼是容器,從程式碼上看,容器是一個數組,是一個全域性變數,資料型別為 struct rt_object_information,在object.c中定義。