Linux中断处理.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux中断处理Linux设备驱动中与中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq().request_irq()的原型为:int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, void *dev_id);irq是要申请的硬件中断号;handler是向系统登记的中断处理函数, 是一个回调函数, 中断发生时, 系统调用这个函数, dev_id参数将被传递;irqflags是中断处理的属性, 若设置SA_INTERRUPT, 表明中断处理程序是快速处理程序, 快速处理程序被调用时屏蔽所有中断, 慢速处理程序不屏蔽;若设置SA_SHIRQ, 则多个设备共享中断, dev_id在中断共享时会用到, 一般设置为这个设备的device结构本身或者NULL.free_irq()的原型为:void free_irq(unsigned int irq, void *dev_id);另外, 与Linux中断息息相关的一个重要概念是Linux中断分为两个半部, 上半部(tophalf)和下半部(bottom half). 上半部的功能是“登记中断”, 当一个中断发生时, 它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去. 因此, 上半部执行的速度就会很快, 可以服务更多的中断请求. 但是, 仅有“登记中断”是远远不够的, 因为中断的事件可能很复杂,因此, Linux引入了一个下半部来完成中断事件的绝大多数使命. 下半部和上半部最大的不同是下半部是可中断的, 上半部是不可中断的, 下半部几乎做了中断处理程序所有的事情, 而且可以被新的中断打断!下半部则相对来说并不是非常紧急的, 通常还是比较耗时的, 因此由系统自行安排运行时机, 不在中断服务上下文中执行.原理解析1. 中断概念为什么需要中断?1)外设的处理速度一般慢于CPU2)CPU不能一直等待外部事件所以设备必须有一种方法来通知CPU它的工作进度, 这种方法就是中断.2. 中断实现在Linux驱动程序中, 为设备实现一个中断包含两个步骤:1)向内核注册中断2)实现中断处理函数3. 中断注册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表示成功, 或者返回一个错误码.中断注册(参数)1) unsigned int irq 中断号2)void (*handler)(int, void *, struct pt_regs *)中断处理函数3)unsigned long flags 与中断管理有关的各种选项4)const char * devname 设备名5)void *dev_id 共享中断时使用a) 中断注册(中断标志)在flags参数中, 可以选择一些与中断管理有关的选项, 如:1)IRQF_DISABLED(SA_INTERRUPT)如果设置该位, 表示是一个“快速”中断处理程序;如果没有设置该位, 那么是一个“慢速”中断处理程序.2)IRQF_SHARED(SA_SHIRQ)该位表明中断可以在设备间共享.b)快速/慢速中断这两种类型的中断处理程序的主要区别在于:快速中断保证中断处理的原子性(不被打断), 而慢速中断则不保证. 换句话说, 也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的, 因此在服务该中断时, 不会被其他类型的中断打断;而调用慢速中断处理时, 其它类型的中断仍可以得到服务.c)共享中断共享中断就是将不同的设备挂到同一个中断信号线上. Linux对共享的支持主要是为PCI设备服务. 共享中断也是通过request_irq函数来注册的, 但有三个特别之处:1)申请共享中断时, 必须在flags参数中指定IRQF_SHARED位2)dev_id参数必须是唯一的3)共享中断的处理程序中, 不能使用disable_irq(unsigned int irq), 为什么?如果使用了这个函数, 共享中断信号线的其它设备将同样无法使用中断, 也就无法正常工作了.4. 中断处理程序什么是中断处理程序, 有何特别之处?中断处理程序就是普通的C代码,特别之处在于中断处理程序是在中断上下文中运行的, 它的行为受

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档