Linux设备驱动,关于中断屏蔽有两个接口:disable_irq和disable_irq_nosync,该两接口使用场景如下: 1、disable_irq:在非中断处理函数中使用,会阻塞; 2、disable_irq_nosync:在中断处理函数中使用,不会阻塞;用于屏蔽相应中断; 一、为什么要屏蔽中断? 使能中断后,一旦触发中断,系统会进入中断处理函数;如果下一个中断触发...
__enable_irq()函数调用cpsie i指令。 __disable_irq()函数除调用cpsid i 指令,同时返回了PRIMASK的值,即如果返回值为 0,则表示中断在调用该函数之前是使能的;如果返回值为1,则表示中断在调用函数之前是禁用的。 需要注意的是:如果之前开启了相关外设的中断功能,在调用__disable_irq()函数关中断后,这时如果有...
synchronize_irq(irq); } 关闭中断并等待中断处理完后返回.从代码中可以看到, disable_irq先是调用了disable_irq_nosync, 然后检测desc->action是否为1. 在中断处理程序中, action是置1的, 所以进入synchronize_irq函数中. /** * synchronize_irq - wait for pending IRQ handlers (on other CPUs) * @irq: ...
注释中说明该函数是在等待中断处理程序的结束, 这也是disable_irq与disable_irq_nosync不同的主要所在. 但是在中断处理函数中调用会发生什么情况呢? 进入中断处理函数前IRQ_INPROGRESS会被__setup_irq设置, 所以程序会一直陷在while循环中, 而此时内核以经被独占, 这就导致系统死掉. 总结: 由于在disable_irq中会调...
__disable_irq() 和 __enable_irq() 是所谓的intrinsic函数,编译器自动识别并替换为相关的指令,它们其实是编译器的一部分,实际的定义位于arm_compat.h 文件中(位于KEIL的安装目录里), 代码语言:javascript 复制 static__inline__ unsigned int__attribute__((__always_inline__,__nodebug__))__disable_irq...
__disable_irq() 和 __enable_irq() 是所谓的intrinsic函数,编译器自动识别并替换为相关的指令,它们其实是编译器的一部分,实际的定义位于arm_compat.h 文件中(位于KEIL的安装目录里), static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__)) ...
synchronize_irq(irq); } 关闭中断并等待中断处理完后返回.从代码中可以看到, disable_irq先是调用了disable_irq_nosync, 然后检测desc->action是否为1. 在中断处理程序中, action是置1的, 所以进入synchronize_irq函数中. /** * synchronize_irq - wait for pending IRQ handlers (on other CPUs) ...
local_irq_disable的功能是屏蔽当前CPU上的所有中断,通过操作arm核心中的寄存器来屏蔽到达CPU上的中断,此时中断控制器中所有送往该CPU上的中断信号都将被忽略。 Kernel/arch/arm/include/asm/irqflag.h static inline void arch_local_irq_disable(void)
void request_irq(int irq, void (*handler)()) enable_irq和disable_irq用来开启和关闭右参数irq指定的中断,这两个函数直接对8259的寄存器进行操作,因此irq对应的是实实在在的中断号,比如说X86下时钟中断一般为0号中断,那么启动时钟中断就需要调用enable_irq(1),而键盘一般占用2号中断,那么关闭键盘中断就需要...