AVR 嵌入式單片機芯片的中斷系統介紹

中斷源和中斷向量:
    缺省狀況下,AVR的程序存儲區的最低端,即從Flash地址的0x0000開始用於放置中斷向量,稱作中斷向量區。中斷向量區大小 = 中斷源個數 * 每一箇中斷向量佔據字數。對於Flash比較小的AVR處理器,每一箇中斷向量佔據一個字的空間,用於放置一條相對轉移指令 rjmp(跳轉範圍-2K~+2K),而Flash較大的AVR,每一箇中斷向量佔據兩個字空間,用於放置一條絕對轉移指令 jmp,用於跳轉到相應中斷的中斷服務程序的起始地址。
 
在這21箇中斷中,包含1個非屏蔽中斷(RESET)3個外部中斷(INT0、INT一、INT2)和17個內部中斷。
RESET $000 INT0 $002 INT1 $004 INT2 $024
INT0、INT1和INT2是3個外部中斷源,它們是分別由芯片外部引腳PD二、PD三、PB2上的電平變化或狀態觸發的。經過對控制寄存器MCUCR控制與狀態寄存器MCUCSR的配置,外部中斷能夠定義爲由PD二、PD三、PB2引腳上的電平的降低沿、上升沿、邏輯電平變化,或者低電平觸發(INT2僅支持電平變化的邊沿觸發),這爲外部硬件電路和設備向AVR申請中斷服務提供了很大的方便。
**關於計數器的中斷寄存器:TIMER2 COMP、TIMER2 OVF、TIMER1 CAPT、TIMER1 COMPA、TIMER1 COMPB、TIMER1 OVF、TIMER0 OVF、TIMER0 COMP這8箇中斷是來自於ATmega16內部的3個定時計數器觸發的內部中斷。定時器處在不一樣的工做模式下時,這些中斷的發生條件和具體意義是不一樣的。



ATmega16的中斷控制:
    1)、中斷優先級的肯定
         AVR單片機中,一箇中斷在中斷向量區中的位置決定了它的優先級,位於低地址的中斷優先級高於位於高地址的中斷。因此 RESET 具備最高優先級。
         AVR單片機採用固定的硬件優先級方式,不支持經過軟件對中斷優先級的從新設定。當有多箇中斷源向MCU申請中斷的狀況中,MCU根據中斷優先級的不一樣,把低優先級的中斷掛起,首先響應中斷優先級最高的那個中斷。待優先級最高的中斷服務程序執行完成返回後,再順序響應低優先級的中斷。
    2)、中斷標誌
         AVR有兩種機制不一樣的中斷:帶有中斷標誌的中斷(可掛起)和不帶中斷標誌的中斷(不能掛起) 。在 AVR 中,大多數的中斷都屬於帶中斷標誌的中斷。所謂的中斷標誌,是每一箇中斷源在 其 I/O 空間寄存器中具備本身的一箇中斷標誌位。AVR 的硬件系統在每一個時鐘週期內都會檢 測(接受)外部(內部)中斷源的中斷條件。一旦中斷條件知足,AVR 的硬件就會將置位相 應的中斷標誌位(置爲「1」),表示向 MCU 提起中斷請求。
    3)、中斷屏蔽與管理
         AVR 對中斷採用兩級控制方式。兩級控制是指 AVR 有一 箇中斷容許的總控制位 I(既 AVR 標誌寄存器 SREG 中的 I 標誌位「SREG.7」),一般稱爲 局中斷容許控制位。同時 AVR 爲每個中斷源都設置了獨立的中斷容許位,這些中斷容許位 分散位於各中斷源所屬模塊的控制寄存器中。
▋AVR響應一個可屏蔽中斷源(假定爲A中斷)的中斷的條件是:
    響應A中斷 = 全局中斷容許標誌 AND 中斷A容許標誌位 AND 中斷A標誌
    當某個中斷條件成立後,硬件會自動將該中斷的標誌位置"1",表示中斷產生,同時也做爲申請中斷服務的請求信號。若是該中斷的容許位爲"1",同時AVR的全局中斷容許位 I 也是"1"時,那麼MCU在執行完當前一條指令以後就會響應該中斷。
▋AVR復位後,各個中斷容許位以及全局中斷容許位均被清零,這保證了程序在開始執行時(通常程序開頭是對芯片內部以及外圍系統的初始化設置)不會受到中斷的干擾。
▋AVR復位後的用戶初始化程序中,須要先對須要使用的中斷源進行必要的配置,待系統初始化過程結束後在置位 I ,使系統進入正常的工做狀態,開始響應中斷請求。
    4)、中斷嵌套
         AVR在響應一箇中斷的過程當中經過硬件將 I 標誌位自動清零,這樣就阻止了MCU響應其它中斷。一般狀況下,AVR是不能自動實現中斷嵌套的。若是系統中必需要實現中斷嵌套的應用,用戶能夠在中斷服務程序中使用指令將全局中斷容許位開放,經過間接的方式實現中斷的嵌套處理。
         濫用中斷嵌套會形成程序流程的不肯定性。所以建議只有當某中斷確實需 要獲得實時響應時才考慮使用中斷嵌套處理,通常狀況下儘可能不要採用中斷嵌套,由於 AVR  自己是高速單片機,它運行速度是能足夠快速的將中斷服務程序執行完的。固然,用戶編寫 中斷服務程序時,應遵循儘可能短小的原則。



