首先我想介绍一下我自己,因为我是新手。我是一名电子工程师,专门从事嵌入式系统设计和开发。我一直在从网站收集信息很久,我认为有很多人有很多知识。我希望你们其他人可能会遇到这样或那样的问题。在IAR EWARM问题上为Kinetis MKE06Z微控制器定制自举程序
我一直在为Kinetis MKE06Z微控制器实现自定义引导加载程序时遇到了一些问题,而不是在引导加载程序本身中,而是在跳转到应用程序代码和行为后重定位。应用程序完全以C编码。
引导加载程序按预期执行所有操作,确定它是否应运行或跳转到用户应用程序。这是一个实现了跳跃的顺序:
void JumpToUserApplication(uint32_t userStartup)
{
/* set up stack pointer */
asm("LDR r1, [r0]");
asm("MOV r13, r1");
/* jump to application reset vector */
asm("ADDS r0,r0,#0x04 ");
asm("LDR r0, [r0]");
asm("BX r0");
}
在Frescale的AN4767实现:其中
__disable_interrupt();
SCB->VTOR = RELOCATION_VECTOR_ADDR & 0x3FFFFE00;
JumpToUserApplication(RELOCATION_VECTOR_ADDR);
。
到目前为止,这么好。一旦执行了跳转,我会跟踪应用程序的行为(在反汇编窗口中),并在某些指令后发现,它会被跳转指令卡住某个特定地址,最终导致无限循环。然后我一步一步地运行它,以确定哪个是导致此故障的指令。这很奇怪,因为它运行正常,并突然跳转到RAM地址。几个周期,然后跳转到无限循环。我注意到了导致这个奇怪跳跃的指令的地址和无限循环的地址。我看看核心寄存器,发现有一个例外,并注意到它的编号为0x03
(Hard Fault)。然后切换到调试用户应用程序。
进入用户应用程序后,我开始调试。用户应用程序正常运行就像这样(不从Bootloader跳转)。然后我查找相关地址,并发现从引导加载程序跳转时导致硬故障的例程来自IAR:__iar_data_init3
。事情是,它是预编译库的一部分,我不确定是否可以安全地删除它(通过删除并直接将其替换为启动文件上的main
的调用
真正的问题是:为什么在从booloader跳转后应用程序的行为是这样的,但是如果没有这样的跳转则不行?为什么这个例程跳转到RAM地址(当它不应该这样)?
当然,它可能是很少有具体的,但希望有人能够帮助我
您是否可以将帖子限制在您的问题中,并在可能的情况下进行阐述?这是非常通用的,通过提供你不明白的部分的代码片段来尝试更具体的... – yaman
发布一个简单的例子,说明你做了什么以及你认为它应该做什么。 –
对不起,我按下Enter键并发布了一个不完整的问题。我不确定,这是非常具体的。 –