当设备需要得到得到处理器关注的时候,会发送一个信号给处理器,这个信号就是中断。需要关注一下几个概念:
中断号(中断信号线,irq):cpu处理中断的index
中断管脚(Interrupt GPIO):设备触发电平变化的管脚
中断处理函数:中断发生时执行的函数
中断管脚由硬件决定,此处不做太多说明,主要介绍下中断号和中断处理函数。
中断号
(1)中断申请
内核维护了一个中断号的注册表,中断在使能之前需要在这个表中注册,注册使用的接口一般为request_irq,函数的入参包括要申请的中断号,中断处理函数,中断触发类型,中断名称,和一个用于共享中断号的dev_id.
(2)申请结果和中断触发情况查询
调用request_irq申请中断之后,可以在/proc/interrupts节点查看注册结果,会以列表的形式打印出当前各个中断号对应的中断名,以及当前已经在各个cpu上处理的中断次数。
(3) 申请中断号时应该申请哪个中断号的问题
申请的中断号应为当前空闲的中断号,可以通过/proc/interrupts节点查看空闲中断号,挨个尝试;系统有定义某一类中断应该使用的中断号的集合,在这个集合中尝试可减少尝试次数。尝试的方法为申请该中断号,然后设置设备触发中断,查看是否有收到中断(可使用在中断处理函数中计数的方法)。
也可以使用内核提供的中断号探测函数probe_irq_on和probe_irq_off,工作流程为由probe_irq_on获得一个空闲的中断号掩码,然后设置设备触发中断,然后禁用中断,然后调用probe_irq_off函数判断对应的中断号有没有接收到中断。
另外PCI标准要求设备声明他们需要使用的中断号,这样只需要probe到设备就可以知道中断号。但是,有的设备并没有遵守。
(即使不申请处理器已经为设备分配好了中断号,只需要找到是哪个?)
休息一下,下午再写。