我的树莓派的IRQ异常具有以下代码:
push {r0-r12, lr}
mov r1, r11
str r1, [r0, #GPIO_EVT_STAT0]
ldr r5, =State
ldr r2, [r5]
tst r2, #0x01
streq r12, [r0, #GPIO_OUT_CLR0]
strne r12, [r0, #GPIO_OUT_SET0]
mvn r2, r2
str r2, [r5]
pop {r0-r12, lr}
subs pc, lr, #0x04
ARM手册指出,链接寄存器(r14)以不同的模式存储。因此,我不必将链接寄存器压入堆栈。这是正确的吗?
当我尝试此代码时(与上面相同,但是没有按下链接寄存器)
push {r0-r12}
mov r1, r11
str r1, [r0, #GPIO_EVT_STAT0]
ldr r5, =State
ldr r2, [r5]
tst r2, #0x01
streq r12, [r0, #GPIO_OUT_CLR0]
strne r12, [r0, #GPIO_OUT_SET0]
mvn r2, r2
str r2, [r5]
pop {r0-r12}
subs pc, lr_irq, #0x04
在编译过程中出现此错误:
source/main.s:121: Error: immediate expression requires a # prefix -- `subs pc,lr_irq,#0x04'
那么为什么会出现此错误?我的理解是,r14存储在IRQ模式下,并且存储的寄存器可通过符号register_mode
进行访问。