首先,我想介绍一下自己,因为我是网站的新手。我是一名电子工程师,专门从事嵌入式系统设计和开发。我一直在从网站上收集信息很长一段时间,我认为有很多人都有很多知识。我希望你们中的其他人可能偶然发现了这个或类似的问题。
我在为Kinetis MKE06Z微控制器实现自定义引导加载程序时遇到了一些麻烦,而不是在引导加载程序本身,而是在应用程序代码的重定位和跳转到它之后的行为。该应用程序完全用C语言编码。
引导加载程序按预期执行所有操作,确定它是应该运行还是跳转到用户应用程序。这是实现跳转的序列:
__disable_interrupt();
SCB->VTOR = RELOCATION_VECTOR_ADDR & 0x3FFFFE00;
JumpToUserApplication(RELOCATION_VECTOR_ADDR);
其中:
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 中实现。
到目前为止,这么好。一旦执行了跳转,我就会跟踪应用程序行为(在反汇编窗口中)并在一些指令之后找出它,它会被一个跳转指令卡在某个特定的地址,最终成为一个无限循环。然后我逐步运行它以确定哪个是导致此故障的指令。这很奇怪,因为它运行正常并突然跳转到RAM地址。几个周期然后跳转到无限循环。我注意到导致这个奇怪跳转的指令的地址和带有无限循环的地址。我查看核心寄存器并发现存在异常,并注意它是数字0x03
(硬错误)。然后切换到调试用户应用程序。
进入用户应用程序后,我开始调试。用户应用程序可以正常运行(没有从引导加载程序跳转)。然后我查找相关地址并发现从引导加载程序跳转时导致硬故障的例程来自IAR:__iar_data_init3
。问题是,它是预编译库的一部分,我不确定删除它是否安全(删除__iar_program_start
并直接用启动文件上的main
调用替换它。 / p>
真正的问题是:为什么应用程序在从booloader跳转后表现得像那样,但如果没有这样的跳转则没有?为什么这个例程会跳转到RAM地址(当它不应该时)?
当然,这可能有点具体,但希望有人可以帮助我。
答案 0 :(得分:0)
似乎IAR对链接器配置做的事情对我来说不是很清楚,但与此问题有关。事情是我重新定位.text段:
define symbol __ICFEDIT_intvec_start__ = 0x00001800;
define symbol __ICFEDIT_region_ROM_start__ = 0x00002000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0000FFFF;
define region APP_ROM = mem:[from (__ICFEDIT_region_ROM_start__) to (__ICFEDIT_region_ROM_end__)];
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at start of APP_ROM { readonly section .text };
似乎链接器并不欣赏这一点,并且当从其他应用程序跳转时,某些东西会使应用程序行为异常。而不是这样,保留原始的.icf文件并在GUI中仅编辑.intvec_start解决了问题,但代码在向量表旁边开始。不是问题,但我想将代码重新安置得更远。
感谢。