嵌入式系统 - 中断管理

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_27421407/article/details/78845894

教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社


嵌入式系统开发

中断管理

实时内核的中断管理

广义中断的类别

通常被分为中断、自陷和异常(exception)

  • 中断是由于CPU外部的原因而改变程序执行流程的过程,属于异步事件,又称为硬件中断。自陷和异常则为同步事件
  • 自陷表示通过处理器所拥有的软件指令、可预期地使处理器正在执行的程序的执行流程发生变化,以执行特定的程序。自陷是显式的事件,需要无条件地执行
  • 异常为CPU自动产生的自陷,以处理异常事件。异常没有对应的处理器指令,当异常事件发生时,处理器也需要无条件地挂起当前运行的程序,执行特定的处理程序

中断的功能

  • 提高系统效率
  • 确保关键的功能及时执行

中断的分类

分类方式

  • 硬件中断是否可以被屏蔽:可屏蔽中断和不可屏蔽中断
  • 中断源:硬件中断和软件中断
  • 中断信号的产生:边缘触发中断和电平触发中断
  • 中断服务程序的调用方式:向量中断、直接中断和间接中断

可屏蔽中断和不可屏蔽中断

  • 可屏蔽中断:能够被屏蔽掉的中断
    • 外部设备的中断请求信号一般需要先通过CPU外部的中断控制器,再与CPU相应的引脚相连
    • 可编程中断控制器可以通过软件进行控制,以禁止或是允许中断
  • 不可屏蔽中断:在任何时候都不可屏蔽的
    • 一个比较典型的例子是掉电中断,当发生掉电时,无论程序正在进行什么样的运算,它都肯定无法正常运行下去。这种情况下,急需进行的是一些掉电保护的操作。
    • 对这类中断,应随时进行响应

硬件中断和软件中断

  • 硬件中断:由于CPU外部的设备所产生的中断
    • 可能在程序执行的任何位置发生,发生中断的时间通常是不确定的
    • 异步事件
  • 软件中断:同步中断或是自陷,通过处理器的软件指令来实现
    • 产生中断的时机是预知的,可根据需要在程序中进行设定
    • 软件中断的处理程序以同步的方式进行执行
    • 系统可通过该机制在用户模式执行特权模式下的操作
    • 软件调试的一个重要手段

边缘触发中断和电平触发中断

  • 边缘触发中断:
    • 中断线从低变到高或是从高变到低时,中断信号就被发送出去,并只有在下一次的从低变到高或是从高变到低时才会再度触发中断
    • 事件发生的时间非常短,有可能出现中断控制器丢失中断的情况
  • 电平触发中断:
    • 在硬件中断线的电平发生变化时产生中断信号,并且中断信号的有效性将持续保持下去,直到中断信号被清除
    • 能够降低中断信号传送丢失的情况

向量中断、直接中断和间接中断

  • 向量中断:

    • 通过中断向量来调用中断服务程序
    • 每个中断向量对应一个中断服务程序(interrupt service routine,ISR),用来存放中断服务程序的入口地址或是中断服务程序的第一条指令
    • 系统中通常包含多个中断向量,存放这些中断向量对应中断服务程序入口地址的内存区域被称为中断向量表
    • ARM 的中断向量表开始于内存地址 0x00000000 或是 0xFFFF0000 处
  • 直接中断:

    中断对应的中断服务程序的入口地址是一个固定值,当中断发生的时候,程序执行流程将直接跳转到中断服务程序的入口地址,执行中断服务程序

  • 间接中断

    中断服务程序的入口地址由寄存器提供

中断处理过程

中断检测

  • 每条指令结束时进行,检测是否有中断请求或是否满足异常条件

  • 中断和指令周期
    中断和指令周期

中断响应

处理器内部硬件完成的中断序列,而不是由程序执行的

中断处理

  • 执行中断服务程序

  • 尽管导致自陷、异常和中断的事件不同,但大都具有相同的中断服务程序结构

  • 中断服务程序的主要内容

    • 保存上下文:保存中断服务程序将要使用的所有寄存器的内容,以便于在退出中断服务程序之前进行恢复;
    • 如果中断向量被多个设备所共享,为了确定产生该中断信号的设备,需要轮询这些设备的中断状态寄存器;
    • 获取中断相关的其他信息;
    • 对中断进行具体的处理;
    • 恢复保存的上下文;
    • 执行中断返回指令,使CPU的控制返回到被中断的程序继续执行
  • 非嵌套的中断处理方式

    在处理一个中断的时候,禁止再发生中断

  • 嵌套的中断处理方式:

    定义中断优先级,允许高优先级的中断打断低优先级中断的处理过程

