1. gzyueqian
      13352868059

      嵌入式開發(fā):使用中斷的7個(gè)技巧

      更新時(shí)間: 2022-10-07 09:39:08來源: 粵嵌教育瀏覽量:9075

        傳統(tǒng)上,程序員和組織對(duì)使用中斷有一種不合理的恐懼。如果沒有遵循正確的中斷實(shí)現(xiàn),系統(tǒng)肯定會(huì)發(fā)生奇怪的事情。那么,嵌入式開發(fā)人員怎樣才能確保中斷被正確地實(shí)現(xiàn),并按照預(yù)期的那樣被利用呢?

        技巧1——?jiǎng)?chuàng)建ISR表

        中斷服務(wù)例程表是一個(gè)數(shù)組,包含微控制器上可能發(fā)生的所有中斷的列表。每個(gè)中斷都由中斷發(fā)生時(shí)執(zhí)行的函數(shù)(指向函數(shù)的指針)填充,這樣做有很多好處。首先,將一個(gè)函數(shù)調(diào)用分配給一個(gè)中斷變得非常容易。只需更改表中的函數(shù)名,重新編譯,現(xiàn)在中斷發(fā)生時(shí)該函數(shù)將被調(diào)用。

        接下來,程序員為每個(gè)中斷包含一個(gè)函數(shù),這是一個(gè)很好的實(shí)踐,因?yàn)槊總€(gè)中斷都是用代碼初始化的!在調(diào)試期間,如果發(fā)生了錯(cuò)誤的中斷,而不是跳開并執(zhí)行未知代碼,則可以改為執(zhí)行“DummyISR”,這讓錯(cuò)誤的中斷被捕獲和調(diào)試。最后,以這種方式使用中斷表迫使中斷代碼采取易于理解和配置的有組織的結(jié)構(gòu)。

        有許多不同的方法可以實(shí)現(xiàn)該表。最常見的是通過使用#pragma。這允許將表放在閃存中的特定存儲(chǔ)位置。最常見的兩種實(shí)現(xiàn)是允許指定閃存位置的起始地址或定義鏈接器內(nèi)存標(biāo)簽。嵌入式開發(fā)人員應(yīng)該盡量避免使用#pragma,但是如果這是實(shí)現(xiàn)中斷表的唯一方法,那么這將是一個(gè)很好的例外。

        

        技巧2——保持簡(jiǎn)短快速

        根據(jù)定義,中斷是對(duì)正在執(zhí)行的應(yīng)用程序的正常流程的中斷。為了處理中斷,程序?qū)嶋H上停止了正在做的任何事情。在這種情況下,中斷服務(wù)程序顯然應(yīng)該簡(jiǎn)短扼要,以便主應(yīng)用程序可以繼續(xù)執(zhí)行。

        中斷的真正目的是處理需要系統(tǒng)注意的緊急事件。為了保持日常工作的簡(jiǎn)短,只做當(dāng)時(shí)真正需要做的最少的事情。例如,如果通信數(shù)據(jù)觸發(fā)中斷,將數(shù)據(jù)放入緩沖區(qū),設(shè)置一個(gè)標(biāo)志,讓主程序處理數(shù)據(jù),不要試圖在中斷中處理它!

        保持代碼簡(jiǎn)短而快速有時(shí)會(huì)有欺騙性。例如,做一個(gè)簡(jiǎn)單的浮點(diǎn)計(jì)算(只有一行代碼)可能看起來很短,但是一個(gè)沒有硬件浮點(diǎn)單元的微控制器可能會(huì)花費(fèi)嵌入式開發(fā)人員很長(zhǎng)的時(shí)間來處理數(shù)學(xué)運(yùn)算(也可能是毫秒)!有幾個(gè)簡(jiǎn)單的規(guī)則可以確保中斷服務(wù)程序快速運(yùn)行:

        l 不要從你的中斷中調(diào)用函數(shù)(除非它們是內(nèi)聯(lián)函數(shù)),函數(shù)調(diào)用開銷會(huì)浪費(fèi)你的時(shí)間。

        l 任何處理器密集型活動(dòng),如處理數(shù)據(jù)緩沖區(qū)、執(zhí)行計(jì)算等,都應(yīng)該設(shè)置一個(gè)標(biāo)志,并讓主應(yīng)用程序進(jìn)行處理。

        l 應(yīng)該避免Wait語句。

        l 也應(yīng)該避免循環(huán)或任何時(shí)間密集型邏輯,如循環(huán)、除法或模數(shù)運(yùn)算。

        技巧3——仔細(xì)檢查你的初始化

        出于這樣或那樣的原因,中斷似乎總是讓正常工作變得很痛苦,它們?cè)诟拍钌鲜侵苯亓水?dāng)?shù)模行?shí)現(xiàn)需要大量的前瞻性思考才能正確。在設(shè)置和調(diào)試中斷時(shí),嵌入式開發(fā)人員應(yīng)該問一些問題。其中一些看起來很簡(jiǎn)單,但是仍然應(yīng)該檢查和詢問。

        中斷是否啟用?(當(dāng)然,我以為我啟用了它,但是MCU寄存器顯示什么?)

        是否設(shè)置了中斷的優(yōu)先級(jí)?

        ISR在中斷表中的位置是否正確?

        中斷是否映射到正確的硬件引腳?到正確的外圍設(shè)備?

        中斷是否盡快得到確認(rèn)?

        ISR中的中斷標(biāo)志是否在正確的時(shí)間被清除?

        技巧4——盡可能少地禁用中斷

        禁用中斷可能是一項(xiàng)極其危險(xiǎn)的工作。禁用中斷會(huì)導(dǎo)致錯(cuò)過應(yīng)該處理的中斷!為什么會(huì)有人想要禁用中斷呢?有時(shí)候,開發(fā)人員希望在不中斷的情況下自動(dòng)運(yùn)行某些代碼部分。允許發(fā)生可能會(huì)改變計(jì)算中使用的變量的中斷可能會(huì)導(dǎo)致災(zāi)難!因此,嵌入式開發(fā)人員可能會(huì)在“臨界區(qū)”之前禁用中斷,在啟用中斷之前執(zhí)行計(jì)算或運(yùn)行代碼。

        現(xiàn)代32位處理器有助于最小化禁用中斷的需求,如果可能的話,當(dāng)然應(yīng)該不惜一切代價(jià)避免這樣做。但是,如果發(fā)現(xiàn)需要,安全禁用中斷是一個(gè)很好的起點(diǎn),可以安全地做到這一點(diǎn)。禁用中斷前,應(yīng)讀取并保存中斷的當(dāng)前狀態(tài)。關(guān)鍵代碼段在將中斷狀態(tài)恢復(fù)到之前的狀態(tài)運(yùn)行。

        

        技巧5——對(duì)共享變量使用volatile

        在ISR中遇到的最大錯(cuò)誤之一是共享變量處理不當(dāng)。一個(gè)中斷可能被用來填充一個(gè)緩沖區(qū)或者修改一個(gè)被應(yīng)用程序其余部分使用的變量。如果應(yīng)用程序?qū)⒁褂眠@個(gè)變量,并且中斷觸發(fā)并更新這個(gè)變量,應(yīng)用程序可能仍然使用舊的值!這當(dāng)然會(huì)導(dǎo)致系統(tǒng)潛在的一些不可預(yù)測(cè)的行為。

        C語言有一個(gè)名為volatile的關(guān)鍵字,其目的是在每次使用時(shí)強(qiáng)制重新讀取變量。每當(dāng)變量可能被程序正常運(yùn)行時(shí)之外的進(jìn)程修改時(shí),嵌入式開發(fā)人員就可以使用它。它通常在訪問硬件寄存器時(shí)使用。硬件可以在程序不知道的情況下改變存儲(chǔ)的值,所以內(nèi)存映射變量被聲明為volatile。由于中斷可以在程序不知道的情況下隨時(shí)改變值,所以與ISR共享的變量也應(yīng)該聲明為volatile。

        技巧6——了解ISR的時(shí)間安排

        微控制器最常用于具有硬實(shí)時(shí)或至少軟實(shí)時(shí)要求的實(shí)時(shí)系統(tǒng)。以簡(jiǎn)單的上下文切換到中斷為例。這可能需要四到二十個(gè)時(shí)鐘周期。這似乎不值得一提,但事實(shí)上情況可能更糟!對(duì)于以8 MHz運(yùn)行的微控制器,這可能是500到2500納秒的延遲。這只是一個(gè)上下文切換到中斷!離開中斷的時(shí)候還有一個(gè)!

        上下文切換計(jì)時(shí)值得理解,但更有趣的是中斷運(yùn)行時(shí)的剩余部分。開發(fā)人員的代碼運(yùn)行需要多長(zhǎng)時(shí)間?畢竟,這才是真正可以改變和控制的部分。就像應(yīng)用程序的其余部分一樣,理解這種時(shí)序的最簡(jiǎn)單方法是在ISR的開始和結(jié)束時(shí)切換anI/O位,這可以讓開發(fā)人員了解中斷時(shí)序。

        嵌入式開發(fā)人員確實(shí)需要了解周期性和異步中斷發(fā)生的頻率,這樣他們才能確保程序的其余部分有機(jī)會(huì)運(yùn)行。了解中斷是否有可能同時(shí)發(fā)生,以及它們是否了解一次完成和下一次運(yùn)行之間的延遲,也很重要。嵌套中斷會(huì)極大地影響系統(tǒng)的運(yùn)行,為了實(shí)現(xiàn)實(shí)時(shí)性能,工程師需要了解與時(shí)序相關(guān)的電位問題。

        

        技巧7——利用中斷驅(qū)動(dòng)架構(gòu)

        越來越多的應(yīng)用程序正在走向移動(dòng)化,并依賴電池為它們提供運(yùn)行時(shí)電源。為了最大化電池壽命和運(yùn)行時(shí)間,微控制器需要盡可能多的時(shí)間處于睡眠狀態(tài)。最好的方法是利用中斷驅(qū)動(dòng)架構(gòu)。在這種架構(gòu)中,系統(tǒng)處于非常低的功耗狀態(tài),微控制器內(nèi)核基本上處于關(guān)閉狀態(tài),這在輪詢系統(tǒng)中是無法實(shí)現(xiàn)的,然后系統(tǒng)被一個(gè)中斷喚醒,這可能是一個(gè)外部事件或內(nèi)部計(jì)時(shí)器。系統(tǒng)醒來,做它需要做的事情,然后回到睡眠狀態(tài)。

        目前可用的微控制器架構(gòu)有一些很好的技巧,可以用來幫助最大限度地延長(zhǎng)低功耗模式下的時(shí)間。例如,通過使用中斷來喚醒系統(tǒng),可以確保只有一個(gè)事件可以喚醒系統(tǒng),但更重要的是,系統(tǒng)可以設(shè)置為不會(huì)發(fā)生到中斷的上下文切換!系統(tǒng)在中斷中喚醒,然后使用一種特殊的模式,稱為“休眠退出”,一旦中斷完成,系統(tǒng)立即返回休眠狀態(tài)!

        這些只是一些技巧,可以幫助任何開發(fā)人員在調(diào)用中斷時(shí)做出正確的選擇。當(dāng)然,有些時(shí)候需要使用輪詢技術(shù),但是當(dāng)中斷是合理的并且具有設(shè)計(jì)意義時(shí),嵌入式開發(fā)人員使用這些技巧來確保正確設(shè)置中斷,這將節(jié)省大量的時(shí)間和調(diào)試基于中斷的系統(tǒng)的麻煩。

      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 一本大道香蕉精品视频在线 | 伊人大杳蕉久久综合 | 最新国产自产视频在线观看 | 欧洲一区二区免费视频在线观看网站 | 日本色婷婷在线观看网站 | 亚洲精品国产自在现线最新 |