Cortex-M3中断的具体行为
中斷響應序列
Cortex-M3的中斷響應序列包括:入棧,取向量,更新寄存器;
1. 入棧
Cortex-M3的中斷響應會自動保存現場:依次將xPSR,PC,LR,R12,R0-R3壓入堆棧;響應異常時正在使用哪個堆棧指針,則壓入哪個堆棧,進入中斷服務例程后,將一直使用MSP;
| 舊SP(N-0) | 原內容 | - |
| (N-4) | xPSR | 2 |
| (N-8) | PC | 1 |
| (N-12) | LR | 8 |
| (N-16) | R12 | 7 |
| (N-20) | R3 | 6 |
| (N-24) | R2 | 5 |
| (N-28) | R1 | 4 |
| 新SP(N-32) | R0 | 3 |
先把PC和xPSR的值入棧,是為了盡早的啟動服務例程指令的預取,以及更新xPSR的IPSR段的值;
2. 取向量
當數據總線執行入棧操作的時候,指令總線正在執行取向量操作;即從向量表中找出正確的中斷向量,然后在服務例程入口處預取指令;取向量和入棧是同時進行的;
3. 更新寄存器
在中斷開始響應之后,執行服務例程之前,更新了一系列寄存器:
SP:入棧會把SP更新到新的位置,中斷服務例程由MSP負責堆棧的訪問;
PSR:IPSR位段會更新為新響應的異常編號;
PC:PC將指向服務例程的入口地址;
LR:LR的用法將被重新解釋,其值將更新為一種特殊的值,稱為“EXC_RETURN”,并在異常返回時使用;
在中斷響應時,NVIC也更新了一些寄存器,例如,新響應異常的懸起位被清除,其活動位被激活;
中斷返回
Cortex-M3的中斷返回序列需要一個特定的動作來觸發,這個動作就是把EXC_RETURN送往PC,例如:BX LR;
在啟動了中斷返回序列后,將執行以下操作:
出棧:將先前壓入堆棧的寄存器恢復,堆棧指針也更新;
更新NVIC寄存器:異常返回,其相應的活動位將被硬件清除;
EXC_RETURN
進入中斷服務程序后,LR(R14)寄存器的值會被更新為特殊的值‘EXC_RETURN’(原來的值已壓入堆棧);執行完中斷服務程序后,只要把這個值送往PC,就會啟動中斷返回序列;
EXC_RETURN位段如下:
| bit[31:4] | EXC_RETURN的標識,全為1 |
| bit[3] | 0表示返回后進入handler模式,1表示返回后進入線程模式 |
| bit[2] | 0表示返回后使用MSP,1表示返回后使用PSP |
| bit[1] | 保留 |
| bit[0] | 0表示返回ARM狀態,1表示返回thumb狀態,CM3中必須為1 |
合法的EXC_RETURN值
- 0xffffffff1 : 返回handler模式
- 0xffffffff9 : 返回線程模式,并使用MSP
- 0xffffffffd : 返回線程模式,并使用PSP
如果在線程模式,且使用MSP時被中斷,中斷服務例程中EXC_RETURN=0xfffffff9;
如果在線程模式,且使用PSP時被中斷,中斷服務例程中EXC_RETURN=0xfffffffd;
如果在handler模式時被中斷,中斷服務例程中EXC_RETURN=0xfffffff1;
總結
以上是生活随笔為你收集整理的Cortex-M3中断的具体行为的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用与基础进制,计算机应用基础选择
- 下一篇: linux总线错误无法删除文件,linu