中断和异常

什么是中断和异常

异常是改变程序流的事件,当其产生时,处理器会暂停当前正在执行的任务,转而执行一段被称为异常处理的程序。在异常处理完成后,处理器继续正常的程序执行。对于arm架构来说中断就是异常的一种,一般由外设或者输入产生,有时也可由软件触发,如果异常请求来自外部则成为IRQ(中断请求)。中断的异常处理被称为中断服务程序(ISR)。
当中断请求发生时,且需要处理器服务时,会执行以下流程:
(1)NVIC接收到来自外部的中断请求IRQ
(2)程序流退出当前程序线程,暂停当前执行的任务
(3)切换到异常模式,处理器执行外设的中断服务程序,也可称为中断句柄,若有必要可以选择用软件清除中断请求
(4)完成句柄后,退回进程模式,继续执行之前暂停的任务

NVIC的中断源和中断向量

CORTEX-M NVIC结构
Cortex-m0处理器包括一个内建的中断控制器(NVIC),可以支持32种中断请求输入(IRQ)和一个不可屏蔽中断输入(NMI)和多个系统异常(internal exceptions)。IRQ和NMI都可由片上外设或者外设产生。软件也可产生中断。
每一个异常来源在m0中都有独特的异常编号,且具有优先级,Reset/NMI/Hard fault具有固定的优先级,其优先级由负数表示,其他异常的优先级可编程。但大量优先级会增加NVIC的复杂度,会增加功耗降低速度。多数情况应用只需要少量的编程优先级。
在这里插入图片描述
(1)NMI:除复位外NMI优先级最高,不可以被控制寄存器屏蔽,对于安全性苛刻的系统如工业控制和汽车非常实用,可用于power failure和watchdog。
(2)Hard Fault:用于处理在程序执行中所产生的故障,例如尝试执行一个未知操作码,总线系统或者内存系统的故障,尝试切换到arm状态等非法操作。
(3)SVC(supervisor call):请求管理调用,一般用于OS环境且允许应用任务访问系统服务,在执行SVC指令后立即调用。
(4)PendSV:可挂起的服务调用,用于进行上下文切换。
(5)Systick:内嵌在NVIC中的系统节拍计时器是OS应用的另一特性,几乎所有的操作系统都需要timer来产生定期的中断以便系统维护工作。
(6)Interrupt#0-#31: cortex-m0一共支持32种中断,中断来源可来自于片上外设或者通过I/O接口输入的外部来源,中断在使用前需要被使能。
当处理器在执行相同优先级或者更高优先级的中断句柄时,IRQ会被存在挂起状态寄存器中,在高优先级中断句柄完成并返回后,若优先级允许,等待状态的中断请求会被触发。 NVIC支持的IRQ包括电平信号和脉冲信号(至少一个时钟周期)。

中断优先级配置

Priority-level configurations registers只有高两位有效,低六位写无效,读为零,所以具有四个可编程优先级,优先级为 0x00 > 0x40 > 0x80 > 0xc0。
之所以使用MSB而不是LSB的原因是为了在设备中更好的移植,如移植到有效位更少的中断优先级配置的设备中,使用低位时,若将高位移除,可能会造成中断优先级变化的情况:例如4位cortex-m4设备移植到3位cortex-m4设备中,0x05和0x03的优先级会在最高位移除的情况下变成0x01和0x03,二者优先级改变。加上3个固有优先级,cortex-m0共有7种优先级层次
在这里插入图片描述

中断请求的仲裁

高优先级抢占低优先级

暂停当前程序代码的执行,处理产生的IRQ叫做抢占;当处理器在执行异常句柄时,收到了优先级更高的IRQ也会发生抢占,则会停下当前中断任务,去执行优先级更高的中断句柄,这也被成为嵌套中断/异常。在新的中断句柄执行完成后,以前的异常程序恢复执行,并在完成后返回线程。

低优先级等待高优先级

当处理器正在执行优先级更高的中断句柄时,后来的低优先级句柄需要进入等待状态,等待高优先级的中断服务程序执行完毕,或者在等待过程中,可以通过软件清除NVIC中中断寄存器的等待状态,这样中断就不会被执行。

同优先级

当两个IRQ具有相同的优先级时,编号更小的IRQ会优先执行。

中断向量表

