针对 IAR EWARM 问题的 Kinetis MKE06Z 微控制器的自定义引导加载程序

Custom Bootloader for Kinetis MKE06Z microcontrollers on IAR EWARM issue

首先我想自我介绍一下,因为我是这个网站的新手。我是一名电子工程师,专门从事嵌入式系统设计和开发。我已经从该站点收集了很长时间的信息,而且我认为有很多知识渊博的人。我希望你们中的其他人可能偶然发现了这个或类似的问题。

我在为 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 中实现。

到目前为止,还不错。执行跳转后,我跟踪应用程序行为(在反汇编 Window 上)并发现在执行一些指令后,它通过跳转指令卡在某个特定地址,最终成为无限循环。然后我运行一步步确定是哪条指令导致了这个故障。很奇怪,运行ning OK,突然跳转到RAM地址。几个循环,然后跳转到无限循环。我记下了导致这种奇怪跳转的指令的地址和无限循环的地址。我查看了核心寄存器,发现有一个异常,并注意到它是数字 0x03Hard Fault)。然后切换到调试用户应用程序。

进入用户应用程序后,我开始调试。用户应用程序像这样 运行ning 工作正常(没有从引导加载程序跳转)。然后查找相关地址,发现从bootloader跳转时出现hard fault的例程来自IAR:__iar_data_init3。问题是,它是预编译库的一部分,我不确定删除它是否安全(通过删除 __iar_program_start 并将其直接替换为启动文件中对 main 的调用。

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

当然,这可能有点具体,但希望有人能帮助我。

我不太清楚 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 解决了问题,但代码从矢量 table 旁边开始。没问题,但我想将代码移得更远一些。

谢谢。