博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 69 linux-5.11 OK6410A linux 内核同步机制 禁中断/中断屏蔽的实现
阅读量:4285 次
发布时间:2019-05-27

本文共 3109 字,大约阅读时间需要 10 分钟。

  • 解决的问题是什么
中断抢占
1.实现原理
1/ 禁止 irq与fiq2/ 禁止 中断源 // 与 vic/gic 等 中断控制器 相关	适用于 某个中断源 中断处理过程中,不能接受 来自该中断源的中断

2.1 禁止 irq与fiq

  • local_irq_enable
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)
  • local_irq_disable
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)

2.2 禁止中断源

  • enable_irq
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
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/

你可能感兴趣的文章
DOM笔记(三):Element接口和HTMLElement接口
查看>>
DOM笔记(四):HTML 5 DOM复杂数据类型
查看>>
DOM笔记(五):JavaScript的常见事件和Ajax小结
查看>>
DOM笔记(六):怎么进行JQuery扩展?
查看>>
搜索和网页排名的数学原理
查看>>
DOM笔记(八):JavaScript执行环境和垃圾收集
查看>>
响应式下的下拉菜单
查看>>
DOM笔记(九):引用类型、基本包装类型和单体内置对象
查看>>
也谈学习
查看>>
DOM笔记(十):JavaScript正则表达式
查看>>
如何高效编写可维护代码?
查看>>
DOM笔记(十一):JavaScript对象的基本认识和创建
查看>>
DOM笔记(十二):又谈原型对象
查看>>
DOM笔记(十三):JavaScript的继承方式
查看>>
CSS:响应式下的折叠菜单(条纹式)
查看>>
响应式设计三部曲
查看>>
45种Javascript技巧大全
查看>>
PDO学习笔记
查看>>
MarkDown语法
查看>>
Linux的文件权限
查看>>