• 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

快速了解中断相关知识

02/05 17:03
1262
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1.中断概述

“中断”就是当前的任务被更紧要的事件打断。这些事件如不及时处理可能导致系统故障:

  • 例如,UART收到数据后不及时取走导致数据丢失
  • 再来一个更严重的:电源故障中断不及时处理导致系统意外关机
  • 话说回来,并不是所有中断都必须实时响应。例如,UART发送完毕后会发中断通知CPU,但是晚些处理也只是导致吞吐能力降低。

中断也是一种CPU时间复用模型

  • CPU暂停当前正执行的程序(后台)并保存反映当前CPU处理状态的一些寄存器——“中断现场”(Context),转而处理待响应的事件(前台),处理完成后恢复“现场”并继续原先执行的程序。
  • 因为CPU很快,所以看起来像是并行地处理了后台与前台任务

中断的概念源于生活,低于生活:

  • 放学回家做作业->吃晚饭->接电话->继续吃晚饭->吃完晚饭继续做作业
  • 其中,“接电话”就是所谓的嵌套中断

2.中断响应全过程模式图

3.为什么需要中断

3.1 对突发情况紧急处理 (电话是你正在追的女孩打来的)

3.2 因为CPU相对人来说还是非常快的,实现宏观上的并行多任务。

(你在晚上做了作业,吃了饭,还接了电话。因为你的一天只是天上1秒,于是玉皇大帝很高兴他一眨眼的工夫你已经”并行”地做好了三件事)

例如,一边计算一边采集一边执行

3.3 解决CPU与慢速外设和偶发事件速度不一致的矛盾(你不用流着口水在厨房等饭熟了)

  • CPU平时可处理其它工作
  • 仅当事件发生时再处理
  • 如果没有中断系统,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因为打断了当前的工作,所以要尽量短小精焊,只做必须马上处理的事

  • 例外:有些超低功耗的简单的系统平时一直待机,仅在中断产生时唤醒,并且在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实际上只被++了一次!

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变成普通程序了,中断处理的注意事项仍需遵守。

相关推荐

电子产业图谱