linux内核设计与实现-第7章 中断和中断处理

  • 7.1 中断

中断值通常被称为中断请求线(IRQ)

异常也常常被称为同步中断

  • 7.3 上半部与下半部的对比

一般把中断处理分为两个部分或两半,中断处理程序是上半部,能够被允许稍后完成的工作会推迟到下半部去。

  • 7.4 注册中断处理程序

驱动程序通过request_irq()函数注册一个中断处理程序

#include <linux/interrupt.h>
typedef irqreturn_t (*irq_handler_t) (int, void *);
/* request_irq:分配一条给定的中断线 */
int request_irq(unsigned int irq,irq_handker_t handler,unsigned long flags,const char *name,void *dev)

 

第三个参数 flags可以为0,也可以是位掩码。

定义在<linux/interrupt.h>

标志位

说明

IRQF_DISABLED

处理中断处理程序本身期间,禁止其它所有中断

IRQF_SAMPLE_RANDOM

产生的中断对内核熵池有贡献

IRQF_TIMER

该中断是特别为系统定时器的中断处理而准备的

IRQF_SHARED

可以在多个中断处理程序之间共享中断线

  • 7.4.3 释放中断处理程序

 

中断注册方法表

 

函数

描述

request_irq()

在给定的中断线上注册一给定的中断处理程序

free_irq()

如果在给定的中断线上没有中断处理程序,则注销响应的处理程序,并禁用其中断线

  • 7.5 编写中断处理程序

中断处理程序 声明

static irqreturn_t intr_handler(int irq, void *dev)
  • 7.5.1 共享的中断处理程序

内核接收一个中断后,它将依次调用在该中断线上注册的每一个处理程序。因此,一个处理程序必须知道它是否应该为这个中断负责

 

  • 7.8 /proc/interrupts 系统中与中断相关的统计信息

 

  •  7.9.1 禁止和激活中断

local_irq_disable();
/**禁止中断*/
local_irq_enable();

 

  • 7.9.2 禁止指定中断线

void disable_irq(unsigned int irq);
void disable_irq_nosync(unsigned int irq);
void enable_irq(unsigned int irq);
void synchronize_irq(unsigned int irq);

 

禁止多个中断处理程序共享的中断线是不合适的。禁止中断线也就禁止了这条线上所有设备的中断传递。因此,用于新设备的驱动程序应该倾向于不使用这些接口。

根据规范,PCI设备必须支持中断线共享。因此,他们根本不应该使用这些接口。

  • 7.9.3 中断系统的状态

#include <asm/system.h>
#include <asm/irq.h>

irqs_disable() //宏。本地处理器中断系统被禁止,返回非0,否则返回0
#include <linux/hardirq.h>
in_interrupt()
in_irq()

 

表7-2 中断控制方法的列表

 

函数

说明

local_irq_disable()

禁止本地中断传递

local_irq_enable()

激活本地中断传递

local_irq_save()

保存本地中断传递的当前状态,然后禁止本地中断传递

local_irq_restore()

恢复本地中断传递到给定的状态

disable_irq()

禁止本地中断线,并确保该函数返回之前在该中断线上没有处理程序在运行

disable_irq_nosync()

禁止给定中断线

enable_irq()

激活给定中断线

irqs_disabled()

如果本地中断线传递被禁止,则返回非0,否则返回0

in_interrupt()

如果在中断上下文中,则返回非0,如果在进程上下文中,则返回0

in_irq()

如果当前正在执行中断处理程序,则返回非0,否则返回0

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-02-28 16:38  my_flash  阅读(46)  评论(0)    收藏  举报