學習筆記——ARM Cortex-M0 異常與中斷
異常型別及編號
Cortex-M0的每個異常源都有一個單獨的編號:
1~15內部系統異常:Reset(1), NMI(2), H/W Error(3), SVC(11), PndSV(14), SysTick(15)其他編號未用;
16~47外部中斷: IRQ#0~IRQ#31.異常優先順序 (Cortex-M0 支援7個)
1). Cortex-M0 支援3個固定的最高優先順序(Reset(-3), NMI(-2), H/W Error(-1))和4個可程式設計優先順序;
2). 可程式設計暫存器有8bit寬,但只有Bit7和Bit6可配置,其餘Bits為0. (優先順序由高到低:0x00,0x40,0x80,0xC0);
3). 如果兩個同時發生的異常的優先順序相同,則先執行異常編號小的。(IRQ#0,IRQ#1 則先執行IRQ#0)向量表(異常處理所需的起始地址資訊)
異常向量的地址為異常編號乘以4(Reset向量的地址為:1*4=0x00000004),其他向量地址如下圖所示:
EXC_RETURN(32Bits)
該值用於異常返回機制,下圖是其位域的含義:
3個合法值:
0xFFFFFFF1 返回處理模式(巢狀異常發生的情況)
0xFFFFFFF9 返回執行緒模式並在返回中使用主棧(MSP);
0xFFFFFFFD 返回執行緒模式並在返回中使用程序棧(PSP);異常的流程
接受異常請求:
1) 中斷和SysTick中斷使能;
2) 未被NMI遮蔽掉;
3) 異常優先順序大於當前執行的異常優先順序。壓棧及相關暫存器更新:
1) 壓棧並更新棧指標(8個registers被壓棧:R0~R3, R12, R14/LR, R15/PC, xPSR);
2) 取出異常向量寫入PC中;
3) 3個暫存器更新(LR<–EXC_RETURN, IPSR<–異常編號, NVIC<– 對應的中斷控制和狀態)執行異常處理:
1) 自動定位異常向量,並處理;
2) 利用EXC_TURN的值來觸發異常返回機制。異常退出:
1) 暫存器出棧;
2) 恢復返回地址,並執行異常前程式。3種主要的異常及其機制:(單異常,末尾連鎖,延遲到達)
1)單異常
2)末尾連鎖
3)延遲到達