gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:54:16 27 4
gpt4 key购买 nike

我正在阅读有关如何在 ARM 中处理中断的信息,并了解到每当任何硬件中断出现时,地址 0x00000018 处的指令都会被执行,这通常是跳转到受尊重的中断处理程序,但不同模块可能有许多中断处理程序。

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

此外,arm cpu 如何知道中断引发是 irq 还是 fiq,谁决定它以及哪个设备引发了中断,如何映射到此中断的相关处理程序。

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

最佳答案

ARM CPU 通常有两个引脚(FIQ 和 IRQ),当设备想要生成中断时,它们会被声明。发生这种情况时,CPU 只需切换模式并跳转到地址 0x00000018

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

中断处理程序通常会询问中断 Controller 是哪个引脚引起了中断,然后调用相应的处理程序。

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

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

关于linux-kernel - 多个中断处理程序如何共享地址 0x00000018,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19879765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com