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;
}