我现在正在为TM4C1231H6PZ编写固件。前段时间我帮助设置IDE和工具链,为我的项目生成整齐且工作的二进制文件,大约8 kB。之后,我做了一些目录移动等等,现在同一个IDE,使用相同的项目(我已经从归档中恢复了整个项目目录)生成二进制520 Mb大,这显然是错误的。
查看新的二进制文件,我看到有代码从00000000到0000079b,之后只有NULL,然后是20000000到2000002b的一些代码。我相信它必须是一些用于SRAM的代码,但我不知道如何处理它。我试图从20000000开始删除代码,但生成的二进制文件在MCU上不起作用。
有人可以帮我修复我的IDE +工具链,像以前一样生成普通的二进制文件吗?
我使用Eclipse Kepler 2.0.2,用于ARM工具链的代码源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
}
答案 0 :(得分:0)
某处您的代码包含要放入RAM的初始值或程序代码。您需要检查链接器映射文件以找出该段的名称。
让我们说,你会找到
.ramfunc 0x123
0x20000000
在这种情况下,您需要通过添加
将此部分添加到.data细分中*(.data)
*(.data*)
*(.ramfunc) <-- this line
到链接器脚本。
在调用main()之前,数据段将被置于闪存中并由初始化代码复制到RAM中。