0

我已将 STM32F4 项目从 Keil uVision5 移植到 Eclipse(GNU MCU 插件)。

在我的 Keil uVision5 项目中,我曾经使用第 7 块 (0x080E0000) 作为我的引导代码(我使用STM32 ST-LINK Utility工具验证我的引导代码确实位于第 7 块),我曾经使用 Keil uVision5 非常容易地配置它界面如下图:

在此处输入图像描述

如果我没记错的话,在我的 Keil uVision 项目(其内存配置如上所示)中,MCU 从第 0 块 (0x08000000) 启动,然后立即跳转到第 7 块 (0x080E0000) 以执行我的代码。如果我错了,请告诉我。

我的问题在于我的 Eclipse 项目。您可能已经知道,我们使用名为 mem.ld 的链接描述文件配置内存映射。我尝试使用 mem.ld 模仿相同的行为,但我想我失败了。每当我刷新 Eclipse 生成的可执行文件时,我的代码都不会运行。此外,我找不到在 mem.ld 文件中指示启动区域的方法。下面是我在 mem.ld 文件中的内存配置:

MEMORY
{
    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
    CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
    FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
    FLASHB1 (rx) : ORIGIN = 0x080E0000, LENGTH = 640K
    EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    MEMORY_ARRAY (xrw)  : ORIGIN = 0x20002000, LENGTH = 32
}

你能帮我用 mem.ld 文件模仿 Keil uVision5 的相同行为吗?我在 mem.ld 配置中犯了什么错误?正确的配置应该是什么?

提前非常感谢。

4

1 回答 1

2

重置后执行的代码地址取自向量表的 4-7 个字节(称为重置向量)。

在 gcc 风格的链接器脚本中,该ENTRY指令很重要,而不是您的内存部分定义。

您可以将条目更改为地址值或符号。例如

ENTRY(My_Startup_Function)或者在 CubeMX 生成的标准链接器脚本中ENTRY(Reset_Handler)

在 keil 中,我记得你有几个选择:命令行

--entry=location

其中位置可以是地址或符号

是有关根区域和入口点的更多信息。我不再使用keil,个人更喜欢gcc。

于 2018-08-22T10:32:44.323 回答