【问题标题】:RedBoot Cannot Run from DDRRedBoot 无法从 DDR 运行
【发布时间】:2011-03-31 22:56:06
【问题描述】:

我正在开发基于 iMX31 平台的新板,该板具有 美光 (MT46H64M32LFCM-6) 的单芯片 256MB LPDDR,我使用 NAND 启动板(BOOT[4:0] = 00001)。

我们知道,一旦 RedBoot 开始运行,它首先会初始化系统,然后复制 其代码的前2KB从NAND到DDR,然后跳转到内存位置 DDR 并从那里运行代码。但就我而言,只是更改为程序计数器 把我的板子变成一块无声的砖头。下面是我说的sn-p代码 关于:

1:  ldmia r0!, {r3-r10}
    stmia r1!, {r3-r10}
    cmp r0, r2
    blo 1b

    /* Jump to SDRAM */
    ldr r1, CONST_0x0FFF
    and r0, pc, r1     /* offset of pc */
    ldr r1, MXC_REDBOOT_ROM_START
    add r1, r1, #0x10
    add pc, r0, r1
    nop
    nop
    nop
    nop
    ...

一旦add pc, r0, r1 被执行,整个事情就停止了。我已经验证了我的 DDR 初始化正确(所有时序参数,ROW=14,COL=10和数据总线 size=x32),我已经运行了几次内存测试,没有失败,所以我很漂亮 相信控制器和内存芯片本身都很好。在 RedBoot 中,一切 看起来和工作得很好,直到我必须手动将程序计数器的值设置为 在 DDR 内存映射范围内的某处。

我已经卡在这里几天了,我仔细检查了我复制到 DDR 中的数据 与NAND中的相同,PC的值也是正确的。

请帮忙,谢谢!

【问题讨论】:

  • 您是如何处理缓存的?你在用吗?在尝试执行新代码之前是否刷新它?如果它打开,请尝试关闭缓存,看看是否有帮助..
  • @Splat L2 缓存在 CPU 初始化期间被禁用。
  • 包含 RAM 的内存范围是否已启用执行?如果没有,它会抛出一个异常,你可能还没有设置这些。

标签: assembly embedded arm


【解决方案1】:

ARM 不只是停止,因此确定执行实际继续的位置将很有用。它将是以下两个地方之一:

  1. 您写入 PC 的 PC 值。这可能是也可能不是您期望的位置。如果可能,请使用调试器来验证 R0 和 R1 确实是您期望的 SDRAM 中的位置。
  2. 异常,可能是预取异常等异常异常。这意味着存储在 PC 中的指令位于由于 MMU 上的权限或配置问题(SDRAM?)而无法访问的内存位置。

我会在中断向量上设置“陷阱”,使它们自己循环。这样您就可以看到 PC 在“挂起”后指向的任何位置,从而告诉您发生了什么。

在汇编中它看起来像这样:

B   _reset  /* Reset */
B   .   /* Undefined Instruction */
B   .   /* Software Interrupt*/
B   .   /* Prefetch Abort*/
B   .   /* Data Abort*/
B   .   /* Reserved*/
B   .   /* IRQ*/
B   .   /* FIQ*/

只需将此代码定位在内存开头 (0x00000000) 并重新运行程序。如果它在 0x0000000C(预取中止)或 0x000000010(数据中止)处挂起,则可能是 SDRAM 配置或 MMU 权限。如果它挂在其他地方,则说明加载 PC 的代码有问题,可能是用错误的地址加载它。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2021-12-01
    • 2017-07-29
    • 2019-08-24
    • 2015-05-31
    • 2019-10-09
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多