对中断的理解

1.中断是一种可以使CPU和硬件设备进行通信的技术。例如,当我们在敲击键盘时,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下。从本质上说,中断是一种特殊的信号,由硬件设备向CPU发送。当CPU接收到中断信号后,就会马上通知操作系统此信号的到来,然后由操作系统负责处理这些新到来的数据。

2.中断请求:不同的设备对应的中断不同,每一个中断都通过一个唯一的数字标识。这些数字表示的中断值被称为中断请求(IRQ, Interrupt Request)线,也可称为IRL(Interrupt Request Lines)。

3.中断处理程序:在响应一个特定中断时,内核会执行一个函数,这个函数叫做中断处理程序(interrupt handler),也可称为中断服务例程(interrupt service routing, ISR)。

4.Linux中断处理的核心:顶半部(Top Half)和底半部(Bottom Half)

      (1)处理中断可以分为如下两部分:

a:接收和响应中断请求。---- 会在很短的时间被处理完成。

b:处理中断的业务逻辑。----“延迟执行”由底半部分来完成中断处理的大部分工作,通常不是非常紧急的,而且相对比较耗时,并且不在硬件中断服务程序中执行。

     (2)顶半部:即“耗时少”

          底半部:即“延迟执行”

5.获取Linux系统的中断统计信息

在Linux系统中,通过虚拟文件/proc/interrupts可以获取系统中断统计信息,命令是  # cat /proc/interrupts

6.中断注册函数和注销函数

    注册中断:

  int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char    *dev_name, void *dev_id);
  参数意义依次是:中断号,中断处理函数,中断管理有关的掩码,中断请求设备名,中断信号线。
  过程是:dev_name设备请求中断->cpu分配中断号->设置中断管理的掩码->分配中断信号线->处理中断函数->完成之后再根据设置情况返回原处理程  序处继续处理程序。
  注销中断:
  Void free_irq(unsigned int irq, void *dev_id);//释放中断和中断信号线

  如下图,描述了中断处理的全过程(参考Android深度探索 卷I HAL与驱动开发)



7.如下用光感stk3311为例
设备节点利用interrupt-parent和interrupts属性描述到中断控制器的中断连接。
其中interrupt-parent属性值为中断控制器节点的指针,
interrupts属性值描述可触发的中断信号,其值格式与中断控制器的interrupt-cells属性值有关。
一般#interrupt-cells属性值为2,interrupts属性就对应为一对描述硬件中断号和中断触发方式的十六进制值。
stk3311@48 {
compatible = "stk,stk3311";
reg = <0x48>;//光感的slave addr,一直要配置,否则会引起开机时检测不到光感设备。
interrupt-parent = <&atc260x_sgpio>;//中断控制器节点的指针
interrupts = <3 4>;//3:表示中断脚用的是SGPIO3;4:表示中断标号(我的理解,可能理解错了)
gpios = <&atc260x_sgpio 3 0>;  /* SGPIO0, low active; AUXIN2 */
near_threshold = <100>;//表示靠近光感的值为100时,就触发中断,并响应相应的操作。
far_threshold = <40>;
};

根据中断源的不同,可把中断分为硬件中断和软件中断两大类。
(1)硬件中断,又可分为外部中断和内部中断。
硬中断共有5个中断,两个外部中断,两个定时/计数器中断,1个串口中断。对应的中断标号有0、1、2、                  3、4.其对应表示如下:
0 表示 外部中断INT0
1 表示 定时器中断T0
2 表示 外部中断INT1
3 表示 定时器中断T1
4 表示 串行中断
这是一个很重要的标记,它规定着当前这个子函数是哪个中断源的中断服务子程序。
(2)软件中断,其实并不是真正的中断,它们只是可被调用执行的一般程序。
例如ROM BIOS中的各种外部设备管理中断服务程序(键盘管理中断,显示器管理中断)以及DOS的系统                   功能调用(INT 21H)等都是软件中断。

你可能感兴趣的:(硬中断,软中断,顶半部,底半部,嵌入式Linux,Driver)