一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

模仿RT_Thread的設(shè)備驅(qū)動模型,使用C++實(shí)現(xiàn)

冬至子 ? 來源:哈嘍你好啊 ? 作者:哈嘍你好啊 ? 2023-10-24 14:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

現(xiàn)狀

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

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

實(shí)現(xiàn)過程說明

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

1.jpg

內(nèi)核對象類:

1.jpg

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

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

1.jpg

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

1.jpg

新增驅(qū)動的控制與循環(huán)

因?yàn)閯h除了open和close,且考慮到有些驅(qū)動需要調(diào)用循環(huán)實(shí)現(xiàn)一定的功能,故新增一個(gè)驅(qū)動控制類CObjCtrl:

1.jpg

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

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

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

1.jpg

需要注意的是,不在需要手動調(diào)用register和unregister這兩個(gè)注冊卸載函數(shù)了,因?yàn)樵隍?qū)動類構(gòu)造函數(shù)執(zhí)行的時(shí)候回自動調(diào)用(見構(gòu)造函數(shù)和析構(gòu)函數(shù))。GetType()和GetName()函數(shù)比較常規(guī)。構(gòu)造函數(shù)需要傳入驅(qū)動的類型、名字和私有數(shù)據(jù)(私有數(shù)據(jù)的作用下面會有說明)。

因?yàn)槔^承了CObjCtrl類,故需要重寫虛函數(shù)ObjProcess(),重寫的ObjProcess()函數(shù)由調(diào)用了本類的AbsLayerProcess()純虛函數(shù),故本注冊類依然需要被繼承后重寫該純虛函數(shù)AbsLayerProcess()。

驅(qū)動抽象類

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

RT_Thread的驅(qū)動初始化是在open函數(shù)調(diào)用的時(shí)候被調(diào)用的,我去除了open和close,所以驅(qū)動的初始化放在find函數(shù)內(nèi)部,通過變量b_IsInitOK來記錄是否已經(jīng)進(jìn)行過初始化,也可以手動調(diào)用函數(shù)DriverInitial()來進(jìn)行驅(qū)動的初始化。查看構(gòu)造函數(shù)可以發(fā)現(xiàn),私有數(shù)據(jù)記錄了本驅(qū)動抽象類的地址(因?yàn)閭魅肓藅his指針)。

又重寫了注冊類的AbsLayerProcess()函數(shù),該函數(shù)調(diào)用的真正需要驅(qū)動實(shí)現(xiàn)的循環(huán)函數(shù)DriverProcess()。

1.jpg

至此,設(shè)備驅(qū)動框架部分代碼全部開發(fā)完畢。

使用示例

以flash芯片AT45DB為例:

1.jpg

需要實(shí)現(xiàn)驅(qū)動的read、write、control、init函數(shù)(因?yàn)樵擈?qū)動不需要循環(huán),所以不需要重寫DriverProcess()循環(huán)函數(shù))。構(gòu)造函數(shù)傳入SPI相關(guān)信息(自己實(shí)現(xiàn)的代碼,不深究)和驅(qū)動類型及名字。

實(shí)例化驅(qū)動類,自動將“對象”注冊至鏈表內(nèi):

1.jpg

使用如下:

1.jpg

至此,基本的設(shè)備驅(qū)動框架已經(jīng)形成,當(dāng)然后面又做了一定的拓展和優(yōu)化,這里不再贅述。RT_Thread實(shí)在是一個(gè)寶藏系統(tǒng)!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動器
    +關(guān)注

    關(guān)注

    54

    文章

    8654

    瀏覽量

    149469
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17048

    瀏覽量

    183518
  • SPI接口
    +關(guān)注

    關(guān)注

    0

    文章

    263

    瀏覽量

    35400
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7259
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1385

    瀏覽量

    41672
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32G452系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記分享

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

    基于正點(diǎn)原子精英版stm32f103zet6進(jìn)行rt_thread(3.0.3)的移植

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

    RTthread線程調(diào)度詳解

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

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備實(shí)現(xiàn)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備實(shí)現(xiàn)方式介紹如下:
    的頭像 發(fā)表于 05-28 10:38 ?2395次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>模型</b>框架及創(chuàng)建注冊<b class='flag-5'>設(shè)備</b>的<b class='flag-5'>實(shí)現(xiàn)</b>

    國民技術(shù)N32G4FR通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32WB452系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32G4FR系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32G457系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32G455系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

    N32G455系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?1次下載
    N32G455系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記

    N32G452系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32G435系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32G432系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32L43x系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

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

    N32L40x系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記

    N32L40x系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?0次下載
    N32L40x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記