關於__irq使用,首先看arm公司的說明:
arm 編譯器 armcc 支援的函式關鍵字和運算子。下表列出的關鍵字是 arm 對 c 和 c++ 標準的擴充套件。 表中沒有介紹不具備 arm 編譯器特有的行為或限制的標準 c 和 c++ 關鍵字。
arm 編譯器支援的關鍵字擴充套件表:
關鍵字
__align
__int64
__svc
__alignof__
__intaddr__
__svc_indirect
__asm
__irq
__svc_indirect_r7
__declspec
__packed
__value_in_regs
__forceinline
__pure
__weak
__global_reg
__softfp
__writeonly
__inline
__smc
通過使用 __irq 關鍵字,可以將 c 或 c++ 函式用作中斷例程。
__irq 是乙個函式限定符。 它影響函式的型別。
限制:
將保留所有損壞的暫存器(浮點暫存器除外),而不僅限於通常在 aapcs 中保留的暫存器。 必須使用預設 aapcs 模式。
通過將程式計數器設定為 lr-4 並將 cpsr 設定為 spsr 中的值,可以退出該函式。 不能將任何自變數或返回值與 __irq 函式配合使用。
再看其他的一些解釋:
armcc的編譯器的c對ansi c的關鍵字做了些擴充套件。
比如__irq 是用來宣告irq和fiq中斷處理函式用的,可以自動返回原來的現場。__asm用來嵌入彙編**等。
__irq為乙個標識,用來表示乙個函式是否為中斷函式。對於不同的編譯器,__irq在函式名中的位置不一樣,例如:
ads編譯器中 : void __irq irq_eint0(void);
keil編譯器中 : void irq_eint0(void) __irq;
但是其意義一樣,它所完成的任務是標識該函式為中斷函式,在編譯器編譯是呼叫此函式時,先保護函式入口現場,然後執行中斷函式,函式執行完畢,恢復中斷現場,這整個過程不需要使用者重新編寫**來完成,由編譯器自動完成。因而這也給不具備中斷巢狀功能的arm系統帶來了問題,若使用 __irq 時有中斷巢狀產生,這現場保護就會混亂。因此自己編寫中斷入口現場保護**,並不使用 __irq 識別符號號,就是這個原因。
總結如下:
1、若不想自己編寫中斷入口現場保護**,而且使用中無中斷巢狀,在中斷函式中用 __irq 來標識我們的中斷函式,否則出錯;
2、若程式中要使用中斷巢狀,對於無中斷巢狀功能的arm來說,一定要自己編寫中斷入口現場保護**,而且不能用 __irq 標識我們的中斷函式,否則出錯。
參考**:
關於 irq 的使用
關於 irq使用,首先看arm公司的說明 arm 編譯器 armcc 支援的函式關鍵字和運算子。下表列出的關鍵字是 arm 對 c 和 c 標準的擴充套件。表中沒有介紹不具備 arm 編譯器特有的行為或限制的標準 c 和 c 關鍵字。arm 編譯器支援的關鍵字擴充套件表 關鍵字 align int6...
關於 irq的使用
irq為乙個標識,用來表示乙個函式是否為中斷函式。對於不同的編譯器,irq在函式名中的位置不一樣,例如 ads編譯器中 void irq irq eint0 void keil編譯器中 void irq eint0 void irq 但是其意義一樣,它所完成的任務是標識該函式為中斷函式,在編譯器編譯...
關於 irq 的使用
arm 編譯器支援的關鍵字擴充套件表 關鍵字 align int64 svc alignof intaddr svc indirect asm irq svc indirect r7 declspec packed value in regs forceinline pure weak global...