偃师 做网站,市场监督管理局官网,大连旅顺博物馆,企业网站优化兴田德润中断处理一般不是纯软件来实现的#xff0c;需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理#xff0c;特别是驱动程序的开发。 主要内容#xff1a; 什么是中断中断类型中断相关函数中断处理机制中断控制方法总结1. 什么是中断 为了提高CPU和外围硬…中断处理一般不是纯软件来实现的需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理特别是驱动程序的开发。 主要内容 什么是中断中断类型中断相关函数中断处理机制中断控制方法总结 1. 什么是中断 为了提高CPU和外围硬件(硬盘键盘鼠标等等)之间协同工作的性能引入了中断的机制。 没有中断的话CPU和外围设备之间协同工作可能只有轮询这个方法CPU定期检查硬件状态需要处理时就处理否则就跳过。 当硬件忙碌的时候CPU很可能会做许多无用功每次轮询都是跳过不处理。 中断机制是硬件在需要的时候向CPU发出信号CPU暂时停止正在进行的工作来处理硬件请求的一种机制。 2. 中断类型 中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。 异步中断CPU处理中断的时间过长所以先将硬件复位使硬件可以继续自己的工作然后在适当时候处理中断请求中耗时的部分。 举个例子网卡的工作原理 网卡收到数据包后向CPU发出中断信号请求处理接收到的数据包 CPU将收到的数据包拷贝到内存后即通知网卡继续工作 至于数据包拷贝至内存后的处理会在适当的时候进行 这样做避免了处理数据包时间过长导致网卡接收数据包速度变慢。 同步中断CPU处理完中断请求的所有工作后才反馈硬件 举个例子系统异常处理(比如运算中的除0操作) 应用程序出现异常后需要内核来处理 内核调用相应的异常处理函数来处理异常 处理完后终了应用程序或者给出message 同步中断应该处理能很快完成的一种中断。 3. 中断相关函数 实现一个中断主要需要知道3个函数 注册中断的函数释放中断的函数中断处理程序的声明 3.1 注册中断的函数 位置linux/interrupt.h include/linux/interrupt.h 定义如下 /** irg - 表示要分配的中断号* handler - 实际的中断处理程序* flags - 标志位表示此中断的具有特性* name - 中断设备名称的ASCII 表示这些会被/proc/irq和/proc/interrupts文件使用* dev - 用于共享中断线多个中断程序共享一个中断线时(共用一个中断号)依靠dev来区别各个中断程序* 返回值* 执行成功0* 执行失败非0*/
int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags,const char* name,void *dev) 3.2 释放中断的函数 定义比较简单 void free_irq(unsigned int irq, void *dev) 如果不是共享中断线则直接删除irq对应的中断线。 如果是共享中断线则判断此中断处理程序是否中断线上的最后一个中断处理程序 是最后一个中断处理程序 - 删除中断线和中断处理程序 不是最后一个中断处理程序 - 删除中断处理程序 3.3 中断处理程序的声明 声明格式如下 /* * 中断处理程序的声明* irp - 中断处理程序(即request_irq()中handler)关联的中断号* dev - 与 request_irq()中的dev一样表示一个设备的结构体* 返回值* irqreturn_t - 执行成功IRQ_HANDLED 执行失败IRQ_NONE*/
static irqreturn_t intr_handler(int, irq, void *dev) 4. 中断处理机制 中断处理的过程主要涉及3函数 do_IRQ 与体系结构有关对所接收的中断进行应答handle_IRQ_event 调用中断线上所有中断处理ret_from_intr 恢复寄存器将内核恢复到中断前的状态 处理流程可以参见书中的图如下 5. 中断控制方法 常用的中断控制方法见下表 函数 说明 local_irq_disable()禁止本地中断传递local_irq_enable()激活本地中断传递local_irq_save()保存本地中断传递的当前状态然后禁止本地中断传递local_irq_restore()恢复本地中断传递到给定的状态disable_irq()禁止给定中断线并确保该函数返回之前在该中断线上没有处理程序在运行disable_irq_nosync()禁止给定中断线enable_irq()激活给定中断线irqs_disabled()如果本地中断传递被禁止则返回非0否则返回0in_interrupt()如果在中断上下文中则返回非0如果在进程上下文中则返回0in_irq()如果当前正在执行中断处理程序则返回非0否则返回0 总结 中断处理对处理时间的要求很高如果一个中断要花费较长时间那么中断处理一般分为2部分。 上半部只做一些必要的工作后立即通知硬件继续自己的工作。 中断处理中耗时的部分也就是下半部的工作CPU会在适当的时候去完成。转载于:https://www.cnblogs.com/GoogleGetZ/p/7424217.html