linux中断处理程序

一、中断处理流程

在linux内核代码中进入entry-armv.S目录:

  

  linux统一的入口:__irq svc.

  进入了统一的入口之后,程序跳到irq_handler标号(在同一个文件上面有说明):

  

  而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面。

  

  在这个中断处理程序中。最重要的是get_irqnr_and_base获取产生中断的中断源,搜索这个宏。这里以2410的为例(竟然没有找到6410):

  

  从上面的程序看到。他主要是获取产生中断的中断号。获得中断号后,会跳转到:arch_irq_handler_defualt里的asm_do_IRQ去处理中断:

  

  跳转到这个函数之后,又会去调用generic_handle_irq(irq)这个函数:

  

  这个函数又会去调用generic_handle_irq_desc这个函数:

  

  在这个函数里又会去调用desc这个结构,这里的handle_irq是个函数指针

  总结:在linux里:当产生中断的时候,会有一个统一的入口,irq_svc.进来之后,第一步是拿到产生中断源的编号,然后根据这个中断号去找到irq_desc这个结构。然后在这个结构里取出事先准备好的注册处理函数。

  我们的驱动要支持中断处理,首先必须去实现中断处理程序。第二是要注册中断处理函数。

二、中断处理程序设计

  

2.1中断注册

request_irq函数用于注册中断。

int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_regs *), unsigned long flags, const char*devname, void*dev_id)

  返回0表示成功,或者返回一个错误码

  unsigned int irq中断号。

  void (*handler)(int,void *)中断处理函数。

   unsigned long flags与中断管理有关的各种选项

在flags参数中,可以选择一些与中断管理有关的选项,如:
IRQF_DISABLED(SA_INTERRUPT)
  如果设置该位,表示是一个“快速”中断处理程序;
  如果没有设置这位,那么是一个“慢速”中断处理程序。
IRQF_SHARED(SA_SHIRQ)
  该位表明该中断号是多个设备共享的。

  const char * devname  设备名

  void*dev_id共享中断时使用。

  快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。

2.2中断处理程序

  中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

1.不能使用可能引起阻塞的函数
2.不能使用可能引起调度的函数

  

3.3中断注销

当设备不再需要使用中断时(通常在驱动卸载时), 应当把它们注销, 使用函数:

  void free_irq(unsigned int irq, void*dev_id)

Dev_id是指中断里的第几个函数,要注销的。

最新文章

  1. jQuery自定义漂亮的下拉框插件8种效果
  2. Oracle错误 ORA-12560如何解决
  3. 21045308刘昊阳 《Java程序设计》第九周学习总结
  4. ASP.NET数据绑定技术
  5. 身份证号码自动生成程序(Python)
  6. .Uva&LA部分题目代码
  7. linux上tomcat安装
  8. IOS网络多线程-GCD
  9. 利用Qt调用计算器
  10. y combinator 做的一个调查_可以学习一下
  11. 使用Lock实现信号量
  12. HDU1860:统计字符
  13. [USACO08NOV]奶牛混合起来Mixed Up Cows
  14. Centos 7系统优化脚本
  15. MySQL——合并查询结果
  16. linux signal
  17. 关于第二次阅读作业中"银弹"“大泥球”等的个人理解
  18. IIS并发连接数及性能优化
  19. Double-Array Trie 原理解析
  20. 使用mapreduce来分析网站的log日志

热门文章

  1. 负载均衡的几种算法Java实现代码
  2. HTML5本地存储——IndexedDB(一:基本使用)
  3. sql 从一个库中取某个表的数据导入到另一个库中相同结构的表中
  4. 【转】PHOTOSHOP常用快捷键大全
  5. centos 7.1 apache 源码编译安装
  6. [Head First设计模式]生活中学设计模式——状态模式
  7. 个性化设置phpMyAdmin,去掉“以树形显示数据库”,禁用“发送错误报告”
  8. 1.1ASP.NET Web API 2入门
  9. Linux下c开发 之 线程通信(转)
  10. 前端福利!10个短小却超实用的JavaScript 代码段