中断

文章目录

    • 1 中断的概念
    • 2 中断服务程序(ISR)
    • 3 中断的意义
    • 4 中断的类型
    • 5 中断的优先级
    • 6 中断的应用
      • 6.1 中断的应用-程序断点
      • 6.2 程序断点的实现原理
      • 6.3 一个工程产品案例的剖析
        • 6.3.1 背景及痛点
        • 6.3.2 常规解决方案-日志调试法
        • 6.3.3 解决方案

1 中断的概念

中断是一种处理器与外设进行通信的机制,用于通知处理器外部有重要事件发生。一般情况下,中断需要被处理器响应。


2 中断服务程序(ISR)

  1. 从外设中读取中断状态寄存器的值,以便了解中断类型。
  2. 根据中断类型具体设计处理逻辑。
  3. 清除外设状态寄存器中的中断标识位。
  4. 清除处理器中的中断标识位。

中断_第1张图片

注意,对于软件工程师中的中断服务程序:

  • 不能有返回值,不能有参数传递(假设有返回值和参数,那么返回值返回给谁呢?谁来传递参数呢?)。
  • 必须短小而高效,避免浮点运算。

如下的中断服务程序就是有问题的:
中断_第2张图片


3 中断的意义

  • 应用程序不必关心中断的发生与处理。
  • 中断服务程序不必关心应用程序的执行状态。
  • 中断是“上层应用”与“底层代码”的“分割边界”。

中断_第3张图片


4 中断的类型

硬中断:

  • 通过处理器中断信号产生的中断。

软中断:

  • 通过非法指令或特殊指令触发的中断。

5 中断的优先级

  • 多个中断同时出现时,处理器先响应高优先级的中断。
  • 低优先级中断的ISR执行时,可以被高优先级中断再次打断。
  • ISR比App Code拥有更高的执行优先级。

6 中断的应用

6.1 中断的应用-程序断点

断点指的是调试工具用于暂停代码执行的指令位置,断点的实现原理为处理器的中断支持:

  • 软件断点:利用非法指令异常产生中断实现。
  • 硬件中断:利用中断寄存器的特性产生中断实现。

中断_第4张图片

6.2 程序断点的实现原理

  1. 获取原程序指定行对应的代码地址。
  2. 把代码地址中的指令替换为中断触发指令。
  3. 在中断服务程序中将控制权交给调试程序。
  4. 调试程序读写原程序上下文信息。
  5. 调试程序将代码地址中的指令还原。
  6. 原程序从断点处继续向下执行。

中断_第5张图片

6.3 一个工程产品案例的剖析

6.3.1 背景及痛点

背景:

  • 嵌入式实时系统对时序的要求比较严格。
  • 各个线程的执行有相对严格的时序要求。

痛点:

  • 断点调试在嵌入式实时系统中不适用。

6.3.2 常规解决方案-日志调试法

日志调试法:

  • 在代码中的“关键位置”添加打印语句。
  • 打印语句尽可能详细的打印上下文信息(函数名、局部变量等)。
  • 当系统出现问题时,查看日志文件,分析问题。

日志调试法存在的问题:

  • 不易维护:打印语句分散于产品代码的各个角落。
  • 影响效率:过多的打印语句意味着过多的IO操作,影响产品的整体执行效率。
  • 分析困难:当日志输出非常多的时候,很难精确定位问题。也许只有添加打印语句的工程师看得懂日志输出。

6.3.3 解决方案

一个疯狂的想法: 同时结合日志调试法和断点调试法的优点,使得实时系统调试时,能够任意查看指定代码行上下文的信息;并且,不增加打印语句,不暂停执行。

解决方案:

  1. 获取原程序指定行对应的代码地址。
  2. 把代码地址中的指令替换为中断触发指令。
  3. 在中断服务程序中抓取全局信息和栈信息。
  4. 抓取的信息发送回调试程序解析并输出。

实践结果:

  • 基于ARM+Linux平台完整实现。
  • 通过中断原理成功获取上下文信息。
  • 完全不影响程序的执行时序。
  • 产品关键技术点:
    • 中断,ISR,编译信息,GDB
    • GUI,Socket,多线程

你可能感兴趣的:(计算机系统)