Linux 里面在中断里面调用 disable_irq 会发生什么?
时间: 2023-06-20 10:04:32 浏览: 61
在 Linux 中,`disable_irq()` 函数用于禁用指定中断线路。当调用 `disable_irq()` 函数时,内核将禁用指定中断线路,这意味着当中断信号到达时,硬件将不会触发中断处理程序。这可以防止在处理中断时出现意外的中断,从而确保系统的稳定性。
在调用 `disable_irq()` 函数时,内核会执行以下操作:
1. 关闭中断
2. 禁用指定中断线路
3. 如果有等待中断的进程,则设置进程状态为等待状态,等待中断信号的到来
需要注意的是,禁用中断会影响系统的性能,因为它会阻止中断处理程序的执行。因此,应该尽可能地减少禁用中断的使用,并且只在必要时才使用。
相关问题
在中断处理函数里面调用 disable_irq
在中断处理函数中调用 disable_irq() 函数是不推荐的。因为 disable_irq() 函数会禁用整个中断线,不仅会关闭当前发生中断的设备中断,还会关闭其他设备的中断。这可能会导致系统出现严重问题,比如可能会导致其他设备的中断被一直阻塞,甚至导致系统死机。
通常情况下,中断处理函数应该只处理当前设备的中断,并尽快退出中断处理函数,以便其他设备的中断可以得到及时处理。如果确实需要禁用某个中断线,可以在中断处理函数之外的地方调用 disable_irq() 函数。
函数 disable_irq原型是?
函数 `disable_irq` 的原型可以根据具体的操作系统和硬件平台而有所不同。下面是几个常见操作系统和平台下的原型:
- 在 Linux 内核中,函数 `disable_irq` 的原型定义在 `include/linux/irqflags.h` 头文件中,其原型为:
```c
unsigned long disable_irq(unsigned int irq);
```
该函数用于禁止指定的中断,它会返回中断被禁止之前的状态标志,以便在以后恢复中断时使用。
- 在 Windows 操作系统中,函数 `disable_irq` 通常被称为 `KeDisableInterrupts`,其原型定义在 `ntddk.h` 头文件中,其原型为:
```c
KIRQL KeDisableInterrupts(void);
```
该函数用于禁用当前处理器上的所有中断,并返回当前的中断级别。在以后恢复中断时,需要使用 `KeRestoreInterrupts` 函数来恢复中断。
- 在嵌入式系统中,函数 `disable_irq` 的原型通常与硬件平台有关。例如,在 ARM Cortex-M3 处理器中,可以使用以下汇编代码来实现禁止中断:
```asm
cpsid i ; 禁止 IRQ 中断
bx lr ; 返回
```
在这种情况下,`disable_irq` 函数没有明确的原型,因为它是用汇编语言编写的。