【问题标题】:lpc 1768 Secondary Boot Loader errorlpc 1768 辅助引导加载程序错误
【发布时间】:2016-06-21 01:11:25
【问题描述】:

我正在研究 lpc 1768 SBL,其中包括以下代码以跳转到用户应用程序。

#define NVIC_VectTab_FLASH           (0x00000000)
#define USER_FLASH_START             (0x00002000)
void NVIC_SetVectorTable(DWORD NVIC_VectTab, DWORD Offset)
{ 
   NVIC_VECT_TABLE = NVIC_VectTab | (Offset & 0x1FFFFF80);
}
void execute_user_code(void)
{


    void (*user_code_entry)(void);
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_START);


    user_code_entry = (void (*)(void))((USER_FLASH_START)+1);
    user_code_entry();

}

它工作正常,没有任何错误。在代码中添加一些堆内存后,机器卡住了。我尝试了不同的堆值。他们中的一些人正在工作。经过一些深入的调试,当应用程序bin文件的第一个位置有一个可以被64整除的值时,我发现机器没有卡住。

即,

当我选择堆内存为 0x00002E90 时,它会生成堆栈基为 0x10005240 。然后堆栈基数 + 堆栈大小(0x2900)给出一个值 = 0x10007B40。 我发现这是在应用程序 bin 文件的第一个位置加载的。该值可被 64 整除,代码运行无卡顿。

但是,当我选择堆内存为 0x00002E88 时,它生成的堆栈基数为 0x10005238 。然后堆栈基数 + 堆栈大小(0x2900)给出一个值 = 0x10007B38。 这个值不能被64整除,代码卡住了。

本例的反汇编如下。

当从地址 0x0000 2000 步进时,它会进入硬故障处理程序。但在较早的情况下,它并没有严重的错误。它继续并且也有效。

我无法理解指令 DCW 以及它为什么会出现硬故障。 谁能告诉我这背后的原因?

【问题讨论】:

  • 你的意思是你试图执行堆栈地址?您希望它的效果如何?
  • @Notlikethat 我不知道那里发生了什么。我只是了解c代码。我想它会跳转到地址 0x00002001。问题是代码适用于具有相同引导加载程序的第一种情况。
  • 另外,我用一些流水线替换了代码。我将地址 0x00002000 的内容加载到 SP 中,并在下一行更新了 PC = 0x00002000+4。现在所有的案例都在工作。我仍然不明白为什么早期的引导加载程序只适用于某些地址。

标签: arm startup bootloader keil lpc


【解决方案1】:

执行向量表是您在较旧的 ARM7/ARM9 部件(或更大的 Cortex-A 部件)上执行的操作,其中向量是指令,第一个条目将跳转到复位处理程序,但在 Cortex-M 上,向量表是纯数据 - 第一个条目是您的初始堆栈指针,第二个条目是重置处理程序的 地址 - 所以尝试执行它很可能会出错..

碰巧的是,在这种情况下,您可以完全侥幸逃脱执行大部分向量表,因为内存布局导致闪存地址的每个半字变成相当无害的指令:

2: 1000    asrs  r0, r0, #32
4: 20d9    movs  r0, #217    ; 0xd9
6: 0000    movs  r0, r0
8: 20f5    movs  r0, #245    ; 0xf5
a: 0000    movs  r0, r0
...

直到你最终通过所有剩余的 NOP 到 0x20d8 处,你才能找到真正的入口点。然而,杀手是那个初始堆栈指针,因为由于 RAM 更高,你会得到这个:

0: 7b38    ldrb  r0, [r7, #12]

0x7bxx 的低字节是基址寄存器的编码位置,因此通过改变地址,您可以知道是哪个寄存器,此外,其中留下的任何垃圾值是否也恰好是有效地址从加载。你觉得幸运吗?

总之,总而言之:与其直接调用向量表的地址,不如从其中加载第二个字,然后调用包含的任何地址。

【讨论】:

  • 非常感谢。 ☺。其实我已经按照你说的更新电脑解决了这个问题。但是作为一个初学者,我无法理解错误情况。
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 2013-09-16
  • 2011-02-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
相关资源
最近更新 更多