void (*irq_ack)(struct irq_data *data); void (*irq_mask)(struct irq_data *data); void (*irq_mask_ack)(struct irq_data *data); void (*irq_unmask)(struct irq_data *data); void (*irq_eoi)(struct irq_data *data); in
void (*ack)(unsigned int irq); //响应中断,就是清除当前中断使得可以再接收下个中断 void (*mask)(unsigned int irq); //屏蔽中断源 void (*mask_ack)(unsigned int irq); //屏蔽和响应中断 void (*unmask)(unsigned int irq); //开启中断源 ... ... int (*set_type)(unsigned int irq, unsi...
/*Start handling the irq*/desc->chip->ack(irq);//开始处理这个中断/*Mark the IRQ currently in progress.*/desc->status |= IRQ_INPROGRESS;//标记当前中断正在运行do{structirqaction *action = desc->action; irqreturn_t action_ret;if(unlikely(!action)) {//判断链表是否为空desc->chip->mask(...
mask_ack_irq(desc, irq); action_ret = handle_IRQ_event(irq, action); desc->chip->unmask(irq); } 2.cpu屏蔽中断,中断将被记录,并存放在请求寄存器irr中,cpu开启中断后,中断将响应。 对于x86架构,当发生中断时,进入中断门后,处理器会自动清除IF 标志,禁掉(屏蔽)中断, 不响应任何中断。 对于Linux系...
ath79_misc_irq_chip.irq_mask_ack=ar71xx_misc_irq_mask;elseif(soc_is_ar724x() ||soc_is_ar933x()||soc_is_ar934x()||soc_is_qca953x()||soc_is_qca955x()) ath79_misc_irq_chip.irq_ack=ar724x_misc_irq_ack;elseBUG();for(i =ATH79_MISC_IRQ_BASE; ...
–>chip->irq_mask –>chip->irq_ack –> handle_irq_event (就是调用irq_handler的处理) –>chip-> irq_unmask 具体可以参考蜗窝上的文章,对两种场景有比较详细的介绍。我们接下来讨论电平触发的场景,来看看如何在所有CPU上进行屏蔽中断的。其他场景可以举一反三。
(1)调用中断描述符的底层irq chip driver进行mask,ack等callback函数,进行interrupt flow control。 (2)调用该中断描述符上的action list中的specific handler(我们用这个术语来区分具体中断handler和high level的handler)。这个步骤不一定会执行,这是和中断描述符的当前状态相关,实际上,interrupt flow control是软件(设...
正是因为level trigger的这个特点,因此,在high level handler中首先mask并ack该IRQ。这一点和边缘触发的high level handler有显著的不同,在handle_edge_irq中,我们仅仅是ack了中断,并没有mask,因为边缘触发的中断稍纵即逝,一旦mask了该中断,容易造成中断丢失。而对于电平中断,我们不得不mask住该中断,如果不mask住...
(1)调用中断描述符的底层irq chip driver进行mask,ack等callback函数,进行interrupt flow control。 (2)调用该中断描述符上的action list中的specific handler(我们用这个术语来区分具体中断handler和high level的handler)。这个步骤不一定会执行,这是和中断描述符的当前状态相关,实际上,interrupt flow control是软件(设...
从代码中可以看到,在函数中首先做的就是mask_ack_irq,在其中会调用chip中的回调来设置硬件。 static inline void mask_ack_irq(struct irq_desc *desc) { if (desc->irq_data.chip->irq_mask_ack) desc->irq_data.chip->irq_mask_ack(&desc->irq_data); ...