2

我正在研究如何为 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;
}

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

4

1 回答 1

2

这一行:

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

将值 0x7FF 写入 address 处的寄存器UART0_ICR。最有可能的UART0_ICR是代码中其他地方定义的值,它指的是 BCM2835 内相应寄存器的地址,可能类似于以下内容:

#define UART0_ICR (UART0_BASE + 0x44)

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

要理解这一点,您需要阅读设备的数据表,在您的情况下是 BCM2835(快速搜索给了我这个链接)。查看UART寄存器部分,您可以看到UART_ICR寄存器的描述,即中断清除寄存器。

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

于 2016-09-06T04:43:37.923 回答