人狗畜禽COMPANY LIMITED|全是肉的高H文〈男男〉|全篇肉高H秘书被C办公室四爱|全黄H全肉共妻|全黄H全肉短篇禁乱NP慕浅浅|全黄H全肉短篇N男男

技術熱線: 4007-888-234
設計開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享

技術支持

從全面的產(chǎn)品導入到強大技術支援服務 全程貼心伴隨服務,創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機資訊,行業(yè)消息以及公司新聞動態(tài)

單片機開發(fā):3種驅動器設計技術

更新時間: 2020-07-30
閱讀量:3489

單片機開發(fā)人員需要掌握的一項基本技能是,了解如何編寫驅動程序。在嵌入式系統(tǒng)中,通常有兩種類型的驅動程序:單片機外圍設備驅動程序和通過I2C,SPI或UART等接口連接的外部設備驅動程序。

如今,在許多情況下,單片機供應商都提供了其芯片的示例驅動程序,這些驅動程序可以按原樣使用,或者可能需要進行生產(chǎn)修改。外部驅動程序可能包含偽代碼,但是單片機開發(fā)人員幾乎總是自己編寫驅動程序。

針對這個問題,重要的是要意識到,我們有多種方法可以編寫驅動程序,并且編寫驅動程序的方式會極大地影響系統(tǒng)性能,能耗以及我們在開發(fā)產(chǎn)品時希望跟蹤的許多其他因素。在本文中,英銳恩單片機開發(fā)工程師將探討幾種常見的單片機驅動程序設計模式,以及它們如何影響應用程序代碼。

20200724163239.png

一、輪詢驅動程序

首先是開發(fā)驅動程序,用于對外圍設備進行輪詢以查看其是否準備發(fā)送或接收信息。輪詢驅動程序非常易于實現(xiàn),因為它們通常只輪詢標志而已。例如,模數(shù)轉換器(ADC)驅動程序可能會啟動轉換序列,然后簡單地阻止處理器執(zhí)行并不斷檢查ADC完成標志。這段代碼如下所示:

Adc_Start();
while(ADC_COMPLETE_FLAG == FALSE);
AdcResults = Adc_ReadAll();
return AdcResults;


如上面的案例,代碼不斷輪詢ADC_COMPLETE_FLAG,大概將其映射到硬件位,以查看何時有數(shù)據(jù)可用。在將這樣的硬件測試稱為輪詢時,它會產(chǎn)生一些值得討論的特性。

首先,當我們有一個使用輪詢的驅動程序時,在大多數(shù)實現(xiàn)中,該驅動程序將成為阻塞驅動程序。這意味著一旦調用驅動程序,它將不會從驅動程序返回,直到獲得所需的結果為止。在其他實現(xiàn)中,我們只需讓驅動程序檢查一次結果然后返回即可。在這種情況下,應用程序負責輪詢驅動程序,我們將認為驅動程序是非阻塞的。從設計的角度來看,由開發(fā)人員決定應在何處進行輪詢。在驅動程序中可以減輕應用程序的負擔,但是如果應用程序這樣做,則可以靈活地執(zhí)行其他活動并以較低的速率輪詢驅動程序。

接下來,一般來說,輪詢非常容易實現(xiàn)。通常,開發(fā)人員所需要做的就是觀察寄存器中的幾位并監(jiān)視它們,以決定何時與設備進行交互。最后,雖然易于實現(xiàn),但通常認為輪詢效率低下。其他技術(例如使用中斷)僅在需要執(zhí)行某些操作時才通知CPU,這會使輪詢效率非常低下。我經(jīng)常將民意調查與一個長途旅行中坐車的孩子不斷詢問“我們到了嗎?”聯(lián)系起來。輪詢不斷問:“你準備好了嗎?現(xiàn)在怎么樣?現(xiàn)在?”。

這使我們可以使用中斷來實現(xiàn)更高效但稍微復雜的驅動程序。

二、中斷驅動程序

在驅動程序中使用中斷非常有用,因為它可以大大提高代碼執(zhí)行效率。中斷告訴處理器現(xiàn)在已經(jīng)準備好驅動程序,而我們跳轉以處理該中斷,而不是不斷檢查是否該做某事。通常,我們可以使用兩種類型的中斷驅動程序機制:事件驅動程序和調度程序。當外圍設備中發(fā)生需要處理的事件時,事件驅動的驅動程序將觸發(fā)中斷。例如,我們可能有一個UART驅動程序,當在緩沖區(qū)中接收到新字符時,該驅動程序將觸發(fā)中斷。另一方面,我們可能有一個ADC驅動器,該驅動器使用計時器來安排訪問以開始采樣或處理接收到的數(shù)據(jù)。

使用中斷驅動的驅動程序雖然效率更高,但可能會增加設計的實現(xiàn)復雜性。首先,單片機開發(fā)人員需要啟用適當?shù)闹袛嘁栽隍寗映绦蛑惺褂?,例如接收,發(fā)送和緩沖區(qū)已滿。我通常發(fā)現(xiàn),由于現(xiàn)代中斷控制器的復雜性,單片機開發(fā)人員很難使中斷起作用。它們通常需要在外圍設備級別的通用寄存器中設置中斷,然后有時甚至需要配置優(yōu)先級和其他設置。幾年前,我整理了有關配置中斷的分步指南,可以在此處下載。

