我正在使用mbed的LPC 1768开发板(与cortex M3 cpu),我正试图在这里实现某些功能,主要是从SD卡升级用户应用程序,我正在编写两个程序,第一个引导程序/纳米内核和用户应用程序(的HelloWorld一开始会做):Cortex M3的引导加载程序
- 的Bootloader /纳米内核在为0x00地址运行时,它会做一些检查,并最终抢在SD二进制文件卡
- 引导加载程序/纳米内核将复制此地址为0x9000的二进制文件(稍后可能需要更改,但该空间不能被引导加载程序/纳米内核使用,因此应该可以)
- 引导加载程序跳转到用户应用程序0x9000 + 4
Sd卡很容易解决,我遇到了跳转部分的问题。这里是跳转功能的代码。
void run(void) {
void (*user_code_entry)(void);
unsigned *p;
SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
// Load contents of second word of user flash - the reset handler address
// in the applications vector table
p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
user_code_entry = (void (*)(void))p;
// Jump to user application
user_code_entry();
}
所以我编了(我用的Keil uvision4)的用户应用程序改变起始地址0×9000。如果我编写我的主板(使用flashmagictool),然后手动跳转(仍使用flashmagictool)到0x9004(0x9000 + 4),用户应用程序将运行,所以我相信编译工作正常,所以用户应用程序可以运行在0x9000。
但是,如果我运行bootloader /纳米内核,这一个不会跳转到用户应用程序,不幸的是,因为我无法调试,我不知道发生了什么...我也试图不要使用SD复制部分,所以我首先编程bootloader,基本上只跳转到0x9004。然后,我编写将位于0x9000的用户应用程序。如果我重新启动主板,bootloader会运行但不会跳转到用户应用程序。我检查了内存,看起来这两个程序(引导程序+用户应用程序)都是正确的,并且位置正确。
我相信我在这里错过了一些东西,有没有我应该看的低级代码?我已经阅读过在线文档的语调,并且从我发现的例子中,他们跳转到用户代码的方式与我一样...非常感谢您的帮助。
这应该工作在PC上非常相似了,但是有虚拟地址,而不是物理 - 尝试一下,看看它是否工作,然后将代码移至Keil – Ulterior
Cortex M3没有MMU,因此没有虚拟地址。 –