Assembly RedBoot无法从DDR运行

Assembly RedBoot无法从DDR运行,assembly,embedded,arm,Assembly,Embedded,Arm,我正在开发一个基于iMX31平台的新板,这个板有一个 来自Micron(MT46H64M32LFCM-6)的单芯片256MB LPDDR和我使用NAND 引导电路板(引导[4:0]=00001) 我们知道一旦RedBoot开始运行,它将首先初始化系统,然后复制 它的第一个2KB代码从NAND到DDR,然后跳转到 DDR并从那里运行代码。但在我的例子中,改变程序计数器只是 把我的板子变成一块无声的砖块。下面是我正在谈论的代码片段 关于: 一旦addpc,r0,r1被执行,整个过程就会停止。我已经核

我正在开发一个基于iMX31平台的新板,这个板有一个 来自Micron(MT46H64M32LFCM-6)的单芯片256MB LPDDR和我使用NAND 引导电路板(引导[4:0]=00001)

我们知道一旦RedBoot开始运行,它将首先初始化系统,然后复制 它的第一个2KB代码从NAND到DDR,然后跳转到 DDR并从那里运行代码。但在我的例子中,改变程序计数器只是 把我的板子变成一块无声的砖块。下面是我正在谈论的代码片段 关于:

一旦
addpc,r0,r1
被执行,整个过程就会停止。我已经核实了我的地址 初始化正确(所有定时参数,行=14,列=10和数据总线 size=x32),并且我已经运行了几次内存测试,没有失败,所以我很好 确信控制器和存储芯片本身是好的。在RedBoot中,一切 在我必须手动将程序计数器的值设置为 在DDR内存映射范围内的某个地方

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


请帮忙,谢谢

ARM并没有停止,因此确定执行实际上在哪里继续将非常有用。这将是两个地方之一:

  • 您写入PC的PC值。这可能是您预期的位置,也可能不是。如果可能,使用调试器验证R0&R1实际上是您期望的SDRAM中的位置
  • 异常,可能是类似预回迁中止的中止异常。这意味着,由于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的代码有问题,可能是加载错误的地址


    希望有帮助

    你是如何处理你的缓存的?你在用它吗?在尝试执行新代码之前是否刷新它?如果它处于打开状态,请尝试关闭缓存,看看是否有帮助。@Splat二级缓存在CPU初始化期间被禁用。包含RAM的内存范围是否已启用以执行?如果没有,它将抛出一个异常,而您可能还没有设置这些异常。
    B   _reset  /* Reset */
    B   .   /* Undefined Instruction */
    B   .   /* Software Interrupt*/
    B   .   /* Prefetch Abort*/
    B   .   /* Data Abort*/
    B   .   /* Reserved*/
    B   .   /* IRQ*/
    B   .   /* FIQ*/