1.中断概述
“中断”就是当前的任务被更紧要的事件打断。这些事件如不及时处理可能导致系统故障:
- 例如,UART收到数据后不及时取走导致数据丢失
- 再来一个更严重的:电源故障中断不及时处理导致系统意外关机
- 话说回来,并不是所有中断都必须实时响应。例如,UART发送完毕后会发中断通知CPU,但是晚些处理也只是导致吞吐能力降低。
中断也是一种CPU时间复用模型
- CPU暂停当前正执行的程序(后台)并保存反映当前CPU处理状态的一些寄存器——“中断现场”(Context),转而处理待响应的事件(前台),处理完成后恢复“现场”并继续原先执行的程序。
- 因为CPU很快,所以看起来像是并行地处理了后台与前台任务
中断的概念源于生活,低于生活:
- 放学回家做作业->吃晚饭->接电话->继续吃晚饭->吃完晚饭继续做作业
- 其中,“接电话”就是所谓的嵌套中断
2.中断响应全过程模式图
3.为什么需要中断
3.1 对突发情况紧急处理 (电话是你正在追的女孩打来的)
3.2 因为CPU相对人来说还是非常快的,实现宏观上的并行多任务。
(你在晚上做了作业,吃了饭,还接了电话。因为你的一天只是天上1秒,于是玉皇大帝很高兴他一眨眼的工夫你已经”并行”地做好了三件事)
例如,一边计算一边采集一边执行
3.3 解决CPU与慢速外设和偶发事件速度不一致的矛盾(你不用流着口水在厨房等饭熟了)
4.常见的使用中断的场合
4.1 引脚状态变化产生中断,也是常见的“外部中断”
一般是反映外部产生的事件,例如按钮按下、片外外设通知事件等
4.2 通信接口的收到数据与发送完毕中断
- 一个数据单位发送完毕时,产生中断,通知应用逻辑继续提供数据
- 进一步地,发送器闲置中断可使应用逻辑更早地注入新数据
- 接收器中有数据时,产生中断,通知应用逻辑取走数据
4.3 定时器溢出/倒数至0时,产生中断,通知时间到
4.4 模拟比较器结果翻转时产生中断
4.5 模数转换器采样完毕时产生中断
4.6 其它一些紧急的偶发事件:
- 没有及时喂狗时的看门狗中断
- 供电电压不足产生中断
5.中断服务例程 (ISR, Interrupt Service Routine)
5.1 响应中断时,CPU将会例行地调用一段程序,用以执行中断发生后需要立即处理的事。这段程序即为“中断服务例程”。ISR常见的例行工作包括:清除中断事件标志
5.2 ISR因为打断了当前的工作,所以要尽量短小精焊,只做必须马上处理的事
6.中断延迟
6.1从中断请求发起到ISR得到执行所花费的时间,称为中断延迟
- 现场保存(最少24周期)
- 如果此时中断被关闭(临界区),需要待中断重新打开后才能响应
- 如果此时正在服务同等或更高优先级的中断,需待其ISR退出
7.中断的代价
7.1 现场需要额外的栈空间来保存:LPC82x需要32字节保存现场
7.2 现场保存和恢复需要额外的时间:LPC82x需要约24周期
7.3 打乱了程序执行顺序,可能导致错综复杂的潜在问题。
- 执行流程变得不可预测,变数增加,时序难保证,故障难复现。
- 需要保证ISR与其它程序段互斥访问全局变量,尤其是复合型全局变量(struct)。如果处理不当会导致难以调试的竞争条件,可能导致数据紊乱的问题
- 竞争条件举例:假如后台程序和ISR都要执行”a++;”语句,a初始值为0
- 后台程序读取a到寄存器,得到0
- 后台程序在寄存器中把0加到1,然后,早不来晚不来,中断偏偏这个时候来了:
- ISR读取a到寄存器,也得到0
- ISR在寄存器中把0加到1
- ISR把寄存器中的1写回a,a现在等于1
- 后台程序也把寄存器中的1写回a,a现在还等于1
- 看到没,执行了两次a++后,a实际上只被++了一次!
- 竞争条件举例:假如后台程序和ISR都要执行”a++;”语句,a初始值为0
8.临界区与需要关闭中断的场合
有些场合必须关中断,必须在关中断时执行的代码又称为“临界区”(critical section), 有以下典型情况:
8.1 当后台程序与ISR均要更改同一位置的数据时,要先关中断,待改完后再开中断。否则会导致竞争冒险的情况,可能使数据紊乱
8.2 当后台程序与ISR均要操控同一外设时,要先关中断,待访问完毕后再开中断,否则轻则使外设输出混叠,重则使外设功能混乱。
- 例如,后台程序和ISR都要使用同一个UART,后台程序要输出”I love u!”,ISR要输出”Anna Li”, 若后台程序在输出期间未关中断,可能输出“I love Anna Liu!”
- 又如,在调用IAP函数擦写Flash时,如果未关中断,可能导致擦写期间又从Flash取指令(ISR的指令)的情况,导致死机
8.3 当控制对时序有严格要求的器件时,需要关中断以保证确定性
8.4 以上注意事项也适用于低优先级ISR与高优先级ISR之间。
8.5 使用RTOS时,多任务的调度修改了中断的返回地址,使得以上注意事项扩展到RTOS管理的任务间。
9.临界区未关中断的示意效果演示
10.Cortex-M0+上中断系统的增强功能
10.1 自动保存和恢复共计32字节的中断现场 (8个CPU寄存器)
- 当前RAM和Flash的内容则不属于“现场”
- 事实上,它们不是CPU的组成部分
10.2 使用普通的函数调用方式返回,不需要专用的返回指令
10.3 自带中断控制器NVIC管理外设和外部中断。
10.4 因为以上的优点,中断处理无需使用汇编,也无需使用特殊的编译器扩展功能,写法和普通的程序相同
- 这并不意味着ISR变成普通程序了,中断处理的注意事项仍需遵守。
1262