關(guān)于__irq使用,首先看ARM公司的說明:
ARM 編譯器 armcc 支持的函數(shù)關(guān)鍵字和運(yùn)算符。
下表列出的關(guān)鍵字是 ARM 對(duì) C 和 C++ 標(biāo)準(zhǔn)的擴(kuò)展。 表中沒有介紹不具備 ARM 編譯器特有的行為或限制的標(biāo)準(zhǔn) C 和 C++ 關(guān)鍵字。 ARM 編譯器支持的關(guān)鍵字?jǐn)U展表:
關(guān)鍵字 |
__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 關(guān)鍵字,可以將 C 或 C++ 函數(shù)用作中斷例程。 __irq 是一個(gè)函數(shù)限定符。 它影響函數(shù)的類型。
將保留所有損壞的寄存器(浮點(diǎn)寄存器除外),而不僅限于通常在 AAPCS 中保留的寄存器。 必須使用缺省 AAPCS 模式。
通過將程序計(jì)數(shù)器設(shè)置為 lr-4 并將 CPSR 設(shè)置為 SPSR 中的值,可以退出該函數(shù)。 不能將任何自變量或返回值與 __irq 函數(shù)配合使用。
再看其他的一些解釋:
armcc的編譯器的C對(duì)ANSI C的關(guān)鍵字做了些擴(kuò)展。 比如__irq 是用來聲明IRQ和FIQ中斷處理函數(shù)用的,可以自動(dòng)返回原來的現(xiàn)場(chǎng)。__asm用來嵌入?yún)R編代碼等。
__irq為一個(gè)標(biāo)識(shí),用來表示一個(gè)函數(shù)是否為中斷函數(shù)。對(duì)于不同的編譯器,__irq在函數(shù)名中的位置不一樣,例如:
ADS編譯器中 : void __irq IRQ_Eint0(void); Keil編譯器中 : void IRQ_Eint0(void) __irq;
但是其意義一樣,它所完成的任務(wù)是標(biāo)識(shí)該函數(shù)為中斷函數(shù),在編譯器編譯是調(diào)用此函數(shù)時(shí),先保護(hù)函數(shù)入口現(xiàn)場(chǎng),然后執(zhí)行中斷函數(shù),函數(shù)執(zhí)行完畢,恢復(fù)中斷現(xiàn)
場(chǎng),這整個(gè)過程不需要用戶重新編寫代碼來完成,由編譯器自動(dòng)完成。因而這也給不具備中斷嵌套功能的ARM系統(tǒng)帶來了問題,若使用 __irq
時(shí)有中斷嵌套產(chǎn)生,這現(xiàn)場(chǎng)保護(hù)就會(huì)混亂。因此自己編寫中斷入口現(xiàn)場(chǎng)保護(hù)代碼,并不使用 __irq 標(biāo)識(shí)符號(hào),就是這個(gè)原因。 總結(jié)如下: 1、若不想自己編寫中斷入口現(xiàn)場(chǎng)保護(hù)代碼,而且使用中無中斷嵌套,在中斷函數(shù)中用 __irq 來標(biāo)識(shí)我們的中斷函數(shù),否則出錯(cuò); 2、若程序中要使用中斷嵌套,對(duì)于無中斷嵌套功能的ARM來說,一定要自己編寫中斷入口現(xiàn)場(chǎng)保護(hù)代碼,而且不能用 __irq 標(biāo)識(shí)我們的中斷函數(shù),否則出錯(cuò) |