在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

模仿RT_Thread的設備驅動模型,使用C++實現

冬至子 ? 來源:哈嘍你好啊 ? 作者:哈嘍你好啊 ? 2023-10-24 14:47 ? 次閱讀

現狀

由于目前本人就職的公司不允許自由使用操作系統開發,且公司一般為C/C++混合開發的模式,驅動的開發也十分的草率,驅動代碼與應用代碼雜糅在一起,十分的不清晰。個人又十分喜愛RT_Thread這個系統,也翻閱過一些內核源碼,學習到了非常多的有用的開發技能。

于是我想到,為何不能自己建立一套驅動管理機制來進行統一?于是萌發了使用C++來構建RT_Thread的設備驅動框架的想法。當然,我并沒有做到完全一致,而是加入了自己的一些想法,并且也是基于了目前的開發現狀來進行了一定的修改(不允許貼源碼只能截圖哈)。

實現過程說明

RT_Thread的內核對象分為很多種類別,線程、信號量、互斥量、設備、定時器…由于借鑒了RT_Thread的源碼,故進行了刪減,只保留設備部分,且去除了對象類型和動態申請內存使用的size變量(RT_Thread的源碼這一部分代碼就不貼了),如圖:

1.jpg

內核對象類:

1.jpg

RT_Thread是把rt_object這個結構體作為雙向鏈表的元素,這里的話是把CObject這個類作為雙向鏈表的對象(C++的類其實和結構體是一樣的)。

對象的操作只保留了object_find、object_init、object_detach,修改了register和unregister的操作。type、name、usr_data保留,其中type(設備的類型)根據實際應用做了一些修改(部分定義):

1.jpg

鏈表的插入刪除操作原封不動“抄”了RT_Thread的源碼,如圖:

1.jpg

新增驅動的控制與循環

因為刪除了open和close,且考慮到有些驅動需要調用循環實現一定的功能,故新增一個驅動控制類CObjCtrl:

1.jpg

該類非常簡單,如果驅動未使能則循環退出,且循環的主體(ObjProcess())需要該類被繼承后進行虛函數的重寫。

新建注冊類(基本抽象類)

注冊類的作用主要就是繼承了CObjCtrl,且替代RT_Thread的register函數和unregister函數,將對象接入雙向鏈表。該類的實現如下:

1.jpg

需要注意的是,不在需要手動調用register和unregister這兩個注冊卸載函數了,因為在驅動類構造函數執行的時候回自動調用(見構造函數和析構函數)。GetType()和GetName()函數比較常規。構造函數需要傳入驅動的類型、名字和私有數據(私有數據的作用下面會有說明)。

因為繼承了CObjCtrl類,故需要重寫虛函數ObjProcess(),重寫的ObjProcess()函數由調用了本類的AbsLayerProcess()純虛函數,故本注冊類依然需要被繼承后重寫該純虛函數AbsLayerProcess()。

驅動抽象類

該類主要就是繼承了上述注冊類,且存在常規的read、write、control接口(虛函數)。

RT_Thread的驅動初始化是在open函數調用的時候被調用的,我去除了open和close,所以驅動的初始化放在find函數內部,通過變量b_IsInitOK來記錄是否已經進行過初始化,也可以手動調用函數DriverInitial()來進行驅動的初始化。查看構造函數可以發現,私有數據記錄了本驅動抽象類的地址(因為傳入了this指針)。

又重寫了注冊類的AbsLayerProcess()函數,該函數調用的真正需要驅動實現的循環函數DriverProcess()。

1.jpg

至此,設備驅動框架部分代碼全部開發完畢。

使用示例

以flash芯片AT45DB為例:

1.jpg

需要實現驅動的read、write、control、init函數(因為該驅動不需要循環,所以不需要重寫DriverProcess()循環函數)。構造函數傳入SPI相關信息(自己實現的代碼,不深究)和驅動類型及名字。

實例化驅動類,自動將“對象”注冊至鏈表內:

1.jpg

使用如下:

1.jpg

至此,基本的設備驅動框架已經形成,當然后面又做了一定的拓展和優化,這里不再贅述。RT_Thread實在是一個寶藏系統!

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

    關注

    52

    文章

    8241

    瀏覽量

    146399
  • 控制器
    +關注

    關注

    112

    文章

    16374

    瀏覽量

    178157
  • SPI接口
    +關注

    關注

    0

    文章

    258

    瀏覽量

    34386
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6993
  • RT-Thread
    +關注

    關注

    31

    文章

    1290

    瀏覽量

    40154
