ARM程序集 - 简单的blinker程序拒绝执行部分代码

时间:2018-02-08 21:18:03

标签: gcc assembly arm lpc

我正在尝试使LPC4088(Datasheet)上的LED闪烁,并且我已经准备好了我的外设寄存器。现在是时候闪烁一个LED,这是应该这样做的循环:

blink:

    @ In register SET1 (0x20098038) we set bits:
    @ bit 13 = 1    >   sets pin P1_13 to high state
    ldr r0, =0x20098038
    ldr r1, [r0]
    ldr r2, =0x2000
    orr r1, r2
    str r1, [r0]

    @ NO DELAY NEEDED FOR DEBUG

    @ In register CLR1 (0x2009803C) we set bits:
    @ bit 13 = 1    >   sets pin P1_13 to low state
    ldr r0, =0x2009803C
    ldr r1, [r0]
    ldr r2, =0x2000
    orr r1, r2
    str r1, [r0]

    @ NO DELAY NEEDED FOR DEBUG

    b blink

当我在调试器中检查代码的执行时,我注意到循环的第一部分(在第一个@ NO DELAY NEEDED FOR DEBUG之前)执行正常,并且在执行命令str r1, [r0]时LED完全打开。

现在是循环的第二部分(在第一个@ NO DELAY NEEDED FOR DEBUG之后),当我尝试执行ldr r0, =0x2009803C LED时,LED不会关闭。相反,我的程序直接跳转到循环的第一部分,并在下一步中执行ldr r0, =0x20098038。所以说明:

ldr r1, [r0]
ldr r2, =0x2000
orr r1, r2
str r1, [r0]
循环的第二部分中的

永远不会被执行......

此代码以前在C代码中运行得非常好......有没有人发现错误,因为我无法做到。我会以某种方式覆盖寄存器吗?是不是我的编译器以某种方式优化了代码?

1 个答案:

答案 0 :(得分:0)

您不能从地址CLR1的注册2009803c读取,因为它是只写的(请参阅用户手册)。结果你得到了一个错误(我不确定究竟是哪一个,可能是MemManageFault或BusFault)。通常它会跳转到故障处理程序,但从您看到的行为似乎重新启动程序。

解决方案不是读取SETCLR寄存器,您应该只编写要设置或清除的位模式。