RT- Thread 的I/O設(shè)備模型(簡稱“設(shè)備模型”)是建立在內(nèi)核對象模型基礎(chǔ)之上的,設(shè)備被認(rèn)為是一類對象,被納入對象管理的范疇。
每個設(shè)備對象都是由基對象派生而來的,每個具體設(shè)備都可以繼承其父類對象的屬性,并派出其私有屬性。
設(shè)備的對象struct rt_device的具體定義如下所示:
strcut rt_device{
struct rt_object parent; /內(nèi)核對象基類*/
enum rt_device_classe_type type; / 設(shè)備類型 /
rt_uint16_t flag; / 設(shè)備參數(shù) /
rt_uint16_t open_flag; / 設(shè)備打開標(biāo)志 /
rt_uint8_t ref_count; / 設(shè)備被引用的次數(shù) /
rt_uint8_t device_id; / 設(shè)備ID,范圍為0-255 /
/ 數(shù)據(jù)收發(fā)回調(diào)函數(shù) /
rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);
const struct rt_device_ops *ops; / 設(shè)備操作方法 /
/ 設(shè)備的私有數(shù)據(jù) /
void *user_data;
};
typedef struct rt_device *rt_device_t;
}
rt_device_class_type用于RT-Thread對設(shè)備進行分類,在每類設(shè)備執(zhí)行注冊后,系統(tǒng)會將它他們注冊為相應(yīng)類別的設(shè)備。rt_device_class_type類型枚舉如下。
enum rt_device_class_type
{
RT_Device_class_char = 0, /* 字符設(shè)備 /
RT_Device_class_Block, / 塊設(shè)備 /
RT_Device_class_NetIf, / 網(wǎng)絡(luò)設(shè)備 /
RT_Device_class_MTD, / MTD設(shè)備 /
RT_Device_class_CAN, / CAN設(shè)備 /
RT_Device_class_RTC, / RTC設(shè)備 /
RT_Device_class_Sound, / 聲音設(shè)備 /
RT_Device_class_Graphic, / 圖形設(shè)備 /
RT_Device_class_I2CBUS, / I2C設(shè)備 /
RT_Device_class_USBDevice, / USB從設(shè)備 /
RT_Device_class_USBHost, / USB主設(shè)備 /
RT_Device_class_SPIBUS, / SPI總線設(shè)備 /
RT_Device_class_SPIDevice, / SPI設(shè)備 /
RT_Device_class_SDIO, / SDIO總線設(shè)備 /
RT_Device_class_PM, / 低功耗設(shè)備 /
RT_Device_class_Pipe, / 管道設(shè)備 /
RT_Device_class_Portal, / 雙向管理設(shè)備 /
RT_Device_class_Timer, / 定時器設(shè)備 /
RT_Device_class_Miscellaneous, / 雜項設(shè)備 /
RT_Device_class_Sensor, / 傳感器設(shè)備 /
RT_Device_class_Touch, / 觸摸設(shè)備 /
RT_Device_class_Unknown / 未知設(shè)備 */
};
其中,字符設(shè)備、塊設(shè)備是常用的設(shè)備類型,它們的分類依據(jù)是設(shè)備與系統(tǒng)之間的數(shù)據(jù)傳輸處理方式。字符設(shè)備允許非結(jié)構(gòu)化的數(shù)據(jù)傳輸,通常數(shù)據(jù)傳輸采用串行的形式,每次一字節(jié)。字符設(shè)備通常是一些簡單設(shè)備,如串口、按鍵。
塊設(shè)備每次傳輸一個數(shù)據(jù)塊,例如每次傳輸512字節(jié)數(shù)據(jù)。這個數(shù)據(jù)塊大小是硬件強制性要求的,數(shù)據(jù)塊可能使用某類數(shù)據(jù)接口或某些強制性的傳輸協(xié)議,否則就可能發(fā)生錯誤。因此,有時塊設(shè)備驅(qū)動程序進行讀/寫操作時必須執(zhí)行附加的工作。
當(dāng)系統(tǒng)服務(wù)需要進行大理數(shù)據(jù)的寫操作時,設(shè)備驅(qū)動程序必須將數(shù)據(jù)劃分為多個包,每個包采用設(shè)備指定的數(shù)據(jù)尺寸。而在實際操作中,最后一部分?jǐn)?shù)據(jù)尺寸有可能小于正的設(shè)備塊盡尺寸。最后需要處理“小塊”的操作。
今天主要學(xué)習(xí)了設(shè)備對象結(jié)構(gòu)體rt_device,里面包含的對象結(jié)構(gòu),還有學(xué)習(xí)了rt_device的分類枚舉rt_device_class_type。里面定義了0-21的對象。
-
驅(qū)動器
+關(guān)注
關(guān)注
52文章
8099瀏覽量
145813 -
串口設(shè)備
+關(guān)注
關(guān)注
0文章
14瀏覽量
8567 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39837
發(fā)布評論請先 登錄
相關(guān)推薦
評論