0

我现在正在为 TM4C1231H6PZ 编写固件。前段时间,我被帮助设置 IDE 和工具链,它们为我的项目生成整洁且工作的二进制文件,大约 8 kB 大。之后,我做了一些目录移动等等,现在同一个 IDE,使用同一个项目(我已经从存档中恢复了整个项目目录)生成了 520 Mb 大的二进制文件,这显然是错误的。

查看新的二进制文件,我看到有从 00000000 到 0000079b 的代码,之后只有 NULL,然后是从 20000000 到 2000002b 的一些代码。我相信它必须是一些用于 SRAM 的代码,但我不知道如何处理它。我试图从 20000000 开始删除代码,但生成的二进制文件在 MCU 上不起作用。

有人可以帮我修复我的 IDE+工具链以像以前一样生成正常的二进制文件吗?

我使用 Eclipse Kepler 2.0.2、用于 ARM 工具链的 Codesourcery Lite(arm-2013.11-24-arm-none-eabi.exe 安装程序)和 TivaWare(SW-TM4C-2.1.0.12573.exe)。

这是我的链接器脚本文件:

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 32K
}

SECTIONS
{
    .text :
    {
        _text = .;
        KEEP(*(.isr_vector))
        *(.text*)
        *(.rodata)
        *(.rodata*)
        _etext = .;
    } > FLASH

    /* C++ initialization and finalization data */
    .preinit_array :
    {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
    } >FLASH
    .init_array :
    {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
    } >FLASH
    .fini_array :
    {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(.fini_array*))
        KEEP (*(SORT(.fini_array.*)))
        PROVIDE_HIDDEN (__fini_array_end = .);
    } >FLASH

    .data : AT(ADDR(.text) + SIZEOF(.text) + SIZEOF(.preinit_array) + SIZEOF(.init_array) + SIZEOF(.fini_array))
    {
        . = ALIGN(4);
        _data = .;
        *(.data)
        *(.data*)
        . = ALIGN(4);
        _edata = .;
    } > SRAM

    . = ALIGN(4);
    .bss :
    {
        _bss = .;
        *(.bss*)
        *(COMMON)
        . = ALIGN(4);
        _ebss = .;
    } > SRAM
}
4

1 回答 1

0

您的代码在某处包含要放置在 RAM 中的初始值或程序代码。您需要检查您的链接器映射文件以确定该段的名称。

比方说,你会发现

.ramfunc  0x123
    0x20000000

在这种情况下,您需要将此部分添加到您的 .data 段中,方法是添加

*(.data)
*(.data*)
*(.ramfunc) <-- this line

到您的链接器脚本。

在调用 main() 之前,数据段将被放入闪存并由初始化代码复制到 RAM。

于 2014-09-25T16:06:25.923 回答