中断IRQ:
中断允许让设备(如键盘,串口卡,并口等设备)表明它们需要CPU。一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。CPU处理完中断后,就会恢复执行之前被中断的程序。
中断分类:
硬中断+软中断
硬中断:
①非屏蔽中断:不能被屏蔽,硬件发生的错误:内存错误,风扇故障,温度传感器故障等。
②可屏蔽中断:可被CPU忽略或延迟处理。当缓存控制器的外部针脚被触发的时候就会产生这种类型的中断,而中断屏蔽寄存器就会将这样的中断屏蔽掉。我们可以将一个比特位设置为0,来禁用在此针脚触发的中断。
软中断:
是软件实现的中断,也就是程序运行时其他程序对它的中断而硬中断是硬件实现的中断,是程序运行时设备对它的中断。
CPU之间的中断处理(IPI)
处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。
CALL_FUNCTION_VECTOR (向量0xfb)
发往所有的CPU,但不包括发送者,强制这些CPU运行发送者传递过来的函数,相应的中断处理程序叫做call_function_interrupt(),例如,地址存放在群居变量call_data中来传递的函数,可能强制其他所有的CPU都停止,也可能强制它们设置内存类型范围寄存器的内容。通常,这种中断发往所有的CPU,但通过smp_call_function()执行调用函数的CPU除外。
RESCHEDULE_VECTOR (向量0xfc)
当一个CPU接收这种类型的中断时,相应的处理程序限定自己来应答中断,当从中断返回时,所有的重新调度都自动运行。
INVALIDATE_TLB_VECTOR (向量0xfd)
发往所有的CPU,但不包括发送者,强制它们的转换后援缓冲器TLB变为无效。相应的处理程序刷新处理器的某些TLB表项。
服务中断有两方面(硬件、软件);软件,其他能显示,那说明这几个可能设置出问题(方法:检查设置);硬件方面,主要原因有线路中断、硬件老化等,需要设备实地检查。致力于物联网产品研发制造以及整套解决方案的提供,产品广泛应用于智慧交通、智慧工地、物资管理、金融管理、图书档案、生产制造、仓储物流、防伪溯源、跟踪定位等领域。
注册中断最常用的函数是request_irq
第 1个参数 irq 为中断号
第 2 个参数 handler 为要中断服务函数
第 3 个参数 flags为中断标志位包含触发方式,是否共享,是否支持嵌套等
第 4 个参数 name,通常是 设备驱动程序的名称。该值用在 /proc/interrupt 系统文件上
第 5 个参数 dev 中断名称 可作为共享中断时的中断区别参数,也可以用来指定中断服务函数需要参考的数据地址。建议将 设备结构指针作为 dev参数
flags参数定义
注册中断的另一个函数是request_threaded_irq
request_threaded_irq是将中断处理函数线程化执行的接口,其实request_irq也是直接调用的request_threaded_irq,只不过线程化回调thread_fn设置为NULL,不进行中断处理程序线程化处理。
和request_irq的参数有少许差异
handler:表示中断服务例程,指向primary handler 和request_irq的中断处理函数handler类似。中断发生时优先执行primary handler;
如果primary handler 为NULL,且thread_fn不为NULL,那么执行默认primary handler = irq_default_primary_handler。
thread_fn:中断线程化,NULL表示没有中断线程化。thread_fn如果该参数不为NULL,内核会为该irq创建一个内核线程,
当中断发生时,如果handler回调返回值是IRQ_WAKE_THREAD,内核将会激活中断线程,
在中断线程中,该回调函数将被调用,所以,该回调函数运行在进程上下文中,允许进行阻塞 *** 作。
其中
其中
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)