關於__irq 的使用

來源:互聯網
上載者:User

關於__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 標識我們的中斷函數,否則出錯。

 

參考網址:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348ac/BABICJBC.html

http://blog.21ic.com/user1/3572/archives/2007/34803.html

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.