【发布时间】:2018-07-03 16:44:59
【问题描述】:
我为 Kinetis K24 Cortex M4 编写了引导加载程序。引导加载程序在运行时通过 USB 将附加功能加载到 ram 中。这个 ramcode 作为它自己的 EWARM 项目存在,生成一个二进制文件。该二进制文件的入口点必须始终为 0x20000000,并且向量表必须始终位于 0x20007000 以便与我的 .NET 工具很好地配合使用。 IAR 启动代码处理 .bss 和 .data 副本的清除,但它也做了一些我不想要的其他事情。我不知道如何将 IAR 入口点强制到特定地址,所以我创建了自己的入口点,像这样
#pragma section=".bss"
#pragma location=".init"
__interwork int __low_level_init(void)
{
char * from = __section_begin(".bss");
char * to = __section_end(".bss");
__DI(); // Disable interrupts
memset(from, 0x00 , (to - from));
memcpy(__vector_table, (unsigned char *)ROM_VECTOR_LOCATION, VECTOR_TABLE_SIZE);
SCB_VTOR = (unsigned int) & __vector_table;
main();
SCB_VTOR = (uint32_t)ROM_VECTOR_LOCATION;
}
当我调试代码时,我可以看到初始化为非零值的全局变量采用随机值。我相信这是因为我没有将 .data 部分从 LMA 复制到 VMA。
我的问题是如何将 .data 部分的副本从 LMA 复制到 VMA?
如果我能弄清楚如何分解它,我也愿意使用 IAR 启动代码,但入口点不能是重置向量。入口点必须是 0x20000000 并且向量表必须位于 0x20007000
【问题讨论】:
-
你已经做了一些数据的
memcpy,为什么不添加另一个呢?您需要的所有信息都应该提供给您,是吗?.data段在 FLASH 中的开始和结束,以及它在 RAM 中的某个位置? -
Some useful tips & tricks for how to roll out the "CRT" yourself on a generic MCU。最值得注意的是,您的代码似乎无法在您初始化 .data 和 .bss 之前设置时钟。那将是非常糟糕的。虽然当然不是所有来自该链接的都适用于 Cortex M4,但 ARM 通过硬件等设置 SP。
-
是的,我认为这将是一个简单的副本,但我不知道此信息的位置。它不在我的链接器脚本中,地图文件中没有任何内容突出。
-
如果你想初始化变量,从 __low_level_init 调用 main 不是一个好主意。 __low_level_init 在初始化代码之前被调用。
-
无论如何,我不知道 IAR 对各个段的命名是什么,但显然你需要一个
memcpy,从.data初始化器存储在闪存中的任何位置,到名为.data的 RAM 块。检查您的链接器文件/映射文件/符号浏览器以找出使用的名称。我不认为 LMA/VMA 是个问题。