Cortex-M3中断的具体行为
中斷響應(yīng)序列
Cortex-M3的中斷響應(yīng)序列包括:入棧,取向量,更新寄存器;
1. 入棧
Cortex-M3的中斷響應(yīng)會(huì)自動(dòng)保存現(xiàn)場(chǎng):依次將xPSR,PC,LR,R12,R0-R3壓入堆棧;響應(yīng)異常時(shí)正在使用哪個(gè)堆棧指針,則壓入哪個(gè)堆棧,進(jìn)入中斷服務(wù)例程后,將一直使用MSP;
| 舊SP(N-0) | 原內(nèi)容 | - |
| (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的值入棧,是為了盡早的啟動(dòng)服務(wù)例程指令的預(yù)取,以及更新xPSR的IPSR段的值;
2. 取向量
當(dāng)數(shù)據(jù)總線執(zhí)行入棧操作的時(shí)候,指令總線正在執(zhí)行取向量操作;即從向量表中找出正確的中斷向量,然后在服務(wù)例程入口處預(yù)取指令;取向量和入棧是同時(shí)進(jìn)行的;
3. 更新寄存器
在中斷開始響應(yīng)之后,執(zhí)行服務(wù)例程之前,更新了一系列寄存器:
SP:入棧會(huì)把SP更新到新的位置,中斷服務(wù)例程由MSP負(fù)責(zé)堆棧的訪問(wèn);
PSR:IPSR位段會(huì)更新為新響應(yīng)的異常編號(hào);
PC:PC將指向服務(wù)例程的入口地址;
LR:LR的用法將被重新解釋,其值將更新為一種特殊的值,稱為“EXC_RETURN”,并在異常返回時(shí)使用;
在中斷響應(yīng)時(shí),NVIC也更新了一些寄存器,例如,新響應(yīng)異常的懸起位被清除,其活動(dòng)位被激活;
中斷返回
Cortex-M3的中斷返回序列需要一個(gè)特定的動(dòng)作來(lái)觸發(fā),這個(gè)動(dòng)作就是把EXC_RETURN送往PC,例如:BX LR;
在啟動(dòng)了中斷返回序列后,將執(zhí)行以下操作:
出棧:將先前壓入堆棧的寄存器恢復(fù),堆棧指針也更新;
更新NVIC寄存器:異常返回,其相應(yīng)的活動(dòng)位將被硬件清除;
EXC_RETURN
進(jìn)入中斷服務(wù)程序后,LR(R14)寄存器的值會(huì)被更新為特殊的值‘EXC_RETURN’(原來(lái)的值已壓入堆棧);執(zhí)行完中斷服務(wù)程序后,只要把這個(gè)值送往PC,就會(huì)啟動(dòng)中斷返回序列;
EXC_RETURN位段如下:
| bit[31:4] | EXC_RETURN的標(biāo)識(shí),全為1 |
| bit[3] | 0表示返回后進(jìn)入handler模式,1表示返回后進(jìn)入線程模式 |
| bit[2] | 0表示返回后使用MSP,1表示返回后使用PSP |
| bit[1] | 保留 |
| bit[0] | 0表示返回ARM狀態(tài),1表示返回thumb狀態(tài),CM3中必須為1 |
合法的EXC_RETURN值
- 0xffffffff1 : 返回handler模式
- 0xffffffff9 : 返回線程模式,并使用MSP
- 0xffffffffd : 返回線程模式,并使用PSP
如果在線程模式,且使用MSP時(shí)被中斷,中斷服務(wù)例程中EXC_RETURN=0xfffffff9;
如果在線程模式,且使用PSP時(shí)被中斷,中斷服務(wù)例程中EXC_RETURN=0xfffffffd;
如果在handler模式時(shí)被中斷,中斷服務(wù)例程中EXC_RETURN=0xfffffff1;
總結(jié)
以上是生活随笔為你收集整理的Cortex-M3中断的具体行为的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机应用与基础进制,计算机应用基础选择
- 下一篇: 含有运算放大器的电阻电路