Cortex-M3权威指南(中文)
STM32参考手册中文版(第10版)
1 异常与中断(Cortex-M3)
1.1 异常与中断
原话:
Cortex‐M3 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。
其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。
除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。
所有能打断正常执行流的事件都称为异常。
- 异常的概念包含中断的概念,即中断是异常的子集。
- 异常与中断都是硬件支持的。
异常表:
外部中断表:
这里的“外部中断”不是指STM32中的EXTI中断,而是所有中断。
1.2 优先级
原则上,CM3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持128级抢占(preempt)优先级和128 级亚优先级。但各厂商会做裁剪。
- 抢占优先级即高抢占优先级任务可以打断正在执行的低抢占优先级任务,而让CPU转而执行高抢占优先级任务。
- 亚优先级则为多个相同抢占优先级、不同亚优先级的任务同时请求异常时,CPU会先执行高亚优先级的任务。
- 抢占优先级也有称为“先占优先级”。
- “亚优先级”也有会被称为“响应优先级”或“子优先级”。
NVIC 中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。
优先级组分配:(默认为7位抢占)
中断优先级组的配置一般在程序最初设置一次。(中途改变中断优先级组本人没有试过)
1.3 中断与悬起(挂起)
当中断输入脚被assert(确认有效?)后,该中断就被悬起。即使后来中断源取消了中断请求,已经被标记成悬起的中断也被记录下来。到了系统中它的优先级最高的时候,就会得到响应。
但是,如果在某个中断得到响应之前,其悬起状态被清除了(例如,在 PRIMASK 或FAULTMASK 置位的时候软件清除了悬起状态标志),则中断被取消。
当某中断的服务例程开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。
- 中断输入引脚有效后,中断就被悬起,即使取消请求,也会执行。
- 中断是否处于悬起状态,中断请求被响应的关键。
- 中断响应之前,请求以脉冲方式呈现的话,仅看做一次请求(悬起不被软件清除的前提下)。
- 中断被响应时,硬件清除悬起状态。
中断响应中,请求被释放,但又变为有效时,会再次悬起。
中断响应完成之后,中断请求仍然存在,则再次悬起,等待响应。
1.4 SVC和PendSV
SVC(System serVice Call):系统(服务)调用;
SVC异常是必须立即得到响应的,若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬 fault。
PendSV(Pend System serVice):可悬起系统调用。
PendSV 则不同,它是可以像普通的中断一样被悬起的。
PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。
多用于操作系统软件开发中。(uC/OS-II中就用PendSV来实现任务调度)
简单的调度方式:
1. 时间轮转(SysTick)
2. 产生一个系统调用(PendSV设置为最低优先级)
- 任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)
- OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。
- 当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。
- 当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。
- 发生了一个中断,并且中断服务程序开始执行
- 在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。
- OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。
- 当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行
- ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
- 当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。
1.5 CM3中断处理特色——Tail-Chainign
两个同优先级中断交接时,不执行断点恢复和断点数据恢复,直接转到下一个中断执行。
2 中断与事件(未完)
图中:
中断/事件首先经过边沿检测,确认有中断/事件请求发生,与软件中断/事件寄存器相“或”,由请求挂起寄存器记录当前有中断/事件请求发生,之后出现分支:
1. 中断:与中断屏蔽寄存器相“与”,转到NVIC控制器,由其控制。
2. 事件:与事件屏蔽寄存器相“与”,产生脉冲。