4

我正在尝试在 uboot 中配置一个 GPIO 中断,这是为了在没有任何操作系统干预(裸机)的情况下测试中断响应时间。我能够配置引脚复用,并成功地使用 GPIO 引脚设置中断。

我的问题是关于中断服务程序的注册。我看到我平台的中断向量表位于地址 0xFFFF0000 (我阅读了系统控制寄存器以找出这一点)。GPIO 的中断 ID 是 56,我刚刚计算了我的中断服务例程应该驻留的地址,并尝试用指向我的 ISR 例程的指针写入地址。这是正确的做法吗?还是我必须自己处理所有其他事情,例如上下文保存等?

注意:我使用的是 ARM Cortex A-9。

编辑 :

根据我浏览代码的答案,我有以下问题。的定义

我的架构(arm v7)的 do_irq 没有做太多,CONFIG_USE_IRQ 对我不起作用,因为没有为我定义像 arch_interrupt_init 这样的函数。所以我可以得出结论,我的架构不支持中断。现在,如果我必须自己定义它,我需要实现哪些功能才能使其正常工作?由于这是我项目的一小部分,我想看看我是否可以做到这一点是否可行。我只想知道这是否需要几行代码或需要一些努力来实现这种中断支持。

4

1 回答 1

6

ARM 将所有中断引导到地址0xFFFF0018(或0x00000018)。这通常是一个无条件分支。然后代码将检查一些中断控制器硬件以确定数字56。通常,有一个例程来设置中断号的处理程序,因此您不必手动修补代码;该表取决于如何实现u-boot中断处理。

在我的u-boot注释中,中断表如下所示,

.globl _start
_start:
    b       reset
    ldr     pc, _undefined_instruction
    ldr     pc, _software_interrupt
    ldr     pc, _prefetch_abort
    ldr     pc, _data_abort
    ldr     pc, _not_used
    ldr     pc, _irq
    ldr     pc, _fiq
...
_irq:
        .word irq

_irq安装中断处理例程的标签也是如此;它在同一个文件中执行一些汇编程序,然后do_irq()根据CONFIG_USE_IRQ调用。部分 API 在 *lib_arm/interrupts.c* 中。一些CPU被定义为处理irqs,例如cpu/arm720t/interrupts.c,用于 S3C4510B。在这里您可以看到代码从该控制器获取一个寄存器,然后分支到一个表。

所以默认情况下u-boot似乎不支持中断。这并不奇怪,因为引导加载程序通常基于简单和速度的轮询。

注意:u-boot的基于 2009.01-rc3。

于 2013-04-05T13:52:21.573 回答