色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析RT-Thread設備驅動框架

冬至子 ? 來源:螺絲松掉的人 ? 作者:螺絲松掉的人 ? 2023-08-07 15:39 ? 次閱讀

前言介紹
RT-Thread 設備框架屬于組件和服務層,是基于 RT-Thread 內核之上的上層軟件。設備框架是針對某一類外設,抽象出來的一套統一的操作方法及接入標準,可以屏蔽硬件差異,為應用層提供統一的操作方法。

RT-Thread 設備框架分為三層:設備驅動層、設備驅動框架層、I/O 設備管理層。其中設備驅動層直接對接底層硬件設備;I/O 設備管理層向應用層提供了rt_device_find、open、read、write、close、register等訪問設備的統一標準接口。而設備驅動框架層就是就是將同類型硬件設備的共同特特征提取抽象出來,并且還預留了接口,可以添加不同設備的獨有特性。

其中的設備模型被認為是一類對象,每個設備對象都是由基對象派生的,每個設備都可以繼承其父類對象的屬性,并派生其私有屬性。

正是這樣的框架,使得 RT-Thread 設備框架中各模塊高內聚低耦合,對于已有的設備類型,只要將底層硬件的驅動對接到設備驅動層,就可以在應用程序中,調用統一的標準接口,使用的不同廠家不同類型的硬件設備。

示例分析
下文將以 CAN 設備為例,并從 void 類型指針、結構體等方向,分析 RT-Thread 設備驅動框架。

設備對象
以下是設備對象在 rt-threadincludertdef.h 中的具體定義:(去除了其中一些擴展的功能,方便理解)

/**

Device structure
*/
struct rt_device
{
struct rt_object parent; / *< inherit from rt_object /
enum rt_device_class_type type; /
< device type */
rt_uint16_t flag; / < device flag /
rt_uint16_t open_flag; /
< device open flag */
rt_uint8_t ref_count; / < reference count /
rt_uint8_t device_id; /
< 0 - 255 /
/
device call back */
rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);
#ifdef RT_USING_DEVICE_OPS
const struct rt_device_ops ops;
#else
/
common device interface */
rt_err_t (*init) (rt_device_t dev);
rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag);
rt_err_t (*close) (rt_device_t dev);
rt_ssize_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
rt_ssize_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
rt_err_t (*control)(rt_device_t dev, int cmd, void args);
#endif /
RT_USING_DEVICE_OPS */
void *user_data; /
< device private data */
};

然后從 struct rt_device 中派生出新的 CAN 設備類型 struct rt_can_device ,其中依據 CAN 類型設備共有的特性新增了一些結構體成員,位于rt-threadcomponentsdriversincludedriverscan.h 中:

struct rt_can_device
{
struct rt_device parent;
const struct rt_can_ops *ops;
struct can_configure config;
struct rt_can_status status;
rt_uint32_t timerinitflag;
struct rt_timer timer;
struct rt_can_status_ind_type status_indicate;
#ifdef RT_CAN_USING_HDR
struct rt_can_hdr *hdr;
#endif
#ifdef RT_CAN_USING_BUS_HOOK
rt_can_bus_hook bus_hook;
#endif / RT_CAN_USING_BUS_HOOK /
struct rt_mutex lock;
void *can_rx;
void *can_tx;
};
stm32 的 CAN 設備驅動中,又從 struct rt_can_device 中派生出了新的 CAN 設備模型 struct stm32_can 其中添加了這個設備類型的私有數據,便于底層驅動的對接:

/* stm32 can device */
struct stm32_can
{
char name;
CAN_HandleTypeDef CanHandle;
CAN_FilterTypeDef FilterConfig;
struct rt_can_device device; /
inherit from can device */
};

可以看出,RT-Thread 通過結構體和函數指針使用 C 語言實現了一些面向對象編程的特性,如封裝和繼承等,這樣面向對象、模塊化的思維框架,有助于實現各模塊之間高內聚低耦合,提高開發效率。

操作方法
在 rt-threadcomponentsdriversincludedriverscan.h 中可以看到針對 CAN 設備有以下操作方法,這些操作方法是需要我們在設備驅動層去針對不同的硬件設備進行對接實現的。對于一些特殊的設備類型,可以不用對接其所有的操作方法。

