好吧,伙计们,
我正试图在 ARM 组装上切齿,但我不能完全理解中断的概念。在此之前,我使用过 AVR 中断,其中编写了代码以将中断向量显式链接到要跳转到的子程序或段:
.ORG $0022
RJMP TIMER_INTERRUPT
但是,在使用 Atmel SAMA5D3 系列时,我不知道如何完成类似的事情。我知道前 8 个中断向量位于前 8 个程序计数器地址(reset
at0x00
到fiq
at 0x1C
),但我无法找到一个好的、严肃的、易于理解的资源来了解各个外设中断的方式(SPI、UART、TC 模块)映射到标准化的 ARM 向量表。
也就是说,假设在代码中我将 UART 配置为能够引发中断。当它抛出中断时会发生什么?irq
条目 ( )的地址是否0x18
包含设备特定向量表的位置?供应商和设备特定的外设如何通过核心标准化表断言中断?
我已经查阅了 SAMA5D3 和 ARM ARM 的数据表,但我没有发现太多让初学者更容易的东西。如果有任何不清楚的地方,我深表歉意,并为避开集会而感到羞耻。
编辑:
从SAMA5D3 数据表,第 118 页,它指出:
假设:
- 高级中断控制器已被编程,AIC_SVR 寄存器加载了相应的中断服务程序地址并启用了中断。
- ARM 中断异常向量地址处的指令需要与向量配合使用:
LDR PC, [PC, # -&F20]
置位时
nIRQ
,如果位“I”CPSR
为0,则顺序如下:
CPSR
存储在 中,程序计数器的SPSR_irq
当前值加载到中断链接寄存器 (R14_irq
) 中,程序计数器 (R15
) 加载 0x18。在地址 0x1C 的取指期间的下一个周期中,ARM 内核调整R14_irq
,将其递减 4。- ARM 内核进入中断模式(如果尚未这样做)。
- 当加载在地址 0x18 的指令被执行时,程序计数器会加载读入的值
AIC_IVR
。
这是可以理解的。通过阅读本文加上查看寄存器编号,我将外围中断源(即SPI0/1
)编号放入 的INTSEL
字段中AIC_SSR
,然后听起来我将 ISR 的地址存储到 中AIC_SVR
。
有两个问题,其中一个是我不理解LDR PC, [PC, # -&F20]
需要存在并与 处的irq
向量地址兼容的向量指令 ( ) 0x18
。
另一个问题是,如何启用多个中断?只有一个INTSEL
域和源向量寄存器,那么如何在这个系统上运行多个中断处理程序呢?
伙计们,我继续道歉,如果我没有得到这个,但我至少试着做我的功课。