RT- Thread 的I/O設(shè)備模型(簡(jiǎn)稱“設(shè)備模型”)是建立在內(nèi)核對(duì)象模型基礎(chǔ)之上的,設(shè)備被認(rèn)為是一類對(duì)象,被納入對(duì)象管理的范疇。
每個(gè)設(shè)備對(duì)象都是由基對(duì)象派生而來(lái)的,每個(gè)具體設(shè)備都可以繼承其父類對(duì)象的屬性,并派出其私有屬性。
設(shè)備的對(duì)象struct rt_device的具體定義如下所示:
strcut rt_device{
struct rt_object parent; /內(nèi)核對(duì)象基類*/
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對(duì)設(shè)備進(jìn)行分類,在每類設(shè)備執(zhí)行注冊(cè)后,系統(tǒng)會(huì)將它他們注冊(cè)為相應(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í)器設(shè)備 /
RT_Device_class_Miscellaneous, / 雜項(xiàng)設(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è)備通常是一些簡(jiǎn)單設(shè)備,如串口、按鍵。
塊設(shè)備每次傳輸一個(gè)數(shù)據(jù)塊,例如每次傳輸512字節(jié)數(shù)據(jù)。這個(gè)數(shù)據(jù)塊大小是硬件強(qiáng)制性要求的,數(shù)據(jù)塊可能使用某類數(shù)據(jù)接口或某些強(qiáng)制性的傳輸協(xié)議,否則就可能發(fā)生錯(cuò)誤。因此,有時(shí)塊設(shè)備驅(qū)動(dòng)程序進(jìn)行讀/寫操作時(shí)必須執(zhí)行附加的工作。
當(dāng)系統(tǒng)服務(wù)需要進(jìn)行大理數(shù)據(jù)的寫操作時(shí),設(shè)備驅(qū)動(dòng)程序必須將數(shù)據(jù)劃分為多個(gè)包,每個(gè)包采用設(shè)備指定的數(shù)據(jù)尺寸。而在實(shí)際操作中,最后一部分?jǐn)?shù)據(jù)尺寸有可能小于正的設(shè)備塊盡尺寸。最后需要處理“小塊”的操作。
今天主要學(xué)習(xí)了設(shè)備對(duì)象結(jié)構(gòu)體rt_device,里面包含的對(duì)象結(jié)構(gòu),還有學(xué)習(xí)了rt_device的分類枚舉rt_device_class_type。里面定義了0-21的對(duì)象。
-
驅(qū)動(dòng)器
+關(guān)注
關(guān)注
52文章
8237瀏覽量
146383 -
串口設(shè)備
+關(guān)注
關(guān)注
0文章
16瀏覽量
8587 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1289瀏覽量
40140
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論