AVR的中斷響應過程:
1)、中斷響應的過程
AVR在響應中斷請求時,MCU會使用4個時鐘週期自動順序的完成如下任務:
▶ 清零狀態寄存器SREG中的全局中斷容許標誌位 I ,禁止響應其餘中斷。
▶ 將被響應中斷的標誌位清零(這個只是部分中斷有此操做)。
▶ 將中斷斷點的地址(即當前程序計數器PC的值)壓入堆棧,並將SP寄存器中的堆棧指針減二。
▶ 自動將相應的中斷向量地址壓入程序計數器PC,即強行轉入執行中斷入口地址處的指令。
中斷響應過程所有由硬件本身實現,不須要用戶干預。
2)、中斷返回的過程
AVR一旦執行中斷返回RETI指令,MCU便開始了中斷返回的過程。AVR在中斷返回過程當中,使用4個時鐘週期自動按順序完成如下任務:
▶ 從棧頂彈出2個字節的數據,將這兩個數據壓入程序計數器PC中,並將SP寄存器中的堆棧指針加2。
▶ 置位狀態寄存器SREG中的全局中斷容許標誌位I,容許響應其餘中斷。
中斷返回後,會檢測中斷標誌,若是存在其餘被掛起的中斷,則AVR在中斷返回後還需執行一條指令,被掛起的中斷纔會獲得響應。
3)、中斷現場的保護
AVR的中斷響應和返回過程主要都是由硬件自動完成的,而在整個過程當中用戶程序的做用在於:
▶ 中斷入口處的指令。用於指引MCU轉移到中斷服務程序。
▶ 中斷服務程序。完成中斷服務的功能。
▶ 中斷返回指令。指引MCU從中斷服務程序中返回。
  爲了提升中斷響應的實時性,AVR在中斷響應和返回過程當中,硬件上的處理僅僅保護和恢復了中斷的斷點(PC值)。而對中斷現場沒有采起任何處理。
  所以,中斷現場的保護工做須要用戶在本身編寫的中斷服務程序中經過軟件完成,以保證主程序在被打斷時所使用的標誌位和臨時寄存器等不會被中斷服務程序改變,例如,對狀態寄存器SREG的保護等!



中斷服務程序編寫:(三個框架)中斷向量區部分、主程序部分和中斷服務程序部分。
1)、中斷向量區部分
    缺省狀況下,AVR的中斷向量區在Flash程序存儲器的最低端。最開始的0x0000是不可屏蔽的復位上電的中斷向量,此處有一條轉移到主程序開始處的跳轉指令。
2)、主程序部分
    單片機主程序的開始階段一般要對整個系統已經芯片自己進行初始化設置,而後才能進入正常的工做流程中。分爲:堆棧指針的初始化、中斷源設置、開放全局中斷、各中斷源相應的中斷容許設置。
  開放中斷源自己的中斷容許位以前,最好先使用指令將該中斷的中斷標誌位清除,而後立刻將中斷容許位置「1」。
  在開放中斷前清楚可能存在的中斷標誌,保證了中斷開放後不會造成一次「多餘」的中斷,這個「多餘」的中斷有時會形成致命的錯誤。由於在對中斷源進行設置過程當中,或中斷源對應的硬件模塊在工做中都有可能改變中斷標誌位。
3)、中斷服務程序
    因爲在中斷向量處一般放置一條轉移指令,用於再次跳轉到中斷服務程序的開始處,因此中斷服務程序能夠放置在FLASH空間的任何地方。
中斷服務程序中要考慮被中斷現場的保護和恢復問題。中斷的產生和響應是隨機的,並且在中斷服務程序中常常要使用一些寄存器,或對RAM中的變量進行操做,也會有判斷和跳轉的操做,這些指令可能會改變SREG中的標誌位,因此必須確保當從中斷服務程序返回時,被中斷服務程序改變的現場所有正確的恢復,這樣當中斷返回後,主程序才能正確繼續運行下去。

  除了一些必須在中斷中完成的工做外,對於那些不須要立刻處理的工做,如鍵盤處理、掃描顯示等應該放在主程序中完成,也就是說,中斷服務程序應儘量的短。中斷服務程序短,不是程序指令少,而是執行一次中斷服務程序所須要的時間短。儘可能減小中斷服務程序的執行時間有如下優勢:
▋能夠沒必要採用中斷嵌套技術。AVR的硬件不支持自動的中斷嵌套處理,所以中斷執行時間短的話可以儘快的響應其餘被掛起的中斷,提供系統整體的實時響應速度。
▋可以防止丟失週期性中斷或其它短時中斷。列如,當系統有一個1ms產生一次的週期型中斷源,你的中斷服務程序就必須在1ms完成,不然將會形成下一個中斷的「丟失」。
  有不少狀況下,中斷僅僅表示外圍設備或內部功能部件的工做過程已經達到某種狀態,但不須要立刻去處理,或者容許在一個比較充裕的限定時間內處理,這就能夠將它們的處理工做放到主程序中完成。在這種狀況下,最好的方式就是定義和使用信號量或標誌變量,在中斷服務程序中只是簡單的對這些信號量或標誌量進行必要的設置,不作其餘處理就立刻返回主程序,由主程序中根據這些信號量或表質量的值進行和完成處理工做。  這樣作的另外一個好處是,能夠大大減小中斷服務程序中的對中斷現場保護和恢復的工做,從而又減小了中斷程序的執行時間,同時也節省了堆棧空間和FLASH空間(代碼少了)。
相關文章
相關標籤/搜索