ARM:NVIC & VIC & GIC & SCB

ARM體系結構支持以下操作模式:
  • 用戶 模式 : 在執行完CPU啓動代碼文件Startup.s後正常的程序執行狀態。
  • 系統 模式 : 運行一些操作系統核。
  • IRQ (中斷) 模式 : 通用的中斷處理模式。
  • FIQ (快速中斷) 模式 : 快速中斷,處理一些特殊的中斷源。
  • 管理 模式 : 進入保護狀態的執行;通常在復位或使用SWI指令時進入此模式。
  • 異常 模式 : 在數據或指令預取失敗時進入此模式。
  • 未定義 模式 : 當執行一個未定義的指令時進入此模。
*********************************************************************
VIC:Vectored Interrupt Controller
ARM7TDMI內核具有兩個中斷輸入,分別爲IRQ中斷和FIQ中斷。但是芯片內部有許多中斷源,最多可以有32箇中斷輸入請求。向量中斷控制器的作用就是允許哪些中斷源可以產生中斷,可以產生哪類中斷,產生中斷後執行哪段服務程序!!!
允許中斷源:產生中斷與否由寄存器VICIntEnableVICIntEnClr控制,前者使能中斷,後者禁止中斷。
選擇中斷:ARM7DMI內核具有FIQ和IRQ兩個中斷輸入,所有中斷源產生的中斷都可以選擇產生其中一種中斷。這通過中斷選擇寄存器完成。
中斷類型:
  中斷輸入請求可以在VIC中被設置爲一下三類:
  • FIQ中斷:具有最高優先級;
  • 向量IRQ中斷:具有中等優先級;
  • 非向量IRQ中斷:具有最低優先級;
  • 向量IRQ中斷
     VIC最多支持16個向量IRQ中斷,這些中斷被分爲16個優先級,並且爲每個優先級制定一個服務程序入口地址。在發生向量IRQ中斷後,相應優先級的服務程序入口地址被裝入向量地址寄存器VICVectAddr中,通過一條ARM指令即可跳轉到相應的服務程序入口處,所以向量IRQ中斷具有較快的中斷響應。
非向量IRQ中斷
 
  任何中斷源都可以設置爲非向量IRQ中斷。它與向量IRQ的區別在於前者不能爲每個非向量IRQ中斷源設置服務程序地址,而是所有的非向量IRQ中斷都共用一個相同的服務程序入口地址。當有多箇中斷源被設置爲非向量IRQ中斷時,需要在用戶程序中識別中斷源,並分別作出處理。所以非向量IRQ中斷響應延時相對較長
*********************************************************************
GIC : General Interrupt Controller,主要作用可以歸結爲
接受硬件中斷信號,並進行簡單處理,通過一定的設置策略,分給對應的CPU進行處理。
             GIC 是ARM公司提供的一個通用的中斷控制器,其architecture specification目前有四個版本,V1~V4(V2最多支持8個ARM core,V3/V4支持更多的ARM core,主要用於ARM64服務器系統結構).
CPU接受外部的中斷處理請求,並進行處理,其實是一個被動接受的過程,這樣好處是既能保證主任務的執行效率,又能及時獲知外部的請求,從而處理重要的設備請求操作。
 
*********************************************************************
NVIC : Nested Vectored Interrupt Controller
即是中斷嵌套向量控制器。NVIC是CortexM3內核的標準組件,其實很簡單。與其類似的還有MPU,SYSTick,調試/Trace等模塊(如果芯片集成了)。
NVIC可以看做是CPU的得力干將,負責了CPU所有的外設中斷,而內部的異常中斷則是有SCB系統控制塊來管理
M0 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. NVIC只支持字傳輸)。
M0沒有搶佔優先級的概念,優先級只有四個即0,1,2,3;其中0的優先級是最高的
  • Cortex-M0允許電平觸發和脈衝觸發兩種方式。
  • 每個外部中斷請求都會對應一個掛起狀態寄存器,且只有1bit,當開始處理這個異常時,硬件會自動清除掛起狀態。
  • 大多數外設都是使用電平觸發,當執行中斷服務程序並且清除外設中斷信號之前,該信號一直爲高。
  • 3個固定的最高優先級(Reset(-3)、 NMI(-2)、H/W Error(-1))。
  • 如果兩個同時發生的異常的優先級相同,則先執行異常編號小的。
  • 至於嵌套的問題,對M0+是比較簡單的,即只要相應中斷的優先級比較高即可隨時搶佔比它優先級低的中斷服務。
四個優先級
 
M3:
cortex M3核支持最多240外設中斷和一個不可屏蔽(NMI)中斷NVIC支持字節 半字 字傳輸)
M3支持搶佔優先級子優先級
  • 即搶佔優先級高的中斷可打斷低優先級中斷。
  • 當搶佔優先級相同的兩個中斷同時發生,子優先級高的中斷先執行。
  • 若搶佔優先級相同,子優先級低的中斷先發生並執行,則此時再發生的高子優先級中斷需等待之前的中斷結束後才能被響應,即搶佔不能發生。
注:對於cortex M0來說,NVIC寄存器的訪問必須是每次一個字(32bit),而cortex M3則可以以字,半字或字節來進行。
 
*********************************************************************
SCB :  System Control Block 

內核的Fault異常可以捕獲非法內存方法和非法編程行爲。Fault異常能夠檢測到以下情況:

  • 總線Fault:在取址、數據讀/寫、取中斷向量、進入/退出中斷時寄存器堆棧操作(入棧/出棧)時檢測到內存訪問錯誤。

  • 存儲器管理Fault:檢測到內存訪問違反了MPU定義的區域。

  • 用法Fault:檢測到未定義的指令異常,未對齊的多重加載/存儲內存訪問。如果使能相應控制位,還可以檢測出除數爲零以及其他未對齊的內存訪問。

  • 硬Fault:如果上面的總線Fault、存儲器管理Fault、用法Fault的處理程序不能被執行(例如禁能了總線Fault、存儲器管理Fault、用法Fault異常或者在這些異常處理程序執行過程中又出現了Fault)則觸發硬Fault。

通常總是使能硬Fault異常的,硬Fault異常具有固定的優先級,並且優先級高於其它Fault異常以及中斷,但低於NMI。

硬Fault異常處理程序在以下情況下會被執行:其它非硬Fault異常(非硬Fault異常是指總線、存儲器管理和用法Fault 異常)被禁能,並且這些Fault異常被觸發;在執行一個非硬Fault異常處理程序中又產生非硬Fault異常。

      所有非硬Fault具有可編程的優先級。當Cortex-M內核復位後,這些非硬Fault被禁能,你可以在應用軟件中通過設置“系統Handler控制及狀態寄存器(SHCSR)”來使能非硬Fault異常。這個寄存器屬於系統控制模寄存器組(SCB)。

 
 
 
 
 
發佈了58 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章