中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

技術(shù)熱線: 4007-888-234
設(shè)計(jì)開(kāi)發(fā)

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

開(kāi)發(fā)工具

提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享

技術(shù)支持

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

新品推廣

提供新的芯片及解決方案,提升客戶(hù)產(chǎn)品競(jìng)爭(zhēng)力

新聞中心

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

單片機(jī)開(kāi)發(fā):3種驅(qū)動(dòng)器設(shè)計(jì)技術(shù)

更新時(shí)間: 2020-07-30
閱讀量:3150

單片機(jī)開(kāi)發(fā)人員需要掌握的一項(xiàng)基本技能是,了解如何編寫(xiě)驅(qū)動(dòng)程序。在嵌入式系統(tǒng)中,通常有兩種類(lèi)型的驅(qū)動(dòng)程序:?jiǎn)纹瑱C(jī)外圍設(shè)備驅(qū)動(dòng)程序和通過(guò)I2C,SPI或UART等接口連接的外部設(shè)備驅(qū)動(dòng)程序。

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

針對(duì)這個(gè)問(wèn)題,重要的是要意識(shí)到,我們有多種方法可以編寫(xiě)驅(qū)動(dòng)程序,并且編寫(xiě)驅(qū)動(dòng)程序的方式會(huì)極大地影響系統(tǒng)性能,能耗以及我們?cè)陂_(kāi)發(fā)產(chǎn)品時(shí)希望跟蹤的許多其他因素。在本文中,英銳恩單片機(jī)開(kāi)發(fā)工程師將探討幾種常見(jiàn)的單片機(jī)驅(qū)動(dòng)程序設(shè)計(jì)模式,以及它們?nèi)绾斡绊憫?yīng)用程序代碼。

20200724163239.png

一、輪詢(xún)驅(qū)動(dòng)程序

首先是開(kāi)發(fā)驅(qū)動(dòng)程序,用于對(duì)外圍設(shè)備進(jìn)行輪詢(xún)以查看其是否準(zhǔn)備發(fā)送或接收信息。輪詢(xún)驅(qū)動(dòng)程序非常易于實(shí)現(xiàn),因?yàn)樗鼈兺ǔV惠喸?xún)標(biāo)志而已。例如,模數(shù)轉(zhuǎn)換器(ADC)驅(qū)動(dòng)程序可能會(huì)啟動(dòng)轉(zhuǎn)換序列,然后簡(jiǎn)單地阻止處理器執(zhí)行并不斷檢查ADC完成標(biāo)志。這段代碼如下所示:

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


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

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

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

這使我們可以使用中斷來(lái)實(shí)現(xiàn)更高效但稍微復(fù)雜的驅(qū)動(dòng)程序。

二、中斷驅(qū)動(dòng)程序

在驅(qū)動(dòng)程序中使用中斷非常有用,因?yàn)樗梢源蟠筇岣叽a執(zhí)行效率。中斷告訴處理器現(xiàn)在已經(jīng)準(zhǔn)備好驅(qū)動(dòng)程序,而我們跳轉(zhuǎ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ū)中接收到新字符時(shí),該驅(qū)動(dòng)程序?qū)⒂|發(fā)中斷。另一方面,我們可能有一個(gè)ADC驅(qū)動(dòng)器,該驅(qū)動(dòng)器使用計(jì)時(shí)器來(lái)安排訪問(wèn)以開(kāi)始采樣或處理接收到的數(shù)據(jù)。

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

接下來(lái),使用中斷可能會(huì)導(dǎo)致需要遵循一些額外的因素。例如:

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

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

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

在某些情況下,在驅(qū)動(dòng)程序中使用中斷確實(shí)是處理外圍事件的最佳方法。例如,您可以編寫(xiě)一個(gè)輪詢(xún)的I2C驅(qū)動(dòng)程序,但編寫(xiě)一個(gè)在傳輸序列中發(fā)生的不同事件(如ack,nack等)時(shí)中斷的驅(qū)動(dòng)程序,則驅(qū)動(dòng)程序?qū)⒏蓛?,更小,更高效?br/>
三、DMA驅(qū)動(dòng)的驅(qū)動(dòng)程序

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

這些驅(qū)動(dòng)程序背后的想法是,DMA控制器可以通過(guò)以下方式在單片機(jī)周?chē)苿?dòng)數(shù)據(jù):

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

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

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

在沒(méi)有I2S或SDIO的應(yīng)用程序中,開(kāi)發(fā)人員可以使用DMA將傳入的UART字符移動(dòng)到循環(huán)緩沖區(qū)中,一旦設(shè)置了特定限制,該緩沖區(qū)將被處理。可以通過(guò)輪詢(xún)應(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ā)人員的技術(shù)水平以及他們以前是否使用過(guò)DMA,實(shí)現(xiàn)起來(lái)也可能很復(fù)雜。但是,單片機(jī)開(kāi)發(fā)人員可以嘗試在其驅(qū)動(dòng)程序中使用DMA。

結(jié)論

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

20200730111732.png

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

以上就是英銳恩單片機(jī)開(kāi)發(fā)工程師分享的3種驅(qū)動(dòng)器設(shè)計(jì)技術(shù)。英銳恩專(zhuān)注單片機(jī)應(yīng)用方案設(shè)計(jì)與開(kāi)發(fā),提供8位單片機(jī)、16位單片機(jī)、32位單片機(jī)、運(yùn)放芯片和模擬開(kāi)關(guān)。

扎兰屯市| 无锡市| 六安市| 华容县| 清原| 廊坊市| 东乡族自治县| 龙口市| 贵德县| 蒲江县| 五河县| 潼南县| 巴青县| 万山特区| 醴陵市| 宣化县| 宁河县| 惠来县| 孟州市| 宣化县| 泾阳县| 望都县| 县级市| 玛曲县| 广汉市| 迁西县| 美姑县| 察哈| 贵阳市| 阳新县| 富川| 灵山县| 沂源县| 黔西县| 方山县| 当雄县| 台湾省| 东乡族自治县| 呼和浩特市| 建昌县| 万安县|