2

私はARMで割り込みがどのように処理されるかについて読んでおり、ハードウェア割り込みがアドレス0x00000018で実行される命令が実行されるたびに知るようになりました。

では、これらの異なるハンドラーはどのようにしてアドレス 0x00000018 にマップされるのでしょうか?

また、アームCPUが割り込み発生を知るようになる方法は、irqまたはfiqであり、誰がそれを決定し、どのデバイスが割り込みを発生させたか、この割り込みの尊重されるハンドラーにマップする方法です。

すべての割り込みハンドラーが何をするかを見ることができる単純な割り込みハンドラーコードを教えてくれる人はいますか?

4

2 に答える 2

5

ARM CPU には通常、割り込みを生成する必要があるときにデバイスによってアサートされる 2 つのピン (FIQ と IRQ) があります。これが発生すると、CPU は単純にモードを切り替えて address にジャンプします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;
}
于 2013-11-09T23:52:29.697 に答える