【EXC_RETURN】
在進入異常服務程序后,硬件自動更新LR的值為特殊的EXC_RETURN。
當程序從異常服務程序返回,把這個EXC_RETURN值送往PC時,就會啟動處理器的異常中斷返回序列。
因為LR的值EXC_RETURN是由硬件自動設置的,所以只要沒有特殊需求,就不要改動它。
RETURN的高28位全為1,只有bit[3:0]的值有特殊含義。位段如下:
合法的EXC_RETURN值共有3個,如下:
- 如果主程序在線程模式下運行,並且在使用MSP時被中斷,則在服務程序中LR=0xFFFFFFF9(主程序被打斷前LR已被自動入棧)。
- 如果主程序在線程模式下運行,並且在使用PSP時被中斷,則在服務程序中LR=0xFFFFFFFD(主程序被打斷前LR已被自動入棧)。
- 如果主程序在Handler模式下運行,則服務程序中LR=0xFFFFFFF1(主程序被打斷前LR已自動入棧)。這是所謂的“主程序”,其實更可能時被搶占的中斷服務程序。事實上,在嵌套時,更深層ISR所看到的LR總是0xFFFFFFF1。
【LR的值在異常期間被設置為EXC_RETURN(線程模式使用主堆棧)】
【LR的值在異常期間被設置為EXC_RETURN(線程模式使用進程堆棧)】
【注意】
- 進入中斷時LR的值是CPU自動設置的,不會有錯,為什么退出中斷時會有可能LR值變成非法的了呢?只有一個原因:中斷例程修改了LR的值,改錯了。
- 由EXC_RETURN的格式可見,我們不能把0xFFFFFFF0~0xFFFFFFFF的地址作為任何返回地址。其實也不用擔心會弄錯,因為Cortex-M3已經把這個范圍標記成“取指不可區”了。
參考摘錄:
《Cortex-M內核系列和STM32-講座2教程.pdf》
《ARM Cortex-M3權威指南.pdf》