如何清除BCM2835中断清除寄存器?

How to clear BCM2835 Interrupt Clear Register?

我正在研究如何为 Raspberry Pi 制作操作系统,在 Raspberry Pi 的 OSDev 准系统教程中,以下代码用于清除任何挂起的中断。

// Clear pending interrupts.
mmio_write(UART0_ICR, 0x7FF);

函数mmio_write如下

static inline void mmio_write(uint32_t reg, uint32_t data){
    *(volatile uint32_t *)reg = data;
}

为什么这个值很重要,它如何清除中断?

这一行:

// Clear pending interrupts.
mmio_write(UART0_ICR, 0x7FF);

将 0x7FF 的值写入地址 UART0_ICR 的寄存器。 最有可能的是,UART0_ICR 是在代码中其他地方定义的值,它指的是 BCM2835 内部相应寄存器的地址,可能与此类似:

#define UART0_ICR (UART0_BASE + 0x44)

Why is this value significant, and how does it clear the interrupts?

要理解这一点,您需要阅读设备的数据 sheet,在您的例子中是 BCM2835(快速搜索得到这个 link)。查看UART寄存器部分,可以看到UART_ICR寄存器的说明,也就是Interupt Clear Register。

从该寄存器的table位描述可以看出:它是一个32位的寄存器,31-11位没有使用,而0到10(11位)的位用作标志用于清除各种中断。将 0x7FF 的值写入该寄存器实际上是在所有这些标志上设置,因此它将清除所有挂起的 UART 中断。