中斷例程可以執(zhí)行由任何其他函數(shù)執(zhí)行的任何任務(wù),包括訪問全局變量、分配局部變量和調(diào)用其他函數(shù)。
編寫中斷例程時,請謹(jǐn)記以下要點(diǎn):
- 需要處理任何特殊的中斷屏蔽。
- 不能直接從 C/C++ 代碼調(diào)用 C/C++ 中斷例程。
- 在系統(tǒng)復(fù)位中斷(例如 c_int00)中,不能假設(shè)運(yùn)行時環(huán)境已設(shè)置;因此,不能分配局部變量,也不能在運(yùn)行時棧上保存任何信息。
- 在匯編語言中,請記住在 C/C++ 中斷名稱之前加上適當(dāng)?shù)逆溄用?。例如,?c_int00 表示為 _c_int00。
- 當(dāng)中斷發(fā)生時,處理器的狀態(tài)(ARM 或 Thumb 模式)取決于使用的器件。編譯器允許在 ARM 或 Thumb-2 模式下定義中斷處理程序。應(yīng)該確保中斷處理程序讓器件使用正確的模式。
- FIQ、監(jiān)控器、中止、IRQ 和未定義模式具有獨(dú)立的棧,C/C++ 運(yùn)行時環(huán)境不會自動設(shè)置這些棧。如果這些模式中的任何一個有中斷例程,則必須為該模式設(shè)置軟件棧。但是,ARM Cortex-M 處理器有兩個棧,IRQ(Cortex-M 的唯一中斷類型)使用的主棧 (MSP) 由編譯器自動處理。
- 中斷例程不可重入。如果中斷例程允許其類型的中斷,則必須在執(zhí)行此操作之前保存返回地址和 SPSR(已保存的程序狀態(tài)寄存器)的副本。
- 軟件中斷是同步的,只要針對此目的設(shè)計(jì)了系統(tǒng),節(jié) 6.7.1 中討論的寄存器保存慣例就可以減少限制。然而,編譯器生成的軟件中斷例程遵循 節(jié) 6.7.1 中的慣例。