struct rt_can_ops
{
rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
int (*sendmsg)(struct rt_can_device *can, const void *buf, rt_uint32_t boxno);
int (*recvmsg)(struct rt_can_device *can, void *buf, rt_uint32_t boxno);
};

在librariesHAL_Driversdrv_can.c中,就實現了所有 CAN 設備的操作方法,并賦值給對應的函數指針,可以直接調用。并且通過 static const 修飾符,使結構體變量_can_ops的值在編譯時被確定,并且不能在程序運行時修改。這樣可以確保該結構體變量的內容是固定的,提高了代碼的安全性和可維護性。然后通過rt_hw_can_register注冊。

static const struct rt_can_ops _can_ops =
{
_can_config,
_can_control,
_can_sendmsg,
_can_recvmsg,
};
/* register CAN1 device */
rt_hw_can_register(&drv_can1.device,
drv_can1.name,
&_can_ops,
&drv_can1);
可以看一下rt_hw_can_register函數的具體聲明:

rt_err_t rt_hw_can_register(struct rt_can_device *can,
const char *name,
const struct rt_can_ops *ops,
void *data);
其中最后一個參數為 void 類型指針,在注冊同類型的不同設備時,就可以通過最后一個參數,在注冊時傳入其特有的私有數據。例如 STM32 的 drv_can 中傳入的就是 stm32_can結構體類型,其中就包含了 stm32 can 的私有數據域,在對接底層硬件驅動的時候就會方便很多。

總結
可以感受到,其中結構體和指針的運用是非常重要的。盡管C語言是一種面向過程的語言,但通過使用結構體和函數指針,可以模擬實現封裝、繼承和多態這三個面向對象編程的特性,享受面向對象編程的好處。

對于指針的運用,主要是 void 類型指針和函數指針。由于 void 指針沒有特定的類型,因此它可以指向任何類型的數據。也就是說,任何類型的指針都可以直接賦值給 void 指針,而無需進行其他相關的強制類型轉換,便于傳遞同類型的不同設備的私有數據。通過函數指針,也就是回調函數,可以大大提高程序的靈活性和并起到封裝的作用。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 驅動器
    +關注

    關注

    53

    文章

    8256

    瀏覽量

    146595
  • CAN總線
    +關注

    關注

    145

    文章

    1952

    瀏覽量

    130861
  • STM32
    +關注

    關注

    2270

    文章

    10906

    瀏覽量

    356566
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137111
  • RT-Thread
    +關注

    關注

    31

    文章

    1294

    瀏覽量

    40230
