在ARM Cortex A-9的U-boot中启用中断

4

我正在尝试在uboot中配置GPIO中断,这是为了测试中断响应时间而无需任何操作系统干预(裸机)。我已成功配置了引脚复用并设置了GPIO引脚的中断。

我的问题涉及中断服务例程的注册。我发现我的平台的中断向量表位于地址0xFFFF0000(我读取系统控制寄存器以查找此信息)。GPIO的中断ID为56,我只需计算出我的中断服务例程应驻留的地址,并尝试使用指向我的ISR例程的指针编写地址。这样做的方法对吗?还是我必须自己处理所有其他事情,如上下文保存等?

注意:我正在使用ARM Cortex A-9。

编辑:

根据答案,我检查了代码后有以下问题。我的架构(arm v7)的do_irq定义没有什么作用,而CONFIG_USE_IRQ对我不起作用,因为像arch_interrupt_init这样的函数对我来说未定义。因此,我可以得出结论,我的架构不支持中断。现在,如果我必须自己定义它,我需要实现哪些功能才能使其工作?由于这只是我的项目的一小部分,我想知道是否可以实现此中断支持。我只想知道这是否需要几行代码还是需要一些工作来实现此中断支持。

1个回答

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*中。某些CPU被定义为处理irqs,例如cpu/arm720t/interrupts.c,适用于S3C4510B。在这里,您可以看到代码从该控制器获取寄存器,然后跳转到表格。

因此,默认情况下,u-boot似乎没有interrupts支持。这并不奇怪,因为引导加载程序通常基于polling实现简单和快速。

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


我正在尝试测量裸机运行(没有任何操作系统调度干扰)时中断的响应时间,以便我可以将一些值放入模型中。我不需要它用于应用程序,这就是我问及努力程度的原因,因为我必须决定是否值得实现它。我会看一下,谢谢。 - Nuetrino
@Nuetrino 抱歉,你在问题顶部已经说明了。然而,中断响应将取决于u-boot结构。它实际上不是最佳响应方式。这只是实现的简单性。例如,大多数操作系统必须保存所有寄存器,并可能在上下文切换时切换MMU。除非我误解了你的测量方法,否则您的模型将与u-boot模型匹配以进行中断处理。一些SOC具有用于中断挂起的IO。在ISR启动时切换另一个IO,您就可以看到延迟时间。 - artless noise
1
我修改了common/main.c文件,在显示u-boot提示之前,我在GPIO引脚上注册了一个中断,然后在此中断的ISR中切换另一个GPIO引脚,以此方式我将使用示波器测量时间(中断生成和切换GPIO之间的时间)。我的理解是,在没有任何来自其他中断、内核线程等等(由操作系统引入)的干扰的情况下,我可以对硬件引入的延迟(在中断处理期间)有一些了解。 - Nuetrino
1
续上一段。我还有来自SMP/AMP类型系统的测量数据可供比较。你对这个想法有什么看法? - Nuetrino
谢谢你的建议!今天我成功了,现在希望能够用示波器测量一些响应时间! - Nuetrino
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接