Cortex-M3 異常返回值EXC_RETURN


【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》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM