0

好吧,伙计们,

我正试图在 ARM 组装上切齿,但我不能完全理解中断的概念。在此之前,我使用过 AVR 中断,其中编写了代码以将中断向量显式链接到要跳转到的子程序或段:

.ORG $0022                     
     RJMP TIMER_INTERRUPT

但是,在使用 Atmel SAMA5D3 系列时,我不知道如何完成类似的事情。我知道前 8 个中断向量位于前 8 个程序计数器地址(resetat0x00fiqat 0x1C),但我无法找到一个好的、严肃的、易于理解的资源来了解各个外设中断的方式(SPI、UART、TC 模块)映射到标准化的 ARM 向量表。

也就是说,假设在代码中我将 UART 配置为能够引发中断。当它抛出中断时会发生什么?irq条目 ( )的地址是否0x18包含设备特定向量表的位置?供应商和设备特定的外设如何通过核心标准化表断言中断?

我已经查阅了 SAMA5D3 和 ARM ARM 的数据表,但我没有发现太多让初学者更容易的东西。如果有任何不清楚的地方,我深表歉意,并为避开集会而感到羞耻。

编辑:

SAMA5D3 数据表,第 118 页,它指出:

假设:

  1. 高级中断控制器已被编程,AIC_SVR 寄存器加载了相应的中断服务程序地址并启用了中断。
  2. ARM 中断异常向量地址处的指令需要与向量配合使用:

LDR PC, [PC, # -&F20]

置位时nIRQ,如果位“I”CPSR为0,则顺序如下:

  1. CPSR存储在 中,程序计数器的SPSR_irq当前值加载到中断链接寄存器 ( R14_irq) 中,程序计数器 ( R15) 加载 0x18。在地址 0x1C 的取指期间的下一个周期中,ARM 内核调整R14_irq,将其递减 4。
  2. ARM 内核进入中断模式(如果尚未这样做)。
  3. 当加载在地址 0x18 的指令被执行时,程序计数器会加载读入的值AIC_IVR

这是可以理解的。通过阅读本文加上查看寄存器编号,我将外围中断源(即SPI0/1)编号放入 的INTSEL字段中AIC_SSR,然后听起来我将 ISR 的地址存储到 中AIC_SVR

有两个问题,其中一个是我不理解LDR PC, [PC, # -&F20]需要存在并与 处的irq向量地址兼容的向量指令 ( ) 0x18

另一个问题是,如何启用多个中断?只有一个INTSEL域和源向量寄存器,那么如何在这个系统上运行多个中断处理程序呢?

伙计们,我继续道歉,如果我没有得到这个,但我至少试着做我的功课。

4

1 回答 1

0

我承认除了快速浏览链接文档之外我不知道这个特定的系统,但它看起来很简单。首先,让我们忘掉 CPU,专注于中断控制器:

向量保留在控制器内部,而不是浪费地址空间和复杂性映射每个中断源的单独控制寄存器 - 相反,您得到一组寄存器,它们充当该内部数据的窗口,加上一个选择器寄存器,用于控制那个窗口指向的地方。因此配置顺序可能是这样的:

  1. 通过写入 2 来选择中断 2AIC_SSR
  2. 将中断 2 的配置AIC_SMR和处理程序地址写入AIC_SVR
  3. 现在通过写入 3 来选择中断 3AIC_SSR
  4. 将中断 3 的配置AIC_SMR和处理程序地址写入AIC_SVR
  5. ETC...

AIC_IVR与窗口类似,除了不是可编程选择器,它由当前活动中断控制。因此,例如,当中断 3 触发时,AIC_IVR将读取我们在上面的步骤 4 中编程的地址。

现在,CPU 方面更加简单明了。请注意,ARM 异常向量的布局意味着每个“处理程序”只有一条指令,因此它们几乎总是分支到其他地方的成熟处理程序例程。每种类型的异常都有一个处理程序,因此当 IRQ 被断言时,CPU 只会跳转到“IRQ”地址0x18。这就是外部中断向量发挥作用的地方——因为中断控制器已经拥有所有细节,CPU 不需要顶级 IRQ 处理程序来确定这个 IRQ 用于哪个中断以及做什么,它只需要加载中显示的任何地址AIC_IVR,跳转到它,它将位于正确的特定于中断的处理程序中。

这意味着“IRQ 处理程序”可以简化为魔术指令——“魔术”是地址AIC_AVR(PC 可以从单个异常向量指令本身执行地址加载和分支,从而最大限度地减少延迟。0xFFFFF100LDR

当然,你可能不必那样做,这只是最好的选择——我想像这样毫无意义的冗长的等价物也应该可以工作:

/* exception vectors */
.org 0
  b    start
  ...
  b    handle_irq
  ...

handle_irq:
  push {r0}
  ldr  r0, =fffff100
  ldr  r0, [r0]
  b    r0
于 2014-09-23T03:17:51.807 回答