溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行RT-Thread中設備模型rt_device的理解

發(fā)布時間:2021-12-17 15:29:25 來源:億速云 閱讀:598 作者:柒染 欄目:互聯(lián)網(wǎng)科技

如何進行RT-Thread中設備模型rt_device的理解,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

  • 最近在看內(nèi)核源碼,暫時避開費腦力的任務調(diào)度、內(nèi)存管理等較復雜的實現(xiàn)方法,發(fā)現(xiàn)rt_device設備框架實現(xiàn)很簡單。

  • rt_device,設備管理的框架(模型),提供標準的設備操作接口API,一些外設,可以抽象成設備,進行統(tǒng)一的管理操作,如LCD、Touch、Sensor等。

rt_device的結(jié)構(gòu)

  • rt_device,是內(nèi)核對象派生出來的,因此,有些操作,就是在操作內(nèi)核對象。上幾篇筆記研究內(nèi)核對象的管理,現(xiàn)在發(fā)現(xiàn),看device.c文件,很容易能看懂。

如何進行RT-Thread中設備模型rt_device的理解

rt_device_class_type.png

rt_device的使用

  • RT-Thread 的PIN、CAN、Serial、I2C、SPI、PM等,都抽象成一種設備模型。這些設備模型,派生于rt_device即可。

pin設備模型:結(jié)構(gòu)如下:

/* pin device and operations for RT-Thread */
struct rt_device_pin
{
    struct rt_device parent; /* 派生于rt_device */
    const struct rt_pin_ops *ops; /* 設備特有的操作接口,還可以根據(jù)需要增加其他成員 */
};
  • 所以用戶可以派生自己想要的設備框架,增加特定設備的操作接口:ops,特定屬性:結(jié)構(gòu)體成員。

  • 需要把具體的設備,注冊到內(nèi)核容器上,這里調(diào)用rt_device的注冊接口。

如:

/* 使用時,需要把設備名稱、操作接口等,傳入 */
int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data)
{
    _hw_pin.parent.type         = RT_Device_Class_Miscellaneous; /* 設備類型,為了區(qū)分設備種類 */
    _hw_pin.parent.rx_indicate  = RT_NULL; /* 接收回調(diào),串口、CAN一般會有 */
    _hw_pin.parent.tx_complete  = RT_NULL; /* 發(fā)送回調(diào),串口、CAN一般會有 */

#ifdef RT_USING_DEVICE_OPS
    _hw_pin.parent.ops          = &pin_ops;
#else
    _hw_pin.parent.init         = RT_NULL; /* 以下標準的rt_device設備操作接口,根據(jù)需要實現(xiàn) */
    _hw_pin.parent.open         = RT_NULL;
    _hw_pin.parent.close        = RT_NULL;
    _hw_pin.parent.read         = _pin_read;
    _hw_pin.parent.write        = _pin_write;
    _hw_pin.parent.control      = _pin_control;
#endif

    _hw_pin.ops                 = ops;  /* 操作接口,設備的特有操作接口 */
    _hw_pin.parent.user_data    = user_data; /* 不是必要的用戶數(shù)據(jù) */

    /* register a character device */
    rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR);  /* 設備注冊接口:注冊為具體設備 */

    return 0;
}
  • 具體設備對接設備框架

/* 具體設備的OPS 實現(xiàn) */
const static struct rt_pin_ops _stm32_pin_ops =
{
    stm32_pin_mode,
    stm32_pin_write,
    stm32_pin_read,
    stm32_pin_attach_irq,
    stm32_pin_dettach_irq,
    stm32_pin_irq_enable,
};

/* 實際設備的注冊方法 */
rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
  • 設備注冊后,可以通過:list_device查看

其他

  • rt_device_read rt_device_write等操作前,需要:rt_device_open

  • rt_device_open rt_device_close 操作最好成對出現(xiàn),原因是rt_device內(nèi)部有引用計數(shù),如你open兩次,close一次,計數(shù)為1,沒有真正的close。

  • 一般通過rt_device_find,通過設備名稱,查找設備,獲取設備的操作句柄,也就是設備結(jié)構(gòu)體指針,從而可以進一步進行操作設備的操作接口ops或通過設備的標準操作接口操作設備。

  • RT-Thread 的設備類型很多,可以派生各種設備模型(框架),從而可以注冊掛載很多設備上去,可以方便的實現(xiàn)讀寫控制等操作,如控制硬件、傳感器等。

關于如何進行RT-Thread中設備模型rt_device的理解問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI