關於 irq 的使用

2021-06-07 12:22:56 字數 1149 閱讀 1762

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使用,首先看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 但是其意義一樣,它所完成的任務是標識該函式為中斷函式,在編譯器編譯...