收藏 人收藏

    評論

    相關推薦

    基于RT-Thread的SPI通訊

    驅動層的驅動。(rt-thread設備 I/O 模型有設備管理層、設備
    的頭像 發表于 08-22 09:28 ?1729次閱讀

    RT-Thread ssd1306驅動

    RT-Thread 驅動ssd1306
    的頭像 發表于 04-21 10:08 ?26.5w次閱讀
    <b class='flag-5'>RT-Thread</b> ssd1306<b class='flag-5'>驅動</b>

    基于RT-Thread的RoboMaster電控框架設計

    由于 RT-Thread 穩定高效的內核,豐富的文檔教程,積極活躍的社區氛圍,以及設備驅動框架、Kconfig、Scons、日志系統、海量的軟件包……很難不選擇
    發表于 09-06 15:21 ?715次閱讀

    RT-Thread設備驅動開發指南基礎篇—以先楫bsp的hwtimer設備為例

    RT-Thread設備驅動開發指南》書籍是RT-thread官方出品撰寫,系統講解RT-thread IO
    的頭像 發表于 02-20 16:01 ?1734次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發指南基礎篇—以先楫bsp的hwtimer<b class='flag-5'>設備</b>為例

    RT-Thread全球技術大會:RT-Thread上的單元測試框架與運行測試用例

    RT-Thread全球技術大會:RT-Thread上的單元測試框架與運行測試用例 ? ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 16:21 ?1637次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>上的單元測試<b class='flag-5'>框架</b>與運行測試用例

    RT-Thread設備模型框架及創建注冊設備的實現

    RT-Thread設備模型框架及創建注冊設備的實現方式介紹如下:
    的頭像 發表于 05-28 10:38 ?2198次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>設備</b>模型<b class='flag-5'>框架</b>及創建注冊<b class='flag-5'>設備</b>的實現

    RT-Thread全球技術大會:RNDIS設備介紹及應用

    RT-Thread全球技術大會上,以RNDIS設備驅動框架為主題,首先介紹了RNDIS設備介紹及應用。
    的頭像 發表于 05-28 14:36 ?2259次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:RNDIS<b class='flag-5'>設備</b>介紹及應用

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_SPI 設備

    RT-Thread文檔_SPI 設備
    發表于 02-22 18:36 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_SPI <b class='flag-5'>設備</b>

    RT-Thread文檔_Pulse Encoder 設備

    RT-Thread文檔_Pulse Encoder 設備
    發表于 02-22 18:39 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_Pulse Encoder <b class='flag-5'>設備</b>

    RT-Thread文檔_utest 測試框架

    RT-Thread文檔_utest 測試框架
    發表于 02-22 18:43 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_utest 測試<b class='flag-5'>框架</b>

    基于 RT-Thread 的 RoboMaster 電控框架(一)

    由于 RT-Thread 穩定高效的內核,豐富的文檔教程,積極活躍的社區氛圍,以及設備驅動框架、Kconfig、Scons、日志系統、海量的軟件包……很難不選擇
    的頭像 發表于 09-19 19:55 ?787次閱讀

    基于RT-Thread的RoboMaster電控框架(二)

    由于 RT-Thread 穩定高效的內核,豐富的文檔教程,積極活躍的社區氛圍,以及設備驅動框架、Kconfig、Scons、日志系統、海量的軟件包
    的頭像 發表于 09-20 15:16 ?768次閱讀

    LPC55S69對接RT-Thread PWM設備框架

    在使用 RT-Thread 的 bsp pwm 的時候,注意到 lpc55sxx 系列只對接了通用定時器2中的通道1作為 PWM 輸出。但其實 LPC55S69 具備非常多的 PWM 資源。于是根據 RT-Thread 設備
    的頭像 發表于 10-11 15:02 ?772次閱讀

    RT-Thread設備驅動開發指南》基礎篇--以先楫bsp的hwtimer設備為例

    一、概述(一)RT-Thread設備驅動RT-Thread設備驅動開發指南》書籍是
    的頭像 發表于 02-24 08:16 ?1714次閱讀
    《<b class='flag-5'>RT-Thread</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發指南》基礎篇--以先楫bsp的hwtimer<b class='flag-5'>設備</b>為例
    主站蜘蛛池模板: 亚洲性无码AV久久成人| 日本无码免费久久久精品| 女教师公车痴汉在线播放| 亚洲AV无码A片在线观看蜜桃| 99久久免费国内精品| 快播看黄片| 与子敌伦刺激对白亂輪亂性| 国产自拍视频在线一区| 玩两个少妇女邻居| 国产精品久久久久久亚洲毛片| 色戒未删减版在线观看完整| 超碰在线视频地址| 三叶草成人| 国产二区自拍| 双手绑在床头调教乳尖| 国产成人亚洲精品午夜国产馆| 伸到同桌奶罩里捏她胸h| 国产AV视频一区二区蜜桃| 色窝窝亚洲AV在线观看| 国产精品igao视频网网址| 婷婷午夜影院| 国产亚洲精品久久孕妇呦呦你懂| 忘忧草日本在线社区WWW电影| 国产精品久久高潮呻吟无码| 午夜AV内射一区二区三区红桃视 | 男女床上黄色| a免费视频| 色欲AV精品人妻一区二区麻豆| 国产跪地吃黄金喝圣水合集| 亚欧成人毛片一区二区三区四区| 果冻传媒APP免费网站在线观看| 亚洲性无码AV久久成人| 美女在线永久免费网站| 超级最爽的乱淫片免费| 香蕉久久一区二区三区啪啪| 狠狠操天天操夜夜操| 最近中文字幕2019国语4| 欧美性爱 成人| 国产美女裸身网站免费观看视频| 亚洲三级视频在线| 美女脱内衣裸身尿口露出来 |