• 招生咨詢熱線:4008-569-579 
  • 手機(jī)版
    用手機(jī)掃描二維碼直達(dá)商品手機(jī)版
招生咨詢熱線
4008-569-579
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料 > 嵌入式開(kāi)發(fā):微控制器的3種驅(qū)動(dòng)程序設(shè)計(jì)技術(shù)
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料>嵌入式開(kāi)發(fā):微控制器的3種驅(qū)動(dòng)程序設(shè)計(jì)技術(shù)

嵌入式開(kāi)發(fā):微控制器的3種驅(qū)動(dòng)程序設(shè)計(jì)技術(shù)

來(lái)源:廣州達(dá)內(nèi)教育        時(shí)間:2023-05-30        熱度:22℃        返回列表

  嵌入式軟件開(kāi)發(fā)人員需要掌握的一項(xiàng)基本技能是理解如何編寫(xiě)驅(qū)動(dòng)程序。在嵌入式系統(tǒng)中,通常有兩種類型的驅(qū)動(dòng)程序:微控制器外圍驅(qū)動(dòng)程序和通過(guò)I2C、SPI或UART等接口連接的外部設(shè)備驅(qū)動(dòng)程序。在今天的許多情況下,微控制器供應(yīng)商為他們的芯片提供了示例驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序可以按原樣使用,或者可能需要修改以用于生產(chǎn)。外部驅(qū)動(dòng)程序可能包括偽代碼,但嵌入式開(kāi)發(fā)人員幾乎總是自己負(fù)責(zé)編寫(xiě)驅(qū)動(dòng)程序。


  重要的是要認(rèn)識(shí)到,編寫(xiě)驅(qū)動(dòng)程序的方法不止一種,而且它的編寫(xiě)方式會(huì)極大地影響系統(tǒng)性能、能耗以及我們?cè)陂_(kāi)發(fā)產(chǎn)品時(shí)喜歡跟蹤的許多其他因素。在本文中,我們將研究幾種常見(jiàn)的驅(qū)動(dòng)程序設(shè)計(jì)模式,以及它們?nèi)绾斡绊憫?yīng)用程序代碼。我們將從基本模式開(kāi)始,并致力于更復(fù)雜的模式。


  技術(shù)1:輪詢驅(qū)動(dòng)程序


  第一種技術(shù),也是最基本的技術(shù),是開(kāi)發(fā)一個(gè)驅(qū)動(dòng)程序,輪詢外圍設(shè)備(或外部設(shè)備),查看它是否準(zhǔn)備好發(fā)送或接收信息。輪詢驅(qū)動(dòng)程序非常容易實(shí)現(xiàn),因?yàn)樗鼈兺ǔV惠喸円粋€(gè)標(biāo)志。例如,模數(shù)轉(zhuǎn)換器(ADC)驅(qū)動(dòng)程序可能啟動(dòng)轉(zhuǎn)換序列,然后簡(jiǎn)單地阻止處理器執(zhí)行,并不斷檢查ADC完成標(biāo)志。此代碼類似于以下內(nèi)容:


  首先,當(dāng)我們有一個(gè)使用輪詢的驅(qū)動(dòng)程序時(shí),在大多數(shù)實(shí)現(xiàn)中,該驅(qū)動(dòng)程序?qū)⑹且粋€(gè)阻塞驅(qū)動(dòng)程序。這意味著一旦我們調(diào)用驅(qū)動(dòng)程序,它將不會(huì)從驅(qū)動(dòng)程序返回,直到我們得到所需的結(jié)果。還有其他一些實(shí)現(xiàn),我們可以讓驅(qū)動(dòng)程序檢查一次結(jié)果,然后返回。在這種情況下,應(yīng)用程序負(fù)責(zé)輪詢驅(qū)動(dòng)程序,我們將考慮驅(qū)動(dòng)程序是非阻塞的。從設(shè)計(jì)的角度來(lái)看,應(yīng)該由嵌入式開(kāi)發(fā)人員來(lái)決定輪詢應(yīng)該在哪里進(jìn)行。在驅(qū)動(dòng)程序中,可以減少應(yīng)用程序不得不這樣做,但如果應(yīng)用程序這樣做,則可以靈活地執(zhí)行其他活動(dòng)并以較低的速率輪詢驅(qū)動(dòng)程序。


  其次,一般來(lái)說(shuō),輪詢非常容易實(shí)現(xiàn)。通常,開(kāi)發(fā)人員所需要做的就是觀察寄存器中的一些位并監(jiān)視它們,以決定何時(shí)與設(shè)備交互。最后,雖然輪詢很容易實(shí)現(xiàn),但通常被認(rèn)為效率低下。其他技術(shù),例如使用中斷,可以在需要執(zhí)行某些操作時(shí)通知CPU,這使得輪詢效率相當(dāng)?shù)汀?/span>


  這給我們帶來(lái)了一個(gè)更高效但稍微復(fù)雜的驅(qū)動(dòng)程序?qū)崿F(xiàn),即使用中斷。




  技術(shù):2–中斷驅(qū)動(dòng)程序


  在驅(qū)動(dòng)程序中使用中斷非常棒,因?yàn)樗梢詷O大地提高代碼的執(zhí)行效率。中斷告訴處理器驅(qū)動(dòng)程序現(xiàn)在準(zhǔn)備好了,我們跳起來(lái)處理中斷,而不是不斷地檢查是否該做某事。通常,我們可以使用兩種類型的中斷驅(qū)動(dòng)機(jī)制:事件驅(qū)動(dòng)和調(diào)度。當(dāng)外設(shè)中發(fā)生需要處理的事件時(shí),事件驅(qū)動(dòng)驅(qū)動(dòng)程序?qū)⒂|發(fā)中斷。例如,我們可能有一個(gè)UART驅(qū)動(dòng)程序,當(dāng)緩沖區(qū)中接收到一個(gè)新字符時(shí),該驅(qū)動(dòng)程序?qū)⒂|發(fā)一個(gè)中斷。另一方面,我們可能有一個(gè)ADC驅(qū)動(dòng)程序,它使用定時(shí)器來(lái)安排訪問(wèn),以開(kāi)始采樣或處理接收到的數(shù)據(jù)。


  使用中斷驅(qū)動(dòng)驅(qū)動(dòng)程序雖然效率更高,但會(huì)給設(shè)計(jì)增加額外的實(shí)現(xiàn)復(fù)雜性。首先,嵌入式開(kāi)發(fā)人員需要啟用適當(dāng)?shù)闹袛啵员阍隍?qū)動(dòng)程序中使用,例如接收、傳輸和緩沖區(qū)已滿。通常發(fā)現(xiàn),由于現(xiàn)代中斷控制器的復(fù)雜性,開(kāi)發(fā)人員很難讓中斷正常工作。它們通常需要在通用寄存器的外圍級(jí)別設(shè)置中斷,有時(shí)甚至需要配置優(yōu)先級(jí)和其他設(shè)置。


  接下來(lái),中斷的使用可以引入遵循一整套額外的最佳實(shí)踐的需要。例如,最好的做法是:


  —縮短中斷時(shí)間


  —將共享變量聲明為volatile


  —處理高優(yōu)先級(jí)項(xiàng)目,然后卸載到應(yīng)用程序進(jìn)行處理


  當(dāng)事件發(fā)生時(shí),你不希望在驅(qū)動(dòng)程序中有數(shù)千行代碼被執(zhí)行的中斷。相反,你希望處理關(guān)鍵任務(wù),比如從UART緩沖區(qū)中提取一個(gè)字符,并將其放入應(yīng)用程序的循環(huán)緩沖區(qū)中。


  最后,我們還需要擔(dān)心諸如中斷被禁用、中斷時(shí)間和運(yùn)行速率、優(yōu)先級(jí)以及中斷是否可能丟失等問(wèn)題。雖然其中一些項(xiàng)目看起來(lái)額外的復(fù)雜性可能不值得付出努力,但對(duì)執(zhí)行時(shí)間的改進(jìn)可能是巨大的。例如,電池供電的設(shè)備可能進(jìn)入深度睡眠模式,只在醒來(lái)時(shí)將字符存儲(chǔ)在緩沖區(qū)中,然后返回睡眠狀態(tài)。這樣做可以節(jié)省大量能源。


  在某些情況下,在驅(qū)動(dòng)程序中使用中斷實(shí)際上是處理外圍事件的最佳方式。例如,你可以編寫(xiě)輪詢的I2C驅(qū)動(dòng)程序,但編寫(xiě)一個(gè)中斷ack、nack等傳輸序列中發(fā)生的不同事件的I2C驅(qū)動(dòng)程序會(huì)產(chǎn)生更干凈、更小和更高效的驅(qū)動(dòng)程序。




  技術(shù)3:DMA驅(qū)動(dòng)的驅(qū)動(dòng)程序


  有些驅(qū)動(dòng)程序在系統(tǒng)中移動(dòng)大量數(shù)據(jù),如I2S和SDIO。管理這些類型接口上的緩沖區(qū)可能需要CPU的持續(xù)操作。如果CPU落后或必須處理另一個(gè)系統(tǒng)事件,數(shù)據(jù)可能會(huì)丟失或延遲,這可能會(huì)給用戶造成明顯的問(wèn)題,例如音頻跳過(guò)。與吞吐量相關(guān)的嵌入式開(kāi)發(fā)人員可以使用DMA控制器在CPU的微控制器周圍移動(dòng)數(shù)據(jù)。


  這些驅(qū)動(dòng)程序背后的想法是DMA控制器可以通過(guò)以下方式在微控制器周圍移動(dòng)數(shù)據(jù):


  —外圍存儲(chǔ)器


  —內(nèi)存對(duì)內(nèi)存


  —外設(shè)存儲(chǔ)器


  使用DMA的優(yōu)點(diǎn)是,當(dāng)DMA通道為驅(qū)動(dòng)程序移動(dòng)數(shù)據(jù)時(shí),CPU可以停止做其他事情,基本上一次完成兩件事情。


  雖然在驅(qū)動(dòng)程序中使用DMA控制器以減少CPU執(zhí)行的需要是非常理想的,但大多數(shù)微控制器的可用DMA通道數(shù)量有限。因此,不能將每個(gè)驅(qū)動(dòng)程序都寫(xiě)入DMA。相反,開(kāi)發(fā)人員需要選擇帶寬受限且能從DMA中獲益匪淺的外圍設(shè)備,如外部存儲(chǔ)器、ADC和通信通道的接口。


  在沒(méi)有I2S或SDIO的應(yīng)用程序中,開(kāi)發(fā)人員可以使用DMA將傳入的UART字符移動(dòng)到循環(huán)緩沖區(qū)中,一旦設(shè)置了某個(gè)限制,就會(huì)對(duì)該緩沖區(qū)進(jìn)行處理。可以通過(guò)輪詢應(yīng)用程序結(jié)構(gòu)或通過(guò)DMA控制器設(shè)置中斷來(lái)監(jiān)控此限制??梢韵胂?,DMA驅(qū)動(dòng)程序是驅(qū)動(dòng)程序最有效的實(shí)現(xiàn)方式,但根據(jù)開(kāi)發(fā)人員的技能水平以及他們以前是否使用過(guò)DMA,它們的實(shí)現(xiàn)也可能很復(fù)雜。這不應(yīng)該阻止開(kāi)發(fā)者嘗試在他們的驅(qū)動(dòng)程序中使用DMA。


  在本文中,我們研究了嵌入式開(kāi)發(fā)人員可以用來(lái)為微控制器外圍設(shè)備和外部設(shè)備編寫(xiě)驅(qū)動(dòng)程序的三種主要技術(shù)。一般來(lái)說(shuō),開(kāi)發(fā)人員在默認(rèn)情況下應(yīng)該在輪詢實(shí)現(xiàn)上使用中斷驅(qū)動(dòng)程序?qū)崿F(xiàn),除非使用的外圍設(shè)備速度很快,即數(shù)Mbps。DMA可以用于任何驅(qū)動(dòng)程序,但我通常為需要高吞吐量的接口(如外部?jī)?nèi)存或通信接口)保留DMA通道。你選擇的選項(xiàng)將高度依賴于最終應(yīng)用程序。

電話咨詢

電話咨詢

咨詢電話:
4008-569-579
回到頂部

回到頂部