2016-04-21 51 views
1

首先我想介绍一下我自己,因为我是新手。我是一名电子工程师,专门从事嵌入式系统设计和开发。我一直在从网站收集信息很久,我认为有很多人有很多知识。我希望你们其他人可能会遇到这样或那样的问题。在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地址。几个周期,然后跳转到无限循环。我注意到了导致这个奇怪跳跃的指令的地址和无限循环的地址。我看看核心寄存器,发现有一个例外,并注意到它的编号为0x03Hard Fault)。然后切换到调试用户应用程序。

进入用户应用程序后,我开始调试。用户应用程序正常运行就像这样(不从Bootloader跳转)。然后我查找相关地址,并发现从引导加载程序跳转时导致硬故障的例程来自IAR:__iar_data_init3。事情是,它是预编译库的一部分,我不确定是否可以安全地删除它(通过删除​​并直接将其替换为启动文件上的main的调用

真正的问题是:为什么在从booloader跳转后应用程序的行为是这样的,但是如果没有这样的跳转则不行?为什么这个例程跳转到RAM地址(当它不应该这样)?

当然,它可能是很少有具体的,但希望有人能够帮助我

+2

您是否可以将帖子限制在您的问题中,并在可能的情况下进行阐述?这是非常通用的,通过提供你不明白的部分的代码片段来尝试更具体的... – yaman

+0

发布一个简单的例子,说明你做了什么以及你认为它应该做什么。 –

+0

对不起,我按下Enter键并发布了一个不完整的问题。我不确定,这是非常具体的。 –

回答

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 }; 

看来,链接器不明白这一点,让东西从其他应用程序跳时,应用程序胡作非为。取而代之的是,在GUI中保留原始的.icf文件和编辑只有.intvec_start解决了这个问题,但是代码紧接着向量表开始。不是一个问题,但我想将代码重新放置得更远一些。

感谢。