代码之家  ›  专栏  ›  技术社区  ›  Jeff

ARM未定义指令错误

  •  2
  • Jeff  · 技术社区  · 15 年前

    我在运行嵌入式系统时收到一个未定义的指令错误,没有协处理器,没有MMU,ATMEL9263。嵌入式系统的内存在0x20000000-0x23ffffff范围内。到目前为止,我有两个案例:

    1. sp 0x0030b840,lr 2000ae78-lr指向有效代码,因此我不确定是什么导致了异常,尽管sp是假的。我应该查看哪些其他地址、寄存器、内存位置?

    2. SP 0x20D384A8,LR 0x1FCA59C-SP正常,LR是假的。有没有什么验尸方法可以让我弄清楚LR是怎么被碾碎的?看起来它是从地址空间的末尾向后滚动的,但我不知道是怎么回事。

    现在,我只是用模拟替换大块代码,并在测试时尝试隔离问题-问题是有时需要4个小时来显示问题。

    如果有任何提示,我们将不胜感激,谢谢!

    芯片是AT91SAM9263,我们使用的是IAR ewarm工具链。我很确定它是直胳膊,但我会检查的。

    编辑

    UNdef指令的另一个例子-这次sp/lr看起来不错。lr=0x2000b0c4,当我在附近拆卸时:

    2000b0bc e5922000 ldr r2,[r2,+0]
    2000b0c0 E12ff32黑色R2
    200000B0C4 E1B00004 MOV R0、R4

    由于lr是undef异常后面的指令-如何将blx标识为未定义?注意CPSR是0x0000013,所以这是所有ARM模式。但是,r2是0x226d2a08,它在堆区域中,我认为是不正确的-拆卸时有andeq r0、r0、r12,指令是0x000000c,其他指令在我看来像数据。所以我认为坏的R2是问题所在,我只是想理解为什么在BLX的不死族?

    谢谢!

    2 回复  |  直到 12 年前
        1
  •  2
  •   Brent    15 年前

    检查CPSR中的T位。如果您无意中从ARM模式更改为Thumb模式(反之亦然),将发生未定义的指令。

    就SP或LR损坏而言,可能是您以错误的模式执行了一些指令,这些指令在命中未定义的指令之前损坏了它们。

    编辑

    在编辑问题时响应新的错误案例:

    lr包含来自blx r2的返回地址,因此在blx之后指向一条指令是有意义的。

    如果执行blx r2时r2指向堆,您将跳到堆中并开始执行数据,就像它们是指令一样。这将在短时间内导致未定义的指令异常…

    如果要查看未定义的确切指令,请查看R14 ound寄存器(在未定义指令处理程序中定义的寄存器)-它包含未定义指令后的下一条指令的地址。

    根本原因是r2中的错误值。假设这是C代码,我猜这是一个错误的指针引用,但我需要看到源代码才能确定。

        2
  •  1
  •   old_timer    15 年前

    这是一个未定义的指令,还是因为您正在从未对齐的地址读取而中止数据?

    编辑:

    在未定义的异常上,cpsr[4:0]应为0B111011或0X1B而不是0X13,根据臂的情况,0X13是重置值。