ARM:NVIC & VIC & GIC & SCB

时间:2024-03-26 12:47:58
ARM体系结构支持以下操作模式:
  • 用户 模式 : 在执行完CPU启动代码文件Startup.s后正常的程序执行状态。
  • 系统 模式 : 运行一些操作系统核。
  • IRQ (中断) 模式 : 通用的中断处理模式。
  • FIQ (快速中断) 模式 : 快速中断,处理一些特殊的中断源。
  • 管理 模式 : 进入保护状态的执行;通常在复位或使用SWI指令时进入此模式。
  • 异常 模式 : 在数据或指令预取失败时进入此模式。
  • 未定义 模式 : 当执行一个未定义的指令时进入此模。
*********************************************************************
VIC:Vectored Interrupt Controller
ARM7TDMI内核具有两个中断输入,分别为IRQ中断和FIQ中断。但是芯片内部有许多中断源,最多可以有32个中断输入请求。向量中断控制器的作用就是允许哪些中断源可以产生中断,可以产生哪类中断,产生中断后执行哪段服务程序!!!
ARM:NVIC & VIC & GIC & SCB
允许中断源:产生中断与否由寄存器VICIntEnableVICIntEnClr控制,前者使能中断,后者禁止中断。
ARM:NVIC & VIC & GIC & SCB
选择中断:ARM7DMI内核具有FIQ和IRQ两个中断输入,所有中断源产生的中断都可以选择产生其中一种中断。这通过中断选择寄存器完成。
ARM:NVIC & VIC & GIC & SCB
中断类型:
  中断输入请求可以在VIC中被设置为一下三类:
  • FIQ中断:具有最高优先级;
  • 向量IRQ中断:具有中等优先级;
  • 非向量IRQ中断:具有最低优先级;
  • 向量IRQ中断
ARM:NVIC & VIC & GIC & SCB
     VIC最多支持16个向量IRQ中断,这些中断被分为16个优先级,并且为每个优先级制定一个服务程序入口地址。在发生向量IRQ中断后,相应优先级的服务程序入口地址被装入向量地址寄存器VICVectAddr中,通过一条ARM指令即可跳转到相应的服务程序入口处,所以向量IRQ中断具有较快的中断响应。ARM:NVIC & VIC & GIC & SCB
非向量IRQ中断
 
  任何中断源都可以设置为非向量IRQ中断。它与向量IRQ的区别在于前者不能为每个非向量IRQ中断源设置服务程序地址,而是所有的非向量IRQ中断都共用一个相同的服务程序入口地址。当有多个中断源被设置为非向量IRQ中断时,需要在用户程序中识别中断源,并分别作出处理。所以非向量IRQ中断响应延时相对较长ARM:NVIC & VIC & GIC & SCB
*********************************************************************
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+是比较简单的,即只要相应中断的优先级比较高即可随时抢占比它优先级低的中断服务。
ARM:NVIC & VIC & GIC & SCB四个优先级
 
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)。