嵌入式中异常/中断/事件的区别

嵌入式中异常/中断/事件的区别

Cortex-M3在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。

其中,编号1-15的对应系统异常,大于等于16的则都是外部中断

除了个别异常的优先级被定死之外,其余异常的优先级都是可编程的

我们通常把能够打断正常执行流的事件称之为异常

异常的概念中包含了中断的概念,即中断是异常的子集

异常与中断的触发都是硬件支持的

编号 类型 优先级 简介
0 N/A N/A 没有异常在运行
1 复位 -3(最高优先级) 复位
2 NMI -2 不可屏蔽中断(来自外部NMI输入脚)
3 硬(hard)fault -1 所有被除能的fault,都将上访(escalation)成为硬fault,只要FAULTMASK没有置位,硬fault服务例程就会被强制执行,Fault被除能的原因包括被禁用,或者FAULTMASK被置位
4 MemManage fault 可编程 存储器管理fault,MPU访问犯规以及访问了非法的位置均可以引发,企图在非执行区取值也会引发该错误。
5 总线fault 可编程 从总线系统收到了错误响应,原因可以是预取流产(abort)或数据流产,或者企图访问协处理器
6 用法fault 可编程 由于程序错误导致的异常,通常是使用了一条无效的指令,或是非法的状态转换,例如尝试切换到ARM状态
7-10 保留 N/A N/A
11 SVCall 可编程 执行系统服务调用指令(SVC)引发的异常
12 调试监视器 可编程 调试监视器(断点,数据观察点,或是外部调试请求)
13 保留 N/A N/A
14 PendSV 可编程 为系统设备而设的“可悬挂请求”(pendable request)
15 SysTick 可编程 系统滴答定时器(周期性溢出的时基定时器)

##### 外部中断表

编号 类型 优先级 简介
16 IRQ #0 可编程 外中断#0
17 IRQ #1 可编程 外中断#1
255 IRQ #239 可编程 外中断#2

#### 优先级

原则上,CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占优先级和128级亚优先级

1.抢占优先级及高抢占优先级 任务可以打断正在执行的低抢占优先级任务,而让cpu转而执行高抢占优先级的任务

2.亚优先级则为多个相同的抢占优先级,不同的亚优先级的任务同时请求异常时,CPU会执行高亚优先级的任务。

3.抢占优先级有时也被称为“先占优先级”

4.“亚优先级”会被称为“响应优先级”或“子优先级”

#### 中断与挂起

当中断输入脚被assert(确认有效后),该中断就被挂起,即使后来中断源取消了中断请求,已经被标记为挂起的中断也会被记录下来。到了系统中它的优先级达到最高是,就会得到响应。但如果在某个中断得到相应之前,他的悬起状态被清除了(例如在PRIMASK或FAULTMASK置位的时候软件清除了悬起状态标识),则中断被取消。当某个中断的服务例程开始执行的时候,则称该中断进入了活跃的状态,他的挂起标志位会被硬件自动清除。

#### SVC和PendSV

SVC(system service call):系统服务调用

SVC异常是必须立即得到响应的,若因为优先级不比当前正在处理的高,或是其他的原因使之无法立即响应,将会上访为硬fault。

PendSV(pend system service):可挂起系统调用

PendSV则不同,它可以像普通中断一样被挂起。

PendSV的典型使用场合是在上下文切换的时候(即不同任务间的切换)

eg:
//任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)
//OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。(使用pendSV来进行上下文切换)
//当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。
//当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。
//发生了一个中断,并且中断服务程序开始执行(因为PendSV的优先级最低,所以会中断执行ISR中的中断请求)
//在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。(第15号异常,系统的滴答计时器)
//OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。
//当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行
//ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
//当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。(相当于在任务A中执行了一个任务B)

CM3的中断处理特点

两个相同优先级的中断在交接的过程中,不需要执行断点恢复和断点数据恢复,直接跳转到下一个中断执行

一般事件若想变成中断事件,需要有相关中断使能位的允许,中断事件再向CPU执行对应的中断请求,在NVIC配置相应的中断矢量后,CPU便参与进行后续的中断响应服务【保存现场,执行中断服务程序,恢复现场并返回】,非中断时间就不会有后续的流程,只是有一些硬件触发信号或标志的产生。

与之相互对应,既然一个可以触发中断的事件可以被配置为中断事件或非中断事件,则相关事件的触发方式,即允许产生中断或禁止产生中断

例如STM32的GPIO口的电平跳变基本都是可以触发外部中断的,但在具体的使用配置过程中,可以根据需要来决定是启用还是禁用相关引脚的功能,从而选择不同的事件触发方式。

你可能感兴趣的:(kernel)