- 前言
學(xué)軟件的重點(diǎn)就是多看資料。我們遇到的問題99.99%網(wǎng)上都有人遇到過,如果你沒找到答案,只可能是你搜索方式不對(duì)。
我們想解決的問題,或者我們想做的事,90%在網(wǎng)上已經(jīng)有現(xiàn)成的答案了。
這是多么遺憾的事,我們想盡情發(fā)揮我們的創(chuàng)造力來大干一場(chǎng),然后在一次偶然中發(fā)現(xiàn)已經(jīng)有人實(shí)現(xiàn)了,而且成果還吊打我們。
經(jīng)歷多了之后,就要開始明白,站在巨人的肩膀上重要性。
對(duì)于這些已經(jīng)被前人解決的問題,我們就開始放手,收起好奇心,用庫去解決它,把我們的精力放在最重要的專業(yè)方向上,放在算法上,放在數(shù)學(xué)上。
正文
實(shí)現(xiàn)之前,先準(zhǔn)備參考資料:
野火的FreeRtos消息隊(duì)列實(shí)現(xiàn)教程
正點(diǎn)原子的FreeRtos消息隊(duì)列實(shí)現(xiàn)教程
安富萊的FreeRtos消息隊(duì)列實(shí)現(xiàn)教程
硬件平臺(tái):GD32F407 ,
軟件平臺(tái):已經(jīng)移植好的FreeRtos模板工程。
寫代碼并沒有花費(fèi)太多的時(shí)間,大量的時(shí)間花在了代碼的設(shè)計(jì)框架上,終于有了一個(gè)好的構(gòu)思。
先分享一下心路歷程。
- 一開始,我在驅(qū)動(dòng)和應(yīng)用如何分層這個(gè)問題上花費(fèi)了大量時(shí)間,依然是差臨門一腳,只悟得了,
驅(qū)動(dòng)層只需要關(guān)心硬件的初始化以及相關(guān)驅(qū)動(dòng)函數(shù),給上層提供api接口就可以了,驅(qū)動(dòng)層不應(yīng)該包含任何應(yīng)用代碼,給應(yīng)用層最大的發(fā)揮空間。
應(yīng)用層則應(yīng)該使用底層提供的api函數(shù)來實(shí)現(xiàn)相應(yīng)功能,在應(yīng)用層應(yīng)該不包含任何硬件依賴。
但是我深陷復(fù)用的坑,我不僅考慮當(dāng)前工程里的驅(qū)動(dòng)如何應(yīng)用到其他工程中,當(dāng)前工程的應(yīng)用又有哪些可以復(fù)用為中間庫,如何讓大部分的代碼都可以任意移植,以此來滿足我懶惰的心。
于是,當(dāng)我把所有的東西都復(fù)用起來,
驅(qū)動(dòng)層有Hal庫的我已經(jīng)無需做庫,沒有Hal庫的,所有的寄存器都要考慮,因?yàn)槟慵热幌胍鲆粋€(gè)Hal庫,你當(dāng)然應(yīng)該支持硬件的所有配置方式,因此,這驅(qū)動(dòng)層復(fù)用完全不現(xiàn)實(shí)(我又不是)。
應(yīng)用層方面,又想著適應(yīng)所有的rtos,又想著支持各種不同的硬件,好的拓展性,等等。
總之,差點(diǎn)給自己想瘋了。
- 后面由于項(xiàng)目原因,我需要把uart的接收數(shù)據(jù)通過消息隊(duì)列傳給對(duì)應(yīng)的任務(wù),因此,我做了一個(gè)流程圖來捋清自己的邏輯,
在作圖的時(shí)候,
一邊思考如何把應(yīng)用和驅(qū)動(dòng)的分層,
一邊思考linux的應(yīng)用和驅(qū)動(dòng)分層徹底到是兩個(gè)進(jìn)程,
一邊思考任務(wù)與中斷程序之間通過消息隊(duì)列通信。
于是,在靈感來了,我仿造linux的驅(qū)動(dòng)應(yīng)用分層,在rtos中把驅(qū)動(dòng)與應(yīng)用分為兩個(gè)任務(wù),我又參考消息隊(duì)列中的任務(wù)間通信,
把硬件的中斷函數(shù)看成是一個(gè)任務(wù),然后再把硬件中斷獲得的數(shù)據(jù)通過回調(diào)函數(shù)傳給應(yīng)用層。如此,就完成了所有的步驟,
把數(shù)據(jù)傳回給應(yīng)用層,
把(收到數(shù)據(jù))消息傳回給應(yīng)用層,
驅(qū)動(dòng)與應(yīng)用層并不會(huì)互相打斷各自的流程。
最終的流程圖結(jié)果為(該圖就很明顯的看出來,任務(wù)與中斷的相似之處):

如此一來,這次徹底做到了驅(qū)動(dòng)與應(yīng)用的分層,代碼實(shí)現(xiàn)了,如果這套程序需要換平臺(tái),那么只需要freertos接口文件更改,底層驅(qū)動(dòng)更改,應(yīng)用層無需任何改動(dòng)。
而這也確實(shí)是我想了很久打算做的東西,仔細(xì)分析,這套程序其實(shí)代碼上可以復(fù)用的東西確實(shí)不多,驅(qū)動(dòng)層沒有任何復(fù)用的可能性,應(yīng)用層高度依賴不好拆分,但是千里之行始于足下,來日方長。
總結(jié)
這次實(shí)現(xiàn)的功能是契合FreeRtos的串口處理程序,舉一反三,所有的硬件驅(qū)動(dòng)處理,在所有的rtos上,都是類似的,從現(xiàn)在起,我的應(yīng)用驅(qū)動(dòng)分層才算是真正的登堂入室,rtos之路才算是正式開始。
撒花,慶祝!??!
浙公網(wǎng)安備 33010602011771號(hào)