我正在尝试在uboot中配置GPIO中断,这是为了测试中断响应时间而不需要任何操作系统干预(裸机)。我能够配置引脚复用并成功设置GPIO引脚的中断。
我的问题是关于注册中断服务程序。我看到我的平台的中断向量表位于地址0xFFFF0000(我读了系统控制寄存器以找出这个)。 GPIO的中断ID为56,我刚刚计算了中断服务程序应该驻留的地址,并尝试用指向我的ISR例程的指针写入地址。这是正确的做法吗?或者我必须自己处理所有其他事情,如上下文保存等?
注意:我使用的是ARM Cortex A-9。
编辑:
根据我通过代码的答案,我有以下问题。
的定义 我的架构的答案 0 :(得分:6)
ARM将所有中断传送到地址0xFFFF0018
(或0x00000018
)。这通常是无条件的分支。然后代码将检查一些中断控制器硬件以确定数字 56 。通常,有一个例程来设置中断号的处理程序,因此您不需要手动修补代码;该表取决于u-boot
中断处理的实现方式。
在我的u-boot
来源 note 中,中断表如下所示,
.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
是安装中断处理例程的标签;它在同一个文件中执行一些汇编程序,然后根据 CONFIG_USE_IRQ 调用do_irq()
。 API的一部分位于* lib_arm / interrupts.c *中。对于S3C4510B,某些 CPU 被定义为处理 irqs ,例如 cpu / arm720t / interrupts.c 。在这里,您可以看到代码从该控制器获取一个寄存器,然后分支到一个表。
因此,默认情况下u-boot
似乎不支持中断。这并不奇怪,因为引导加载程序通常是基于简单性和速度的轮询。
注意:我的u-boot
基于2009.01-rc3。