gpt4 book ai didi

用于在 LPC2148 ARM 处理器上创建中断向量的汇编代码

转载 作者:行者123 更新时间:2023-12-02 06:09:09 26 4
gpt4 key购买 nike

我最近才开始使用 LPC2148 ARM 处理器。

我试图理解一些关于创建中断向量的汇编代码。

代码如下:

// Runtime Interrupt Vectors
// -------------------------
Vectors:
b _start // reset - _start
ldr pc,_undf // undefined - _undf
ldr pc,_swi // SWI - _swi
ldr pc,_pabt // program abort - _pabt
ldr pc,_dabt // data abort - _dabt
nop // reserved
ldr pc,[pc,#-0xFF0] // IRQ - read the VIC
ldr pc,_fiq // FIQ - _fiq

#if 0
// Use this group for production
_undf: .word _reset // undefined - _reset
_swi: .word _reset // SWI - _reset
_pabt: .word _reset // program abort - _reset
_dabt: .word _reset // data abort - _reset
_irq: .word _reset // IRQ - _reset
_fiq: .word _reset // FIQ - _reset

#else
// Use this group for development
_undf: .word __undf // undefined
_swi: .word __swi // SWI
_pabt: .word __pabt // program abort
_dabt: .word __dabt // data abort
_irq: .word __irq // IRQ
_fiq: .word __fiq // FIQ

__undf: b . // undefined
__swi: b . // SWI
__pabt: b . // program abort
__dabt: b . // data abort
__irq: b . // IRQ
__fiq: b . // FIQ
#endif
.size _boot, . - _boot
.endfunc

我完全不明白这是怎么回事。如果有人能向我解释这个过程,特别是这里如何使用 ldr 指令,我将不胜感激。

塔尔

最佳答案

我将删除条件代码,因为它只会使事情复杂化:

// Runtime Interrupt Vectors
// -------------------------
Vectors:
b _start // reset - _start
ldr pc,_undf // undefined - _undf
ldr pc,_swi // SWI - _swi
ldr pc,_pabt // program abort - _pabt
ldr pc,_dabt // data abort - _dabt
nop // reserved
ldr pc,[pc,#-0xFF0] // IRQ - read the VIC
ldr pc,_fiq // FIQ - _fiq

_undf: .word __undf // undefined
_swi: .word __swi // SWI
_pabt: .word __pabt // program abort
_dabt: .word __dabt // data abort
_irq: .word __irq // IRQ
_fiq: .word __fiq // FIQ

__undf: b . // undefined
__swi: b . // SWI
__pabt: b . // program abort
__dabt: b . // data abort
__irq: b . // IRQ
__fiq: b . // FIQ

.size _boot, . - _boot
.endfunc

让我们先看看重置/启动向量:

b   _start

该指令是指向标记为“_start”的代码的无条件分支(跳转),我在您的代码段中看不到它。基本上它将是初始化堆栈和处理器寄存器的程序集,也许一些内存区域然后可能跳转到执行大部分初始化的 C 例程。

接下来是执行无效指令时 ARM 将转到的“未定义”向量(如果我没记错的话):

ldr pc, _undf

该指令将“_undf”符号处的地址加载到pc 寄存器(“程序计数器”或指令指针)。如果我们查看 _undf 变量,它包含由符号 __undf 表示的地址。所以 ldr pc, _undf 指令用 __undf 的地址加载 pc - 跳转到 __undf:

__undf 我们看到:

__undf: b     .  

那只是指向同一地址的分支 - 无限循环(. 符号表示“此处”或“此位置”)。

因此对于这些向量中的大多数(它们遵循与未定义向量相同的技术),它们只会跳转到小的无限循环。您可以将这些标签处的无限循环替换为适合所讨论向量的代码,但许多项目不会这样做,因为触发这些向量会表示某种严重错误。

最后,最有趣的向量槽是 IRQ 向量:

ldr   pc,[pc,#-0xFF0]           // IRQ - read the VIC

这看起来像是 NXP 设备的处理程序。

它将从相对于 pc 寄存器的内存位置读取的值加载到 pc 寄存器中。因为在 ARM 架构上,IRQ 向量总是在地址 0x00000018(我将忽略可以将向量映射到别处的实现或使用不同向量模型的 Cortex-M3 之类的 ARM)并且因为指令流水线对使用 PC 寄存器值进行寻址的影响,该指令将读取的内存位置将是 0xFFFFF030,这是内存的地址-在“向量中断 Controller ”(VIC) 中映射的 VICVectAddr 寄存器:

 'apparent'      Pipeline      offset in      effective
PC value effect the opcode address
------------- ------------ ----------- ----------
0x00000018 + 0x00000008 - 0x0000ff0 == 0xfffff030

这个设备寄存器将包含刚刚发生的中断的中断处理程序的地址(当然 VIC 需要正确初始化以便它知道该地址)。

因此,当 ldr pc,[pc,#-0xFF0] 指令执行时,它会将中断处理程序地址加载到 pc 寄存器中适当的设备(基本上,跳转到正确的中断处理程序)。

关于用于在 LPC2148 ARM 处理器上创建中断向量的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com