实时内核的中断管理

  • 中断服务程序通常包括三个方面的内容:

    • 中断前导:保存中断现场,进入中断处理。
    • 用户中断服务程序:完成对中断的具体处理。
    • 中断后续:恢复中断现场,退出中断处理
  • 中断前导和中断后续通常由内核的中断接管程序来负责

  • 如果实时内核没有提供单独的中断栈,就需要为任务栈留出足够的空间,不但要考虑通常的函数嵌套调用,还需要满足中断嵌套的需要

  • 实时内核通常提供如下中断管理功能

    • 挂接中断服务程序
      把一个函数(用户中断服务程序)同一个虚拟中断向量表中的中断向量联系在一起。当中断向量对应中断发生的时候,被挂接的用户中断服务程序就会被调用执行;

    • 获得中断服务程序入口地址
      根据中断向量,获得挂接在该中断向量上的中断服务程序的入口地址;

    • 获取中断嵌套层次
      在允许中断嵌套的处理中,获取当前的中断嵌套层次信息;

    • 开中断;

    • 关中断

用户中断服务程序

  • 由于中断服务程序中通常都对中断进行了屏蔽,要求中断服务程序应该尽可能比较短,保证其他中断和系统中的任务能够得到及时处理

  • 中断服务程序通常都只处理一些必要的操作,其他操作则通过任务的方式来进行

  • 用来配合中断服务程序的另外的任务通常被称为DSR(deferred service routine)

  • 在中断服务程序中可以使用实时内核提供的应用编程接口

  • 中断服务程序不能进行内存分配和内存释放,也不能使用包含了这些操作的编程接口

  • 对中断的处理不受任务调度程序的控制,并优先于任务的处理

    • 如果中断出现被阻塞的情况,将导致中断不能被及时处理,其余工作也就无法按时继续进行,将严重影响整个系统的确定性
  • 中断服务程序还需要同系统中的任务进行通信。从中断服务程序到任务的通信机制主要包括以下内容:

    • 共享内存:
      中断服务程序同任务共享变量、缓冲区,实现中断服务程序与任务之间的通信;

    • 信号量:
      中断服务程序可以释放任务正在等待的信号量;

    • 消息队列:
      中断服务程序可以把消息发送给正在等待该消息的任务;

    • 管道:
      中断服务程序可以把消息写到任务可以进行消息读取的管道中;

    • 异步信号:
      中断服务程序可以向任务发送异步信号,使任务对应的异步信号处理程序能够得到执行

中断时序

中断时序图

  • 前后台系统的中断时序图
    前后台系统的中断时序图

  • 非抢占式调度内核的中断时序图
    非抢占式调度内核的中断时序图

  • 抢占式调度内核的中断时序图
    抢占式调度内核的中断时序图

  • 中断服务程序在完成中断事件的处理后

    • 前后台系统中,程序回到后台程序
    • 非抢占式调度内核中,程序回到被中断的任务
    • 抢占式调度内核中,使处于就绪态的优先级最高的任务运行。该任务可能是原先被打断的任务,也可能是在ISR执行过程中新就绪的任务

中断延迟时间

  • 中断延迟时间是指从中断发生到系统获知中断,并且开始执行中断服务程序所需要的最大滞后时间
  • 中断延迟时间受到系统关中断时间的影响
  • 关中断的时间越长,中断延迟就越长,并且可能引起中断丢失
  • 中断延迟时间 = 最大关中断时间+硬件开始处理中断到开始执行ISR第一条指令之间的时间
  • 关中断的最长时间应该是内核关中断时间和应用关中断时间的最大值

中断响应时间

  • 中断响应时间是从中断发生到开始执行用户中断服务程序的第一条指令之间的时间

  • 中断延迟时间与中断响应时间的区别:

    • 前者指到中断服务程序的第一条指令;
    • 而后者指到用户的中断服务程序的第一条指令
  • 前后台系统和非抢占式调度系统

    中断响应时间 = 中断延迟 + 保存CPU内部寄存器的时间

  • 抢占式调度系统

    中断响应时间 = 中断延迟 + 保存CPU内部寄存器的时间 + 内核中断服务程序入口函数的执行时间

中断恢复时间

  • 用户中断服务程序结束后回到被中断代码之间的时间

  • 前后台系统和非抢占式调度系统

    中断恢复时间 = 恢复CPU内部寄存器的时间 + 执行中断返回指令的时间

  • 抢占式调度系统

    中断恢复时间 = 内核中断服务程序出口函数执行时间+ 恢复即将运行任务的CPU内部寄存器的时间 + 执行中断返回指令的时间

中断处理时间

  • 用户的中断处理是由应用决定的
  • 中断服务的处理时间应该尽可能地短
  • 中断服务程序:
    • 识别中断来源;
    • 从产生中断的设备取得数据或状态;
    • 通知真正处理该事件的那个任务来进行实际的中断处理工作
展开阅读全文

没有更多推荐了,返回首页