多个中断处理程序如何共享地址0x00000018

Ami*_*mar 2 arm linux-device-driver linux-kernel interrupt-handling

我正在阅读关于如何在ARM中处理中断并且知道何时任何硬件中断到达地址0x00000018的指令被执行,这通常是跳转到受尊重的中断处理程序,但是对于不同的模块可能有许多中断处理程序.

那么,这些不同的处理程序如何映射到地址0x00000018?

另外,arm cpu如何知道中断提升是irq或fiq,谁决定它以及哪个设备引发了中断,如何映射到这个中断的受尊重的处理程序.

任何机构都可以指向一个简单的中断处理程序代码,我可以看到所有中断处理程序的作用吗?

tan*_*grs 5

ARM CPU通常有两个引脚(FIQ和IRQ),当它们想要产生中断时由器件置位.发生这种情况时,CPU只需切换模式并跳转到地址即可0x00000018.

但是,因为通常有多个设备而不是中断引脚的数量,所以通常在CPU和设备之间有一个中断控制器.您可以将其视为将更多中断连接到CPU的集线器.中断控制器可以配置为针对它接收的某些类型的中断断言FIQ.

中断处理程序通常会询问中断控制器哪个引脚引起中断,然后调用相应的处理程序.

这是一个精简版本,没有错误检查我在一个小项目中使用的中断处理程序代码.

#include <types.h>
#include <irq.h>

static void (*irq_handlers[32])(void);

void __attribute__((interrupt)) handle_irq() {
    int irq = irq_hw_get_and_ack();

    if (irq_handlers[irq]) {
        irq_handlers[irq]();
    }
}

void setup_irq() {
    irq_hw_init();
    cpu_enable_irq();
}

void irq_request(int irq, void (*func)(void)) {
    irq_handlers[irq] = func;
    irq_hw_enable(irq);
}

void irq_unrequest(int irq) {
    irq_hw_disable(irq);
    irq_handlers[irq] = NULL;
}
Run Code Online (Sandbox Code Playgroud)