中断处理程序与中断服务例程

原创 2015年11月18日 13:41:22

1. 什么是中断

简单来说中断就是硬件设备与处理器的一种交流方式,比如当我按下一个键时,只有当处理器知道我按下了这个键并且做出相应的处理时,按键这个操作才是有效的。我们知道处理器的速度远远高于外围设备的速度,处理器与外设选择合适的交流方式就格外重要。轮询是一种方式,这种方式是内核周期性地对设备状态进行查询并作出相应的的动作,但这种方式会让内核做大量的无用功,这显然是不明智的。更好的方式是让外设在其需要的时候向内核发送信号,这就是中断机制。

2.中断处理程序

当一个中断发生时,内核应该有相应的处理方法,这个方法就是中断处理程序,一个中断处理程序对应一个中断号。中断处理程序是管理硬件的驱动程序的一部分,如果设备需要中断,相应的设备驱动程序就需注册中断处理程序。注册方式:使用request_irq()函数

  1. int
  2. request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irqflags, const char * devname, void *dev_id)

函数参数: 
irq:表示要分配的中断号 
handler:函数指针,指向中断的实际中断处理函数 
irqflags:中断处理程序的标志,举例来说: IRQF_DISABLED被设置后内核在处理中断处理程序本身期间要禁止所有的其他中断。 
devname:与中断相关的设备的ASCII文本表示 
dev_id:用于共享中断线,当一个中断处理程序需要释放时,dev_id提供唯一的标志信息。

3.中断服务例程

一条中断线对应一个中断一个中断处理程序,而多个设备可能共享一条中断线,那么如何让中断处理程序为不同的设备提供不同的处理方法。这就引出了中断服务例程。一个中断处理程序对应若干个中断服务例程。

中断处理程序就相当于某个中断向量的总的处理程序,比如IRQ0x09_interrupt()是中断号为9的总处理程序,假如这个9号中断由5个设备共享,那么这5个设备都分别有其对应的中断服务例程。也就是说当有多个设备需要共享某个中断线时,中断处理程序必须要调用ISR,此时会调用handle_IRQ_event()

4.request_irq函数分析

  1. int
  2. request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),
  3. unsigned long irqflags, const char * devname, void *dev_id)
  4. {
  5. int retval;
  6. struct irqaction * action;
  7. if (irq >= ACTUAL_NR_IRQS) //中断号是否超过最大值
  8. return -EINVAL;
  9. if (!handler) //函数指针是否为空
  10. return -EINVAL;
  11. #if 1
  12. /*
  13. * Sanity-check: shared interrupts should REALLY pass in
  14. * a real dev-ID, otherwise we'll have trouble later trying
  15. * to figure out which interrupt is which (messes up the
  16. * interrupt freeing logic etc).
  17. */
  18. if ((irqflags & SA_SHIRQ) && !dev_id) { //若中断共享但dev_id为NULL则出错
  19. printk(KERN_ERR
  20. "Bad boy: %s (at %p) called us without a dev_id!\n",
  21. devname, __builtin_return_address(0));
  22. }
  23. #endif
  24. action = (struct irqaction *)
  25. kmalloc(sizeof(struct irqaction), GFP_KERNEL); //创建irqaction结构体
  26. if (!action)
  27. return -ENOMEM;
  28. action->handler = handler; //将函数参数传给结构体
  29. action->flags = irqflags;
  30. cpus_clear(action->mask);
  31. action->name = devname;
  32. action->next = NULL;
  33. action->dev_id = dev_id;
  34. #ifdef CONFIG_SMP
  35. select_smp_affinity(irq);
  36. #endif
  37. retval = setup_irq(irq, action); //注册中断irqaction结构体
  38. if (retval)
  39. kfree(action);
  40. return retval;
  41. }
  1. struct irqaction {
  2. irqreturn_t (*handler)(int, void *, struct pt_regs *);//具体的中断服务例程
  3. unsigned long flags;//一组中断标志
  4. cpumask_t mask;
  5. const char *name;//中断设备名称
  6. void *dev_id;指定设备的主设备号和次设备号
  7. struct irqaction *next;//指向共享中断线的下一个 irqaction结构体
  8. int irq;//申请的中断号
  9. struct proc_dir_entry *dir;
  10. };

第五章 中断和中断服务程序

第五章  中断和中断服务程序 一,处理器与外围设备进行通信有两种方式:     1,轮询(效率低下)     2,中断 二,中断原理     当我们在敲击键盘的时候,键盘控制器会发送一个...
  • laohuang1122
  • laohuang1122
  • 2012年12月26日 14:07
  • 5733

ISR:中断服务程序(interrupt service routine)

所谓中断是指当CPU正在处理某件事情的时候,外部发生的某一事件(如一个电平的变化,一个脉冲沿的发生或定时器计数溢出等)请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务...
  • maochengtao
  • maochengtao
  • 2013年06月13日 13:23
  • 2139

中断服务程序(Interrupt Service Routines,ISR)注意事项

转自 中断是嵌入式系统中重要组成部分,很多编译器开发商都让标准c支持中断,并引入关键字_interrupt.但是: 1、ISR不能有返回值; 2、ISR不能传递参数; 3、ISR应...
  • wdjhzw
  • wdjhzw
  • 2014年08月18日 14:58
  • 8475

中断服务函数的编写要求

中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program ...
  • maochengtao
  • maochengtao
  • 2014年10月22日 10:58
  • 2755

关于ARM的中断服务程序

##1, 这个 2440test里面的中断写的向量有些隐蔽,兜了很多个圈,也难怪这么难理解,下面  就对这个东西抽丝剥茧,看清楚这究竟是一个怎么样的过程。  中断向量       b ...
  • feixiaku
  • feixiaku
  • 2012年12月22日 20:06
  • 1926

中断服务子程序

与每类I/O设备相关的进程都有一个靠近内存底部的地址,称作中断向量。 它包括中断服务程序的入口地址。 中断服务程序:处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完...
  • a99887766554321
  • a99887766554321
  • 2014年10月14日 11:41
  • 1557

中断服务程序(ISR)

中断服务程序 关键词:软中断、中断向量、中断向量表、TSR内存驻留、DOS重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( ...
  • xiaohaizi77881314
  • xiaohaizi77881314
  • 2012年08月13日 22:23
  • 923

中断详解(五)——中断处理程序

对于异常处理来说,内核只要给引起异常的进程发送一个Unix信号就能处理大多数异常。然后内核的工作就是延迟下一个动作,知道进程接收到该信号。关于异常处理,内核并没有执行多少任务,因而异常处理非常迅速。 ...
  • Windeal
  • Windeal
  • 2015年03月24日 17:03
  • 1429

Exynos4412 中断处理流程详解

Linux 中,当外设触发中断后,大体处理流程如下: a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler; b -...
  • zqixiao_09
  • zqixiao_09
  • 2016年03月19日 00:36
  • 3680

中断及中断处理过程

(From:http://www.cppblog.com/aaxron/archive/2011/11/16/160280.html) 中断及中断处理过程 1. 中断和异常的概念区别 ...
  • wangzhen199009
  • wangzhen199009
  • 2014年08月19日 09:07
  • 15552
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中断处理程序与中断服务例程
举报原因:
原因补充:

(最多只允许输入30个字)