void disable_irq(unsigned int irq)则用于禁止一个irq,一般和enable_irq 配合使用
其源码分析如下:
void disable_irq(unsigned int irq)
{
if (!__disable_irq_nosync(irq))//完成中断所处深度和改变中断状态
synchronize_irq(irq);//使cpu处于检测中断的中断,当用中断发生时,cpu会调用中断函数处理此中断.
}
static int __disable_irq_nosync(unsigned int irq)
{
unsigned long flags;
#同样根据irq得到对应的中断描述符
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
#描述符为null,则直接退出
if (!desc)
return -EINVAL;
#这个函数会检测中断的深度,最终会调用chip来disable中断
__disable_irq(desc);
#一般和irq_get_desc_buslock 配合使用
irq_put_desc_busunlock(desc, flags);
return 0;
}
void __disable_irq(struct irq_desc *desc)
{
#enable_irq的时候指定的是减减操作,这里做加加操作,只有为0是,才真正disable irq
if (!desc->depth++)
irq_disable(desc);
}
void irq_disable(struct irq_desc *desc)
{
irq_state_set_disabled(desc);
#和irq_enable 类似,这里也是通过chip来disable 中断.
if (desc->irq_data.chip->irq_disable) {
desc->irq_data.chip->irq_disable(&desc->irq_data);
irq_state_set_masked(desc);
} else if (irq_settings_disable_unlazy(desc)) {
mask_irq(desc);
}
}
中断API之disable_irq
最新推荐文章于 2025-05-21 18:38:38 发布