2021-08-10
关键字:中断的概念
1、中断的概念与分类
中断说白了就一句话:临时去处理一下其它事。
这个“其它事”具有以下特点:
1、突发性;
2、短暂性;
Linux驱动开发中的中断分类方式较多,大体上可分为以下三个类别:
1、硬中断与软中断;
2、外部中断与内部中断;
3、同步中断与异步中断;
硬中断是由具体的、除CPU以外的设备产生的。软中断则是由程序发生的。
外部中断是由外设产生的,可以简单理解成就是硬中断。内部中断亦可以简单理解成就是软中断。
同步中断是发生在CPU指令执行过程中的,它只有在当前指令执行完后才会产生。同步中断一般是因为程序错误引起的。同样它可以简单理解成就是内部中断。异步中断的发生则不需要依赖于指令的执行状况,它可在任何时刻发生。它可以简单理解成就是外部中断。
2、中断在Linux中的运行机理
Linux中断系统可以简单划分成是由三个角色组成的:
1、中断发生器;
2、信号传输导线;
3、中断处理器;
中断系统的关键就是“信号”。发生器会将其动作以电信号的形式通知到处理器,每个信号线都有一个唯一的编号,驱动程序通过这些编号来向系统申请监听中断。通常在中断处理器内部还会再引入一个“中断控制器”的角色用以对中断信号做全局级别的控制。
3、中断处理过程
具体如下步骤所示:
- 中断信号生成;
- 信号经由传输线传递至处理器中的中断控制器;
- 中断控制器按配置过滤中断信号;
- 未被拦截的中断信号通过内部数据总线传递至CPU核心;
- 核心程序收到后决定是自行消化还是交由驱动程序进一步处理;
对应的示例图如下所示:
中断控制器的职责就是不断地检查各条中断线其上是否有信号产生。如果同一时刻有多条信号线产生了中断信号,则中断控制器会优先处理中断编号较小的中断线信号。
可以被传递给CPU核心的中断信号会先被中断控制器暂存在“端口A”中,然后中断控制器会通过INRT脚通知到CPU有中断信号可供读取。随后CPU核心会在一个恰当的时机通过内部数据总线将中断信号读取进来处理。
如果中断信号是由外部设备引起的,则CPU核心在收到信号后会先发送一个“应答信号”到中断控制器以表示正在处理此中断。此应答信号可用于阻止外设的重复中断信号。
4、Linux中断的申请与释放
Linux驱动开发中中断的申请函数原型如下所示:
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char* devname, void* dev_id);
参数irq表示中断号;
参数handler表示中断处理函数地址。
参数irqflags用于控制中断处理的属性。
参数devname表示设备的名称,此名称会在 /proc/interrupts 中显示,用于记录中断号与设备之间的关系。
参数dev_id是为共享中断线设立的,如果中断信号不需要共享功能,置NULL即可。
中断释放函数原型如下所示:
void free_irq(unsigned int irq, void* dev_id);
参数irq表示中断号。
参数dev_id是为共享中断线而设置的。