收藏 人收藏

    評論

    相關推薦

    通用MCU RT_Thread設備注冊應用筆記

    本文檔主要描述 N32G45x 系列、N32G4FR 系列、N32WB452 系列、N32G43x 系列、N32L40x 系列、N32L43x 系列 MCU 的 RT_Thread 設備注冊,便于使用者快速熟悉 RT_Thread
    發表于 11-02 07:53

    N32G452系列通用MCU RT_Thread設備注冊應用筆記分享

    本文檔主要描述 N32G45x 系列、N32G4FR 系列、N32WB452 系列、N32G43x 系列、N32L40x 系列、N32L43x 系列 MCU 的 RT_Thread 設備注冊,便于使用者快速熟悉 RT_Thread
    發表于 11-02 07:55

    基于正點原子精英版stm32f103zet6進行rt_thread(3.0.3)的移植

    文件夾內容簡介添加RT_Thread源碼到工程組文件夾config.h文件修改board.c文件修改修改main.c函數注意,此時編譯還會存在問題,需要將stm32F10x_it.c
    發表于 12-05 11:21 ?0次下載
    基于正點原子精英版stm32f103zet6進行<b class='flag-5'>rt_thread</b>(3.0.3)的移植

    RTthread線程調度詳解

    rt_schedule(void){ struct rt_thread *to_thread; struct rt_thread *from_th
    的頭像 發表于 05-19 17:07 ?2560次閱讀

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

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

    國民技術N32G4FR通用MCU RT_Thread設備注冊應用筆記

    、N32L43x 系列 MCU 的 RT_Thread 設備注冊, 便于使用者快速熟悉 RT_Thread 設備驅動
    發表于 11-07 14:53 ?3次下載

    N32WB452系列通用MCU RT_Thread設備注冊應用筆記

    N32WB452系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?0次下載
    N32WB452系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32G4FR系列通用MCU RT_Thread設備注冊應用筆記

    N32G4FR系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?1次下載
    N32G4FR系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32G457系列通用MCU RT_Thread設備注冊應用筆記

    N32G457系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?3次下載
    N32G457系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32G455系列通用MCU RT_Thread設備注冊應用筆記

    N32G455系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?0次下載
    N32G455系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32G452系列通用MCU RT_Thread設備注冊應用筆記

    N32G452系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?0次下載
    N32G452系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32G435系列通用MCU RT_Thread設備注冊應用筆記

    N32G435系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?1次下載
    N32G435系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32G432系列通用MCU RT_Thread設備注冊應用筆記

    N32G432系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?3次下載
    N32G432系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32L43x系列通用MCU RT_Thread設備注冊應用筆記

    N32L43x系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?0次下載
    N32L43x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記

    N32L40x系列通用MCU RT_Thread設備注冊應用筆記

    N32L40x系列通用MCU RT_Thread設備注冊應用筆記
    發表于 11-10 19:51 ?0次下載
    N32L40x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設備</b>注冊應用筆記
    主站蜘蛛池模板: 奇米影色777四色在线首页| 国产精品久久婷婷六月丁香| 午夜免费福利片| 性做久久久久久久久| 五月亭亭激情五月| 婷婷色六月| 日本国产中文字幕| 免费国产一区二区三区| 韩日精品| 伊人网址| 久久久久国产精品免费免费| 2021精品国产综合久久| 一区二区三区免费精品视频| yy6080一级毛片高清| www.亚洲色图.com| 黄色毛片播放| 成年人黄色免费网站| 午夜神马影院| 91久久另类重口变态| 天天躁夜夜躁狠狠躁2018a| freesexvideo性欧美医生护士| 一级黄视频| 狠狠干激情| 亚洲视频在线一区| 一级做a爱片就在线看| 精品国产自在在线在线观看| 伊人久久精品成人网| 色婷婷久久合月综| 色秀视频免费高清网站| 欧洲人体超大胆露私视频| 狠狠躁夜夜躁人人爽天天段| 午夜影院免费观看| 国产色综合天天综合网| 黄色成人一级片| 91网站免费在线观看| 伊人网99| 欧美成人精品欧美一级乱黄| www九色| 久久香蕉国产线看观看亚洲片| 欧美69色| 亚洲男人天堂网址|