今天使用微控制器的一個(gè)主要優(yōu)勢(shì)是嵌入式軟件開(kāi)發(fā)人員通常不必再編寫(xiě)自己的驅(qū)動(dòng)程序。微控制器供應(yīng)商提供軟件框架來(lái)抽象硬件并允許開(kāi)發(fā)人員進(jìn)行簡(jiǎn)單的函數(shù)調(diào)用來(lái)初始化、讀取和寫(xiě)入外圍設(shè)備(如
SPI、UART、模數(shù)轉(zhuǎn)換器等)是很常見(jiàn)的。然而,嵌入式開(kāi)發(fā)人員仍然經(jīng)常需要編寫(xiě)驅(qū)動(dòng)程序來(lái)與外部集成電路進(jìn)行交互,這些集成電路可能是傳感器、執(zhí)行器、電機(jī)控制器等。在今天的文章中,我們將探討幾個(gè)編寫(xiě)自己的外部設(shè)備驅(qū)動(dòng)程序的最佳實(shí)踐。
最佳實(shí)踐 #1——將實(shí)現(xiàn)與配置分開(kāi)
編寫(xiě)任何驅(qū)動(dòng)程序的一個(gè)關(guān)鍵方面是將實(shí)現(xiàn)與配置分開(kāi)。這種分離有助于確保驅(qū)動(dòng)程序可重用和靈活。例如,驅(qū)動(dòng)程序可以很容易地編譯成一個(gè)目標(biāo)文件,這樣開(kāi)發(fā)人員就看不到內(nèi)部,因此它可以用于多個(gè)項(xiàng)目。開(kāi)發(fā)人員仍然可以訪問(wèn)配置模塊,他們可以使用該模塊來(lái)配置驅(qū)動(dòng)程序以滿足其特定的應(yīng)用程序需求。如果配置需要機(jī)會(huì),它不會(huì)影響驅(qū)動(dòng)程序設(shè)計(jì)或強(qiáng)制使用驅(qū)動(dòng)程序的其他項(xiàng)目不同步或被迫接受新更改并經(jīng)歷驗(yàn)證周期。
將實(shí)現(xiàn)與配置分開(kāi)還允許抽象外部硬件,以便開(kāi)發(fā)人員不需要完全了解硬件中發(fā)生的事情,就像在微控制器上一樣。我經(jīng)常希望集成電路供應(yīng)商停止提供配置工具
GUI,而是花精力為他們的設(shè)備編寫(xiě)可重用和便攜的驅(qū)動(dòng)程序。他們的每個(gè)客戶都很難通過(guò)閱讀大約 100
頁(yè)的數(shù)據(jù)表來(lái)編寫(xiě)驅(qū)動(dòng)程序并理解他們的模塊。
最佳實(shí)踐#2——?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的底層接口
在編寫(xiě)驅(qū)動(dòng)程序時(shí),嵌入式開(kāi)發(fā)人員試圖在他們的實(shí)現(xiàn)中做太多事情,驅(qū)動(dòng)程序成為驅(qū)動(dòng)程序和應(yīng)用程序代碼的混合體,驅(qū)動(dòng)程序的接口應(yīng)該包含一個(gè)簡(jiǎn)單的接口,其中包括:
一個(gè)初始化函數(shù)
寫(xiě)函數(shù)
讀取功能
除此之外的任何東西都真正開(kāi)始進(jìn)入應(yīng)用程序領(lǐng)域!這背后的邏輯很簡(jiǎn)單,驅(qū)動(dòng)程序應(yīng)該簡(jiǎn)單地提供與設(shè)備通信并允許讀取和寫(xiě)入操作的能力,然后,應(yīng)用程序模塊將訪問(wèn)這些讀取和寫(xiě)入功能,以構(gòu)建更高級(jí)別應(yīng)用程序代碼所需的可重用應(yīng)用程序組件。
最佳實(shí)踐#3——提供錯(cuò)誤檢測(cè)
不幸的是,許多嵌入式開(kāi)發(fā)人員編寫(xiě)的代碼只是假設(shè)一切都會(huì)好起來(lái)的,在為外部設(shè)備編寫(xiě)驅(qū)動(dòng)程序時(shí),我們沒(méi)有那么奢侈。設(shè)備驅(qū)動(dòng)程序應(yīng)考慮潛在的錯(cuò)誤和故障。例如驅(qū)動(dòng)程序可以超時(shí)并提供錯(cuò)誤嗎?如果執(zhí)行了讀操作,函數(shù)能否返回讀是否成功?如果發(fā)生奇偶校驗(yàn)錯(cuò)誤怎么辦?
有幾種不同的方法可以在驅(qū)動(dòng)程序中提供錯(cuò)誤和故障檢測(cè)。首先,每個(gè)函數(shù)都可能返回錯(cuò)誤代碼。如果操作成功,則此錯(cuò)誤代碼將簡(jiǎn)單地為真,如果發(fā)生問(wèn)題,則此錯(cuò)誤代碼將簡(jiǎn)單地為假。其次,如果確實(shí)發(fā)生了問(wèn)題,那么可以在設(shè)備接口中添加一個(gè)允許檢查錯(cuò)誤的附加功能,會(huì)包括以下附加操作:
返回驅(qū)動(dòng)錯(cuò)誤狀態(tài)
清除驅(qū)動(dòng)錯(cuò)誤狀態(tài)
同樣,這為驅(qū)動(dòng)程序提供了靈活性和故障檢測(cè)能力,并允許應(yīng)用程序代碼仔細(xì)監(jiān)控驅(qū)動(dòng)程序操作是否成功。
為微控制器之外的集成電路編寫(xiě)設(shè)備驅(qū)動(dòng)程序是嵌入式開(kāi)發(fā)人員的最后一個(gè)前沿領(lǐng)域之一,我們?nèi)匀槐仨毦帉?xiě)自己的驅(qū)動(dòng)程序。在今天的帖子中,我們研究了為外部集成電路編寫(xiě)驅(qū)動(dòng)程序的幾個(gè)最佳實(shí)踐,這些最佳實(shí)踐將幫助讀者開(kāi)發(fā)可擴(kuò)展和可重用的驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序可以檢測(cè)故障并允許應(yīng)用程序代碼做出適當(dāng)?shù)捻憫?yīng)。