我目前正在尝试使用gcc-arm-embedded离线编译mbed项目,但我想更改起始地址,因为此程序旨在与引导加载程序一起使用,因此最终必须从0x10000运行。我已将我的项目导出为GCC-ARM-EMBEDDED,并且能够使用gcc构建项目。但是我不知道如何将起始地址指定为0x10000。我试图更改LPC1768.ld脚本,将FLASH的ORIGIN更改为0x10000,但似乎它没有做任何事情。
MEMORY
{
FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 0x70000
RAM (rwx) : ORIGIN = 0x100000C8, LENGTH = 0x7F38
USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K
ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K
}
Makefile或其他地方是否有一个选项可以帮助更改程序的起始地址,因此当我从引导加载程序跳转到地址0x10000时它可以正常运行?
修改
我认为我明白了我需要实现的目标,这要归功于几个答案,但由于某些原因,我无法让它发挥作用。 Mbed不会导出startup_LPC17xx.s文件,所以我尝试使用CMSIS中的那个,但没有运气。我想知道我是否真的需要更改启动代码,因为过程如下:
我将此部分地址更改为0x10000的链接器脚本的详细信息:
SECTIONS {
.text :
{
*startup_LPC17xx.o
KEEP(*(.isr_vector))
*(.text*)
KEEP(*(.init))
KEEP(*(.fini))
/* .ctors */
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
/* .dtors */
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
*(.rodata*)
KEEP(*(.eh_frame*))
} > FLASH
.ARM.extab : etc..
EDIT2:我在我的脚本中添加了* startup_LPC17xx.o,现在看起来工作正常:)
答案 0 :(得分:1)
在链接器文件中,指定以0x10000开头的节。然后在您的crt0或类似的启动代码中,您需要将重置条目处理程序定义为驻留在此部分中,以便链接器将其放在那里。这可以通过.section
或#pragma
或类似机制进行。您可以通过查看链接器生成的映射文件来验证它是否将重置处理程序置于0x10000。
答案 1 :(得分:0)
我试图更改LPC1768.ld脚本,更改ORIGIN FLASH到0x10000,但它似乎没有做任何事情。
检查链接器设置,是否使用正确的链接描述文件。在此处更改ORIGIN和尺寸 (带有arm-none-eabi-gcc的LPC1768)。请注意,生成的程序将不再次在裸机上执行,因为向量表将位于错误的位置:您的引导加载程序必须到位才能启动它。
请注意,您的引导加载程序不得跳转到0x10000
,而是将0x10004
中的重置向量加载到PC中。在您之前从0x10000
加载MSP(主堆栈指针)时的加分点。