[ADPAD]关于Cortex-M系列的中断嵌套

来自于百度百科的关于中断嵌套的简介:中断嵌套

是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。

其实就是更高一级的中断的“加塞”,处理器正在执行着中断,又接受了更急的另一件“急件”,转而处理更高一级的中断的行为!

来自于台湾Wiki:中断嵌套

關於中斷嵌套。可以這樣說,當一個中斷正在執行的時候,如果事先設置了中斷優先順序寄存器IP,那麼當一個更高優先順序的中斷到來的時候會發生中斷嵌套,如果沒有設置則不會發生任何嵌套;如果有同一個優先順序的中斷觸發,它並不是在「不斷的申請」,而是將它相應的中斷標誌位置即IE寄存器的某位置位,當CPU執行完當前中斷之後,按照查詢優先順序重新去查詢各個中斷標誌位,進入相應中斷。

要記住,沒有設置IP時,單片機會按照查詢優先順序(或都說邏輯優先順序)來排隊進入服務。如果要想讓某個中斷優先響應,則要設置IP,更改執行優先順序(或者說物理優先順序)。要注意的是,當設置了IP(Interrupt priority即中斷優先順序,后同)后,當低執行優先順序中斷在運行時,如果有高執行優先順序的中斷產生,則會嵌套調用進入高執行優先順序的中斷。如果你是用C語言寫的程序,並在中斷服務時 using 了寄存組,要注意,兩個不同執行優先順序的中斷服務程序不要 using 同一組寄存器。

看兩個問題,如下:

1 在各個中斷都是低優先順序的時候,如果定時器0的溢出進入中斷。在這個中斷處理的過程中,外部中斷0也被觸發了,那麼是不是要發生中斷嵌套?

2 如果定時器0發生中斷的時候,進入中斷處理程序,這個時候外部中斷1條件觸發條件滿足了。因為定時器0自然優先順序比外部中斷1高,那麼定時器0的中斷處理程序繼續執行。假設定時器中斷處理程序執行的過程中,外部中斷1的觸發。條件消失了,那麼等定時器0的中斷處理完后,程序還是會進入外部中斷1處理程序嗎?

答案1:在IP事先設置了外部中斷0的優先順序的情況下,CPU會中止定時器0的中斷服務,進入外部中斷0服務程序,執行完以後再回到定時器0中斷服務程序。否則不會。

答案2:肯定會進入中斷的;外部中斷1的觸發條件滿足後會置位外部1的中斷標誌,即使後來外部中斷1的觸發條件消失了,也不會清除已置位的中斷標誌,所以等定時器0的中斷處理完后,程序判斷外部中斷的中斷標誌為1后依然會進入外部中斷1處理程序的,只有在外部中斷1處理程序中執行reti指令才會硬體清除外部中斷1的中斷標誌(這也正是為什麼中斷返回使用reti指令而不可以用ret替換的原因)…

說到這裡我們應該要知道MCU清除中斷標誌位的兩種方式:一種是通過軟體代碼往這個中斷標誌位的寄存器裡面寫「1」來完成標誌位的清零操作;第二種是當MCU響應中斷,執行中斷服務程序的時候(也就是程序計數器的指針跳轉到了中斷服務程序代碼區),由硬體自動執行清零操作。

我们可以得到,当:

  1. 设置了中断优先寄存器IP时,就会发生中断嵌套,此时优先级高的会打断优先级低的,执行其中断服务例程,而后再执行被打断的中断服务例程。
  2. 没有设置中断优先寄存器IP时。由于中断属于同一优先级,所以不会发生中断嵌套的行为,按时间的先后执行中断服务例程执行,执行完一个后再执行另一个。

源自:http://bbs.21ic.com/icview-153762-1-1.html

ARM的中断管理体系和51系列微控制器的中断管理体系不太一样。熟悉51体系结构的用户需要特别注意这一点。ARM的中断不会自动嵌套,实现ARM微控制器的中断嵌套比较烦琐,我们不提倡中断嵌套。但不排除需要嵌套的应用,因而在启动代码中,有对中断嵌套的处理。模板中的文件IRQ.S用于处理中断嵌套,是以下中断处理方法的依据。用户要根据自己的应用更改此文件,只需要在文件末尾添加中断处理程序的句柄即可。

中断嵌套的原则:低优先级的中断嵌套高优先级的中断。

可嵌套中断服务程序编写方法:

1、保存当前中断使能寄存器VICIntEnable的值;

2、禁止当前中断和低优先级中断;

3、清除中断逻辑,使VIC能够响应更高优先级的中断;

4、中断处理服务程序;

5、恢复保存的中断使能寄存器的值。

声明需要嵌套的中断服务程序时,不能使用”__irq”关键字,而需要通过句柄的方式进行。

未经允许不得转载:TacuLee » [ADPAD]关于Cortex-M系列的中断嵌套

赞 (1)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址