STM32中异常、中断、事件辨析
2015-11-28 19:21
281 查看
参考:
Cortex-M3权威指南(中文)
STM32参考手册中文版(第10版)
Cortex‐M3 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。
其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。
除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。
所有能打断正常执行流的事件都称为异常。
异常的概念包含中断的概念,即中断是异常的子集。
异常与中断都是硬件支持的。
异常表:
![](https://img-blog.csdn.net/20151128174411524)
外部中断表:
![](https://img-blog.csdn.net/20151128174503043)
这里的“外部中断”不是指STM32中的EXTI中断,而是所有中断。
抢占优先级即高抢占优先级任务可以打断正在执行的低抢占优先级任务,而让CPU转而执行高抢占优先级任务。
亚优先级则为多个相同抢占优先级、不同亚优先级的任务同时请求异常时,CPU会先执行高亚优先级的任务。
抢占优先级也有称为“先占优先级”。
“亚优先级”也有会被称为“响应优先级”或“子优先级”。
NVIC 中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。
优先级组分配:(默认为7位抢占)
![](https://img-blog.csdn.net/20151128175758036)
中断优先级组的配置一般在程序最初设置一次。(中途改变中断优先级组本人没有试过)
但是,如果在某个中断得到响应之前,其悬起状态被清除了(例如,在 PRIMASK 或FAULTMASK 置位的时候软件清除了悬起状态标志),则中断被取消。
当某中断的服务例程开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。
中断输入引脚有效后,中断就被悬起,即使取消请求,也会执行。
中断是否处于悬起状态,中断请求被响应的关键。
中断响应之前,请求以脉冲方式呈现的话,仅看做一次请求(悬起不被软件清除的前提下)。
![](https://img-blog.csdn.net/20151128183110247)
中断被响应时,硬件清除悬起状态。
中断响应中,请求被释放,但又变为有效时,会再次悬起。
![](https://img-blog.csdn.net/20151128183042367)
中断响应完成之后,中断请求仍然存在,则再次悬起,等待响应。
![](https://img-blog.csdn.net/20151128182532178)
SVC异常是必须立即得到响应的,若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬 fault。
PendSV(Pend System serVice):可悬起系统调用。
PendSV 则不同,它是可以像普通的中断一样被悬起的。
PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。
多用于操作系统软件开发中。(uC/OS-II中就用PendSV来实现任务调度)
简单的调度方式:
1. 时间轮转(SysTick)
![](https://img-blog.csdn.net/20151128184211187)
2. 产生一个系统调用(PendSV设置为最低优先级)
![](https://img-blog.csdn.net/20151128184520658)
任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)
OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。
当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。
当 PendSV 执行完毕后
4000
,将返回到任务 B,同时进入线程模式。
发生了一个中断,并且中断服务程序开始执行
在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。
OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。
当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行
ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。
![](https://img-blog.csdn.net/20151128191452685)
图中:
中断/事件首先经过边沿检测,确认有中断/事件请求发生,与软件中断/事件寄存器相“或”,由请求挂起寄存器记录当前有中断/事件请求发生,之后出现分支:
1. 中断:与中断屏蔽寄存器相“与”,转到NVIC控制器,由其控制。
2. 事件:与事件屏蔽寄存器相“与”,产生脉冲。
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 执行完毕后
4000
,将返回到任务 B,同时进入线程模式。
发生了一个中断,并且中断服务程序开始执行
在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。
OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。
当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行
ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。
1.5 CM3中断处理特色——Tail-Chainign
两个同优先级中断交接时,不执行断点恢复和断点数据恢复,直接转到下一个中断执行。2 中断与事件(未完)
图中:
中断/事件首先经过边沿检测,确认有中断/事件请求发生,与软件中断/事件寄存器相“或”,由请求挂起寄存器记录当前有中断/事件请求发生,之后出现分支:
1. 中断:与中断屏蔽寄存器相“与”,转到NVIC控制器,由其控制。
2. 事件:与事件屏蔽寄存器相“与”,产生脉冲。
相关文章推荐
- jQuery中的常用事件总结
- Ruby中的异常处理代码编写示例
- C#实现WinForm捕获最小化事件的方法
- c#事件使用示例详解
- C#中的事件介绍
- C#实现自定义双击事件
- MySQL抛出Incorrect string value异常分析
- extjs 为某个事件设置拦截器
- jQuery阻止同类型事件小结
- jQuery bind事件使用详解
- jQuery支持添加事件的日历特效代码分享(3种样式)
- C#中委托和事件的区别实例解析
- SQLSERVER中得到执行计划的两种方式
- C#中事件的动态调用实现方法
- ASP.NET中实现定制自己的委托和事件参数类
- C#处理Paint事件的方法
- javascript下利用for( in )语句 获得所有事件名称的代码
- 关于JavaScript与HTML的交互事件
- JavaScript 学习笔记(十六) js事件
- JQuery实现表格动态增加行并对新行添加事件