- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Neusoft Institute of Information * 教育创造学生价值 Neusoft Institute of Information * 教育创造学生价值 Neusoft Institute of Information * 教育创造学生价值 驱动程序设计——中断处理 主讲教师:董祥千 中断概念 为什么需要中断? 外设的处理速度一般慢于CPU CPU不能一直等待外部事件 所以设备必须有一种方法来通知CPU它的工作进度,这种方法就是中断。 中断响应流程和中断服务程序完成的工作 中断处理过程 中断控制器的控制原理 中断实现 在Linux驱动程序中,为设备实现一个中断包含两个步骤: 向内核注册中断 实现中断处理函数 中断注册 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 *,struct pt_regs *) 中断处理函数。 unsigned long flags 与中断管理有关的各种选项。 const char * devname 设备名 void *dev_id 共享中断时使用。 中断注册(中断标志) 在flags参数中,可以选择一些与中断管理有关的选项,如: ? IRQF_DISABLED(SA_INTERRUPT) 如果设置该位,表示是一个“快速”中断处理程序;如果没有设置这位,那么是一个“慢速”中断处理程序。 IRQF_SHARED(SA_SHIRQ) 该位表明中断可以在设备间共享。 快速/慢速中断 这两种类型的中断处理程序的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。 共享中断 共享中断就是将不同的设备挂到同一个中断信号线上。Linux对共享的支持主要是为PCI设备服务。 共享中断 共享中断也是通过request_irq函数来注册的,但有三个特别之处: 1.申请共享中断时,必须在flags参数中指定IRQF_SHARED位 2. dev_id参数必须是唯一的。 Q: 为什么要唯一? 3.共享中断的处理程序中,不能使用disable_irq(unsigned int irq) 为什么? 如果使用了这个函数,共享中断信号线的其它设备 将同样无法使用中断,也就无法正常工作了。 中断处理程序 什么是中断处理程序,有何特别之处? 中断处理程序就是普通的C代码。特别之处在于中断处理程序是在中断上下文中运行的,它的行为受到某些限制: 不能向用户空间发送或接受数据 不能使用可能引起阻塞的函数 不能使用可能引起调度的函数 中断处理函数流程 void short_sh_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* 判断是否是本设备产生了中断(为什么要做这样的检测?) */ value = inb(short_base); if (!(value 0x80)) return; /* 清除中断位(如果设备支持自动清除,则不需要这步) */ outb(value 0x7F, short_base); /* 中断处理,通常是数据接收*/ …… /* 唤醒等待数据的进程*/ wake_up_interruptible(short_queue); 释放中断 当设备不再需要使用中断时(通常在驱动卸载时), 应当把它们返还给系统,使用: void free_irq(unsigned int irq, void *dev_id) Neusoft Institute of Information * 教育创造学生价值 Neusoft Institute of Information * 教育创造学生价值 Neusoft Institute of Information * 教育创造学生价值
您可能关注的文档
最近下载
- 2025-2030中国牛仔服装行业市场深度发展趋势与前景展望战略研究报告.docx
- 八大特殊作业安全管理培训(最新版课件).pptx
- 酒店管理专业人才需求调研报告.doc VIP
- 个人业绩相关信息采集表含政治表现、最满意、主要特点、不足.pdf VIP
- 新22J09 附属建筑-标准图集.docx VIP
- 世界各国语言.doc VIP
- 《新媒体传播》课件.ppt VIP
- 2025年安全员c2考试试题库(答案+解析).docx
- GBT45001-2020SO45001:2018 职业健康安全管理体系要求及使用指南.pdf VIP
- 部编版六年级上册道德与法治教案:感受生活中的法律知识.docx VIP
文档评论(0)