NVIC支持中断向量表,当cortex-M处理器接收异常请求(中断)时,需要先确定该中断对应的中断句柄的起始地址。中断向量的信息位于存储器的起始位置,被称为中断向量表,向量表包括所有系统支持的中断,起始地址默认为0,向量地址为异常编号*4,向量表一般被定义在微控制器的启动代码中。
启动代码中需包含MSP的初始值,因为NMI等异常可能会接着复位产生,而且此时还没有进行任何初始化操作。
在这里插入图片描述
向量表中的没有被使用到的空间是为其他处理器架构如m3/m4预留的,因为cortex-m0只用到一小部分系统异常。
Note:对于SVC异常,如果SVC指令在具有与SVC异常一样优先级或者更高优先级的异常同时触发时,将会导致hard fault异常句柄执行。

中断和普通线程的切换机制

  1. 进入异常模式
    多个寄存器和返回地址被压入栈中(R0-R3,R12,R14(LR),PC,xPSR )-> 取出异常向量(可能与压栈操作并行执行)->确定异常向量所在地址,取出待执行的异常处理指令 -> 更新NVIC寄存器和内核寄存器
    在异常处理前,MSP或者PSP的值会自动调整,PC会被更新为异常向量的起始地址,LR的值会被更新为名为EXC_RETURN的特殊值(32bit)。EXC_RETURN[31:4] = 28{`b1},低4位用来保存异常流程的状态信息。
  2. 执行异常处理
    处理器进入处理模式,开始执行异常处理程序,等到异常结束后,程序代码执行的返回引起EXC_RETURN被加载到PC中,触发异常返回机制。
  3. 异常返回
    触发异常返回机制后,处理器访问处在栈空间的寄存器数值,并将它们恢复到寄存器组中,NVIC寄存器和PSR,SP,CONTROL都会更新。

Notice: 在exception entry时,生成的EXC_RETURN保存在LR中,异常处理最后阶段将EXC_RETURN load入PC中,PC识别到EXC_RETURN的值触发异常退出机制
在这里插入图片描述
当连续的中断请求发生时:
在这里插入图片描述
EXC_RETURN:
在这里插入图片描述在这里插入图片描述

NVIC寄存器

Overview of NVIC and SCB(system control block) features:
1.灵活的中断控制如使能/关闭,优先级设置
2.硬件嵌套中断支持
3.异常向量入口
4.中断屏蔽

NVIC和SCB都在SCS(system control space)存储器映射地址范围内。
NVIC控制寄存器通过存储空间映射后可以通过C程序访问。NVIC寄存器的起始地址是0xE000E100。Cortex-m0只能通过字访问NVIC寄存器(m3可支持byte/half word/word 访问)。
SCB也只能通过字访问,映射地址的起始地址为0xE000E010。SCB寄存器可以处理systick timer,系统异常管理和优先级控制,睡眠模式控制等功能。

  1. 中断enable/disable(IRQ #0- IRQ#31)
    在这里插入图片描述

  2. Interrupt pending/clear pending
    在这里插入图片描述

  3. 中断优先级控制
    在这里插入图片描述
    在这里插入图片描述
    优先级分别为0x00,0x40,0x80,0xc0四种类型;
    每个寄存器高八位有效,一个地址共四个寄存器;
    优先级高的中断优先处理,同样优先级的中断序号小的先处理。

  4. PRIMASK
    PRIMASK = 1,屏蔽所有除NMI/hard fault外的中断和系统异常

  5. Interrupt latency
    在正常情况下,M0的中断延迟为16个cycles,中断延迟定义为从中断请求发起到处理开始执行中断句柄之间的时间。
    以下情况会增大中断等待时间:(1)存储器系统具有等待状态 (2)在执行更高优先级的中断
    不包括(1) tailing chaining of interrupt(处理正在处理相同或者更高优先级的中断,后来的中断处于挂起阶段,跳过出栈和压栈的过程,大大减小中断等待时间) (2) late arrival (低优先级中断被阻塞,则高优先级的中断等待时间减少)
    在这两种情况下,INT latency会减小到最小值。
    IRQLATENCY是一个跟NVIC连接的8-bit寄存器,用来控制延迟行为
    IRQLATENCY = 0,处理器会尽快开始处理中断请求;
    IRQLATENCY = 1,使能零抖动行为,使得中断等待时间具有更高的延迟。
    IRQLATENCY为可配置的寄存器,但是接口不可见

  6. 系统异常的控制寄存器
    除外部中断外,一部分系统异常的优先级和等待状态寄存器也可以配置,在m0中,只有Systick/SVC/PendSV 三种系统异常可配置。
    ISCR (Interrupt control state):
    (1)可以允许软件控制NMI的挂起。
    (2)PendSV 和 Systick异常的挂起状态
    (3)为调试器提供信息:当前活跃的异常编号,异常是否被挂起
    在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值