1. 程式人生 > >學習筆記——ARM Cortex-M0 異常與中斷

學習筆記——ARM Cortex-M0 異常與中斷

  1. 異常型別及編號
    Cortex-M0的每個異常源都有一個單獨的編號:
    1~15內部系統異常:Reset(1), NMI(2), H/W Error(3), SVC(11), PndSV(14), SysTick(15)其他編號未用;
    16~47外部中斷: IRQ#0~IRQ#31.

  2. 異常優先順序 (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)

  3. 向量表(異常處理所需的起始地址資訊)
    異常向量的地址為異常編號乘以4(Reset向量的地址為:1*4=0x00000004),其他向量地址如下圖所示:
    這裡寫圖片描述

  4. EXC_RETURN(32Bits)
    該值用於異常返回機制,下圖是其位域的含義:
    這裡寫圖片描述

    3個合法值:
    0xFFFFFFF1 返回處理模式(巢狀異常發生的情況)
    0xFFFFFFF9 返回執行緒模式並在返回中使用主棧(MSP);
    0xFFFFFFFD 返回執行緒模式並在返回中使用程序棧(PSP);

  5. 異常的流程

    接受異常請求:
    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) 恢復返回地址,並執行異常前程式。

  6. 3種主要的異常及其機制:(單異常,末尾連鎖,延遲到達)
    1)單異常


    這裡寫圖片描述

    2)末尾連鎖
    這裡寫圖片描述

    3)延遲到達
    這裡寫圖片描述