我正在研究如何为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;
}
为什么这个值很重要,它如何清除中断?
答案 0 :(得分:2)
这一行:
// Clear pending interrupts.
mmio_write(UART0_ICR, 0x7FF);
将0x7FF的值写入地址UART0_ICR
的寄存器。
最有可能的是,UART0_ICR
是一个在代码中定义的值,在代码中,它指的是BCM2835内相应寄存器的地址,可能与此类似:
#define UART0_ICR (UART0_BASE + 0x44)
为什么这个值很重要,它如何清除中断?
要理解这一点,您需要阅读设备的数据表,在您的情况下是BCM2835(快速搜索给我这个link)。查看UART寄存器部分,您可以看到UART_ICR寄存器的描述,即Interupt Clear Register。
从该寄存器的位表描述中可以看出:它是一个32位寄存器,不使用31-11位,而0到10位(11位)用作清除各种中断的标志。将0x7FF写入该寄存器实际上是设置所有这些标志,因此它将清除所有挂起的UART中断。