接下來,使用中斷可能會導致需要遵循一些額外的因素。例如:

1.中斷時間短;
2.將共享變量聲明為volatile;
3.處理高優(yōu)先級項目,然后卸載到應用程序進行處理。

誰都不想在驅動程序中發(fā)生事件時,執(zhí)行數(shù)千行代碼的中斷。相反,應該處理的是關鍵任務,例如從UART緩沖區(qū)中提取字符并將其放入應用程序的循環(huán)緩沖區(qū)中。

最后,我們還需要擔心諸如中斷被禁用,中斷時序和運行速率,優(yōu)先級以及是否有可能錯過中斷之類的問題。盡管其中一些項目似乎不值得付出額外的復雜性,但執(zhí)行時間的改善卻是巨大的。例如,電池供電的設備可以進入深度睡眠模式,僅喚醒后將字符存儲在緩沖區(qū)中,然后返回睡眠狀態(tài)。這樣做可以節(jié)省大量的電量。

在某些情況下,在驅動程序中使用中斷確實是處理外圍事件的最佳方法。例如,您可以編寫一個輪詢的I2C驅動程序,但編寫一個在傳輸序列中發(fā)生的不同事件(如ack,nack等)時中斷的驅動程序,則驅動程序將更干凈,更小,更高效。

三、DMA驅動的驅動程序

有些驅動程序會通過I2S和SDIO等系統(tǒng)移動大量數(shù)據(jù)。在這些類型的接口上管理緩沖區(qū)可能需要CPU不斷采取措施。如果CPU落后或必須處理其他系統(tǒng)事件,則數(shù)據(jù)可能會丟失或延遲,這可能會給用戶帶來明顯的問題,例如音頻跳躍。與吞吐量相關的開發(fā)人員可以改用DMA控制器在單片機中為CPU移動數(shù)據(jù)。

這些驅動程序背后的想法是,DMA控制器可以通過以下方式在單片機周圍移動數(shù)據(jù):

(1)外圍到內存;
(2)內存到內存;
(3)內存到外圍。

使用DMA的好處是,當DMA通道為驅動程序移動數(shù)據(jù)時,CPU可以關閉其他操作,本質上可以同時完成兩件事。

迫切需要在驅動程序中使用DMA控制器以減少執(zhí)行CPU的需要,但大多數(shù)單片機具有有限數(shù)量的可用DMA通道。因此,不能將每個驅動程序都編寫為使用DMA。取而代之的是,開發(fā)人員需要選擇帶寬受限的外圍設備,這些外圍設備將受益于DMA,例如外部存儲器,ADC和通信通道的接口。

在沒有I2S或SDIO的應用程序中,開發(fā)人員可以使用DMA將傳入的UART字符移動到循環(huán)緩沖區(qū)中,一旦設置了特定限制,該緩沖區(qū)將被處理??梢酝ㄟ^輪詢應用程序結構或通過DMA控制器設置中斷來監(jiān)視此限制。您可以想象,DMA驅動程序是驅動程序最有效的實現(xiàn),但是根據(jù)開發(fā)人員的技術水平以及他們以前是否使用過DMA,實現(xiàn)起來也可能很復雜。但是,單片機開發(fā)人員可以嘗試在其驅動程序中使用DMA。

結論

在本文中,我們研究了嵌入式開發(fā)人員可以用來為單片機外圍設備和外部設備編寫驅動程序的三種主要技術。為了比較地總結這些技術,下表為我們討論的每種技術以及實現(xiàn)的相對復雜性和執(zhí)行效率。

20200730111732.png

通常,除非使用的外設速度很快(即幾Mbps),否則開發(fā)人員默認情況下應在輪詢實現(xiàn)上使用中斷驅動程序實現(xiàn)。DMA可以用于任何驅動程序,但是我通常為需要高吞吐量的接口(例如外部存儲器或通信接口)保留DMA通道。但是,怎么選擇在很大程度上取決于最終應用程序。

以上就是英銳恩單片機開發(fā)工程師分享的3種驅動器設計技術。英銳恩專注單片機應用方案設計與開發(fā),提供8位單片機、16位單片機、32位單片機、運放芯片和模擬開關。

齐齐哈尔市| 新兴县| 彭阳县| 金溪县| 彭泽县| 屏边| 云霄县| 齐齐哈尔市| 仙桃市| 烟台市| 蓬安县| 威海市| 叙永县| 白山市| 逊克县| 南丹县| 绥阳县| 特克斯县| 西平县| 青川县| 阿合奇县| 翁牛特旗| 巩留县| 建宁县| 凉城县| 玛曲县| 将乐县| 通渭县| 廊坊市| 福清市| 黄龙县| 乐至县| 平陆县| 克山县| 彭州市| 额济纳旗| 屯留县| 昆山市| 舞钢市| 南川市| 名山县|