【发布时间】: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