中斷現場保護編譯器處理了
❶ 51 C 中斷 現場保護
用C51編程,基本上,不用研究 中斷現場保護。
變數名,區分開了,互相就沒有 干擾。
❷ arm中斷處理
這個其實也不難!主要記清楚,從某個模式,進入IRQ模式要保存那些東西?就好了!你可以google一下weis這個小型實時系統,裡面就有這個!!還有詳細的注釋說明!
❸ ARM中斷嵌套是怎麼保護現場的
個人理解中斷嵌套的寄存器備份是這樣進行的,進入一級中斷便進行一次全套寄存器的壓棧操作,壓棧是把寄存器裡面的值保存到棧區(屬於內存區域,而並非你說的後背狀態寄存器SPSR,其實後背狀態寄存器SPSR也要一起壓入棧區),每壓入一個寄存器,SP會移動相應的距離,不會重疊;每退出一級中斷便進行一次全套寄存器的出棧操作,這樣就實現了保護現場和恢復現場。可以通過編譯器反匯編碼窗口查看中斷壓棧、出棧的實現。
關於優先順序是有兩種的,叫默認優先順序和嵌套優先順序,假如A,B兩個中斷,如果A比B嵌套優先順序(通過優先順序寄存器設置)更高,就不需要看默認優先順序了,A、B同時發生中斷時A中斷先執行而B後執行,而且B中斷執行之間A可以搶斷(嵌套)B的中斷服務程序,B不可以搶斷A;而如果嵌套優先順序一樣的話,只是A默認優先順序比B更高(不需要設置 ),只能支持A、B同時中斷時A先執行,而A不能嵌套B了,有的CPU甚至硬體上不支持嵌套,需要模擬嵌套,這個跟CPU平台有關。
❹ 請教單片機高人:怎麼用C編寫中斷,匯編中可以有ORG 000BH來確定是T0中斷,那C怎麼辦還有現場保護怎辦
C51中斷函數格式
Keil C51編譯器中斷函數語法定義如下:
(C語言不用處理現場保護了) interrupt n <----這個是重點
void 函數名() interrupt n
{
}
//定時器T0中斷
void 函數名() interrupt 1
{
}
C51編譯器允許0~31個中斷,下列中斷及其相關地址為8051控制器所提供的中斷:
0:EXTERNAL 0 地址:0003H
1:TIMER/COUNTER 0 地址:000BH
2:EXTERNAL 1 地址:0013H
3:TIMER/COUNTER 1 地址:001BH
4:SERIAL PORT 地址:0023H
編寫中斷函數時應遵循下列規則:
·不能進行參數傳遞。如果中斷過程包括任何參數聲明,則編譯器將產生一個錯誤信息。
·無返回值。如果想定義一個返回值將產生錯誤,但是,如果返回整型值,編譯器將不產生
錯誤信息,因為整型值是默認值,編譯器不能清楚識別。
·在任何情況下,不能直接調用中斷函數,否則編譯器會產生錯誤。由於退出中斷過程是由
指令RETI完成的,該指令影響MCS-51單片機的硬體中斷系統,直接調用中斷函數時,硬體
上沒有中斷請求存在,因而這個指令的結果是不定的,並且通常是致命的。
·編譯器從絕對地址8n+3處產生一個中斷向量,其中n為中斷號,該向量包括一個中斷過
程的跳轉,向量的產生可由編譯器控制指令NOINTVECTOR壓縮,因而程序員可以從獨立的匯
編模塊中提供中斷向量。
·可以在中斷函數定義中使用using指定當前使用的寄存器組。格式如下:
void 函數名([形式參數])interrupt n [using m]
MCS-51單片機有四組寄存器R0~R7,程序具體使用哪一組寄存器由程序狀態字PSW中
的兩位RS1和RS0來確定。在中斷函數定義時,可以用using指定該函數具體使用哪一組寄
存器,m在0,1,2,3這4個數中取值,對應四組寄存器組。例如:
void delay() interrupt 3 using 2
·在中斷函數中調用的函數所使用的寄存器組必須與中斷函數相同。當沒有使用using指令
時,編譯器會選擇一個寄存器組作為絕對寄存器訪問。程序員必須保證按要求使用相應寄存
器組,C編譯器不會對此檢查。
·如果在中斷函數中執行浮點運算,必須保存浮點寄存器狀態,當沒有其他程序執行浮點運
算時,可以不保存。
❺ 在中斷服務程序的保護和恢復現場之後需要什麼中斷
中斷處理程序的第一步就是保護現場
一般是PUSHAD
中斷處理結束後,最後一步就是恢復現場
一般是POPAD
只需要兩條指令就行了,不是需要另一個中斷
