關於__irq 的使用
__irq為乙個標識,用來表示乙個函式是否為中斷函式。對於不同的編譯器,__irq在函式名中的位置不一樣,例如:
ads編譯器中:void __irq irq_eint0(void);
keil編譯器中:void irq_eint0(void) __irq;
但是其意義一樣,它所完成的任務是標識該函式為中斷函式,在編譯器編譯是呼叫此函式時,先保護函式入口現場,然後執行中斷函式,函式執行完畢,恢復中斷現場,這整個過程不需要使用者重新編寫**來完成,由編譯器自動完成。因而這也給不具備中斷巢狀功能的arm系統帶來了問題,若使用__irq 時有中斷巢狀產生,這現場保護就會混亂。中斷巢狀處理可以自己編寫中斷入口現場保護**,並不使用__irq 識別符號號。(小呆:具體如何編寫可以巢狀的中斷這裡暫時不做研究。
總結如下
1、若不想自己編寫中斷入口現場保護**,而且使用中無中斷巢狀,在中斷函式中用__irq 來標識我們的中斷函式,否則出錯;
2、若程式中要使用中斷巢狀,對於無中斷巢狀功能的arm來說,一定要自己編寫中斷入口現場保護**,而且不能用__irq 標識我們的中斷函式,否則出錯。
__irq關鍵字
在ads編譯器中,「__irq」專門用來宣告irq中斷服務程式,如果用「__irq」來宣告乙個函式,那麼該函式表示乙個irq中斷服務程式,編譯器便會自動在該函式內部增加中斷現場保護的**。同樣乙個函式,如果將關鍵字「__irq」去掉,那麼編譯器便不會增加現場保護的**,而只是作為乙個普通函式來處理。
現在大家應該對「__irq」關鍵字有了一定的了解,那麼,是不是所有的irq中斷服務程式都需要使用「__irq」關鍵字宣告呢?其實,這取決於獲取「中斷服務程式位址」的方法:
如果在執行中斷服務函式之前沒有對中斷現場進行保護,那麼中斷服務函式必須要使用「__irq」關鍵字進行宣告。例如,在0x0000 0018處執行指令「ldr pc, [pc, #-0xff0]」,此時對應的中斷服務函式必須要使用「__irq」關鍵字進行宣告;如果在執行中斷服務函式之前已經對中斷現場進行了保護,那麼中斷服務函式不能使用「__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 但是其意義一樣,它所完成的任務是標識該函式為中斷函式,在編譯器編譯...