本文共 3109 字,大约阅读时间需要 10 分钟。
中断抢占
1/ 禁止 irq与fiq2/ 禁止 中断源 // 与 vic/gic 等 中断控制器 相关 适用于 某个中断源 中断处理过程中,不能接受 来自该中断源的中断
arch/arm/include/asm/irqflags.h 36 #define arch_local_irq_enable arch_local_irq_enable 37 static inline void arch_local_irq_enable(void) 38 { 39 asm volatile( 40 " cpsie i @ arch_local_irq_enable" 41 : 42 : 43 : "memory", "cc"); 44 }include/linux/irqflags.h156 #define raw_local_irq_enable() arch_local_irq_enable()223 #define local_irq_enable() do { raw_local_irq_enable(); } while (0)
arch/arm/include/asm/irqflags.h 46 #define arch_local_irq_disable arch_local_irq_disable 47 static inline void arch_local_irq_disable(void) 48 { 49 asm volatile( 50 " cpsid i @ arch_local_irq_disable" 51 : 52 : 53 : "memory", "cc"); 54 }include/linux/irqflags.h155 #define raw_local_irq_disable() arch_local_irq_disable()224 #define local_irq_disable() do { raw_local_irq_disable(); } while (0)
enable_irq // kernel/irq/manage.c __enable_irq // kernel/irq/manage.c irq_startup // kernel/irq/chip.c irq_enable // kernel/irq/chip.c unmask_irq // kernel/irq/chip.c desc->irq_data.chip->irq_unmask/vic_unmask_irq // drivers/irqchip/irq-vic.c void __iomem *base = irq_data_get_irq_chip_data(d); unsigned int irq = d->hwirq; writel(1 << irq, base + VIC_INT_ENABLE);
disable_irq // kernel/irq/manage.c __disable_irq_nosync // kernel/irq/manage.c __disable_irq // kernel/irq/manage.c irq_disable // kernel/irq/chip.c __irq_disable // kernel/irq/chip.c mask_irq // kernel/irq/chip.c desc->irq_data.chip->irq_mask(&desc->irq_data);/vic_mask_irq // drivers/irqchip/irq-vic.c // desc->irq_data.chip->irq_mask 存在的情况下 void __iomem *base = irq_data_get_irq_chip_data(d); unsigned int irq = d->hwirq; writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); desc->irq_data.chip->irq_disable(&desc->irq_data); // desc->irq_data.chip->irq_disable 的情况下
转载地址:http://bnigi.baihongyu.com/