現(xiàn)狀
由于目前本人就職的公司不允許自由使用操作系統(tǒng)開發(fā),且公司一般為C/C++混合開發(fā)的模式,驅(qū)動的開發(fā)也十分的草率,驅(qū)動代碼與應(yīng)用代碼雜糅在一起,十分的不清晰。個人又十分喜愛RT_Thread這個系統(tǒng),也翻閱過一些內(nèi)核源碼,學(xué)習(xí)到了非常多的有用的開發(fā)技能。
于是我想到,為何不能自己建立一套驅(qū)動管理機制來進(jìn)行統(tǒng)一?于是萌發(fā)了使用C++來構(gòu)建RT_Thread的設(shè)備驅(qū)動框架的想法。當(dāng)然,我并沒有做到完全一致,而是加入了自己的一些想法,并且也是基于了目前的開發(fā)現(xiàn)狀來進(jìn)行了一定的修改(不允許貼源碼只能截圖哈)。
實現(xiàn)過程說明
RT_Thread的內(nèi)核對象分為很多種類別,線程、信號量、互斥量、設(shè)備、定時器…由于借鑒了RT_Thread的源碼,故進(jìn)行了刪減,只保留設(shè)備部分,且去除了對象類型和動態(tài)申請內(nèi)存使用的size變量(RT_Thread的源碼這一部分代碼就不貼了),如圖:
內(nèi)核對象類:
RT_Thread是把rt_object這個結(jié)構(gòu)體作為雙向鏈表的元素,這里的話是把CObject這個類作為雙向鏈表的對象(C++的類其實和結(jié)構(gòu)體是一樣的)。
對象的操作只保留了object_find、object_init、object_detach,修改了register和unregister的操作。type、name、usr_data保留,其中type(設(shè)備的類型)根據(jù)實際應(yīng)用做了一些修改(部分定義):
鏈表的插入刪除操作原封不動“抄”了RT_Thread的源碼,如圖:
新增驅(qū)動的控制與循環(huán)
因為刪除了open和close,且考慮到有些驅(qū)動需要調(diào)用循環(huán)實現(xiàn)一定的功能,故新增一個驅(qū)動控制類CObjCtrl:
該類非常簡單,如果驅(qū)動未使能則循環(huán)退出,且循環(huán)的主體(ObjProcess())需要該類被繼承后進(jìn)行虛函數(shù)的重寫。
新建注冊類(基本抽象類)
注冊類的作用主要就是繼承了CObjCtrl,且替代RT_Thread的register函數(shù)和unregister函數(shù),將對象接入雙向鏈表。該類的實現(xiàn)如下:
需要注意的是,不在需要手動調(diào)用register和unregister這兩個注冊卸載函數(shù)了,因為在驅(qū)動類構(gòu)造函數(shù)執(zhí)行的時候回自動調(diào)用(見構(gòu)造函數(shù)和析構(gòu)函數(shù))。GetType()和GetName()函數(shù)比較常規(guī)。構(gòu)造函數(shù)需要傳入驅(qū)動的類型、名字和私有數(shù)據(jù)(私有數(shù)據(jù)的作用下面會有說明)。
因為繼承了CObjCtrl類,故需要重寫虛函數(shù)ObjProcess(),重寫的ObjProcess()函數(shù)由調(diào)用了本類的AbsLayerProcess()純虛函數(shù),故本注冊類依然需要被繼承后重寫該純虛函數(shù)AbsLayerProcess()。
驅(qū)動抽象類
該類主要就是繼承了上述注冊類,且存在常規(guī)的read、write、control接口(虛函數(shù))。
RT_Thread的驅(qū)動初始化是在open函數(shù)調(diào)用的時候被調(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ū)動抽象類的地址(因為傳入了this指針)。
又重寫了注冊類的AbsLayerProcess()函數(shù),該函數(shù)調(diào)用的真正需要驅(qū)動實現(xiàn)的循環(huán)函數(shù)DriverProcess()。
至此,設(shè)備驅(qū)動框架部分代碼全部開發(fā)完畢。
使用示例
以flash芯片AT45DB為例:
需要實現(xiàn)驅(qū)動的read、write、control、init函數(shù)(因為該驅(qū)動不需要循環(huán),所以不需要重寫DriverProcess()循環(huán)函數(shù))。構(gòu)造函數(shù)傳入SPI相關(guān)信息(自己實現(xiàn)的代碼,不深究)和驅(qū)動類型及名字。
實例化驅(qū)動類,自動將“對象”注冊至鏈表內(nèi):
使用如下:
至此,基本的設(shè)備驅(qū)動框架已經(jīng)形成,當(dāng)然后面又做了一定的拓展和優(yōu)化,這里不再贅述。RT_Thread實在是一個寶藏系統(tǒng)!
-
驅(qū)動器
+關(guān)注
關(guān)注
53文章
8281瀏覽量
147108 -
控制器
+關(guān)注
關(guān)注
112文章
16461瀏覽量
179547 -
SPI接口
+關(guān)注
關(guān)注
0文章
260瀏覽量
34567 -
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7030 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40412
發(fā)布評論請先 登錄
相關(guān)推薦
通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
N32G452系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記分享
基于正點原子精英版stm32f103zet6進(jìn)行rt_thread(3.0.3)的移植
![基于正點原子精英版stm32f103zet6進(jìn)行<b class='flag-5'>rt_thread</b>(3.0.3)的移植](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT—thread線程調(diào)度詳解
RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實現(xiàn)
![<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'>實現(xiàn)</b>](https://file.elecfans.com/web2/M00/46/3B/poYBAGKRi-CAAkspAADCMmGulo4378.jpg)
國民技術(shù)N32G4FR通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
N32WB452系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32WB452系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32G4FR系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32G4FR系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32G457系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32G457系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32G455系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32G455系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32G452系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32G452系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32G435系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32G435系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32G432系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32G432系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32L43x系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32L43x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
N32L40x系列通用MCU RT_Thread設(shè)備注冊應(yīng)用筆記
![N32L40x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>設(shè)備</b>注冊應(yīng)用筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論