《Cortex-M3权威指南》之异常

异常类型

  1. 异常指的是所有能打断正常执行流的事件。
  2. 异常可以分为系统异常和外部中断。编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。
  3. 系统异常如复位、NMI、硬(hard)fault、总线fault等;外部中断如外部引脚中断、UART外设中断等。
  4. 如果一个发生的异常不能被即刻响应,就称它被**“悬起”(pending)**。一个异常被悬起的原因,可能是系统当前正在执行一个更高优先级异常的服务例程,或者因相关掩蔽位的设置导致该异常被除能。对于每个异常源,在被悬起的情况下,都会有一个对应的“悬起状态寄存器”保存其异常请求,直到该异常能够执行为止。

优先级的定义

优先级的数值越小,则优先级越高。CM3 支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常。
CM3可支持多达 256 级的可编程优先级,但大多数实际芯片都会精剪设计,如只使用了 3 个位来表达优先级,只能够使用的 8 个优先级为:0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0 以及 0xE0。
在这里插入图片描述
为了使抢占机能变得更可控,CM3 还把 256 级优先级按位分成高低两段,分别是抢占优先级和亚优先级
在这里插入图片描述

向量表

当发生了异常并且要响应它时,CM3 需要定位其处理例程的入口地址。这些入口地址存储在所谓的“(异常)向量表”中。缺省情况下,CM3 认为该表位于零地址处,且各向量占用 4 字节,因此每个表项占用 4 字节,
在这里插入图片描述
为了动态重分发中断,CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是 RAM 区。

中断输入及悬起行为

当中断输入脚被 assert 后,该中断就被悬起。即使后来中断源取消了中断请求,已经被标记成悬起的中断也被记录下来。到了系统中它的优先级最高的时候,就会得到响应。
如果在某个中断得到响应之前,其悬起状态被清除了(例如,在 PRIMASK 或FAULTMASK 置位的时候软件清除了悬起状态标志),则中断被取消。如图 7.9 所示。
在这里插入图片描述
当某中断的服务例程开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除,如图 7.10 所示。在一个中断活跃后,直到其服务例程执行完毕,并且返回(亦称为中断退出,第九章详细讨论)了,才能对该中断的新请求予以响应(即单实例)。
在这里插入图片描述
如果中断源咬住请求信号不放(即进入中断服务函数后没有清中断请求标志),该中断就会在其上次服务例程返回后再次被置为悬起状态,并再次进入中断服务函数,如图 7.11 所示。
在这里插入图片描述
如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则被视为只有一次中断请求,多出的请求脉冲全部错失——这是中断请求太快,以致于超出处理器反应限度的情况。
在这里插入图片描述
如果在服务例程执行时,中断请求释放了,但是在服务例程返回前又重新被置为有效,则 CM3 会记住此动作,重新悬起该中断。如图 7.13 所示。
在这里插入图片描述

Fault类异常

总线fault

当 AHB 接口上正在传送数据时,如果回复了一个错误信号(error response),则会产生总线 faults。

存储器管理fault

存储器管理faults多与MPU有关,其诱因常常是某次访问触犯了MPU设置的保护策略。另外,某些非法访问,例如,在不可执行的存储器区域试图取指,也会触发一个 MemManage fault,而且即使没有 MPU 也会触发。

用法fault

用法 faults 发生的场合可以是:

  • 执行了未定义的指令;
  • 执行了协处理器指令(Cortex‐M3 不支持协处理器,但是可以通过 fault
    异常机制来使用软件模拟协处理器的功能,从而可以方便地在其它 Cortex 处理器间移植);
  • 尝试进入 ARM 状态(因为 CM3 不支持 ARM 状态,所以用法 fault 会在切换时产生。软件可以利用此机制来测试某处理器是否支持
    ARM 状态);
  • 无效的中断返回(LR 中包含了无效/错误的值);
  • 使用多重加载/存储指令时,地址没有对齐;
    另外,通过设置 NVIC 的对应控制位,可以在下列场合下也产生用法 fault:
  • 除数为零;
  • 任何未对齐的访问;

硬fault

SVC和PendSV

SVC(系统服务调用,亦简称系统调用)和 PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值