我目前正在尝试使用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时它可以正常运行?
EDIT:
我想我理解我需要实现的目标,这要归功于几个回复,但由于某些原因,我无法让它发挥作用 . Mbed不会导出startup_LPC17xx.s文件,所以我尝试使用CMSIS中的那个,但没有运气 . 我想知道我是否真的需要更改启动代码,因为过程如下:
-
Bootloader运行在0x0000
-
Bootloader将进行一些检查,最终将运行位于0x10000的用户应用程序 . 引导程序实际上在跳转到0x10000之前移动向量表 . 这个用户应用程序是我尝试使用gcc构建的用户应用程序,并且不会在启动时运行,仅在引导加载程序启动后运行 . 不确定是否's clear but I would think that only changing the Linker script would work... but it isn' t .
链接器脚本的详细信息,我将此节地址更改为0x10000:
部分{
.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,这似乎工作正常:)
2 回答
在链接器文件中,指定以0x10000开头的节 . 然后在您的crt0或类似的启动代码中,您需要将重置条目处理程序定义为驻留在此部分中,以便链接器将其放在那里 . 这可以通过
.section
或#pragma
或类似的机制 . 您可以通过查看链接器生成的映射文件来验证它是否将重置处理程序置于0x10000 .检查链接器设置,是否使用正确的链接描述文件 . 更改ORIGIN和尺寸在这里工作(LPC1768与arm-none-eabi-gcc) . 请注意,生成的程序将不再在裸机上执行,因为向量表将位于错误的位置:您的引导加载程序必须在适当的位置启动它 .
请注意,您的引导加载程序不得跳转到
0x10000
,而是将表中的复位向量从0x10004
加载到PC中 . 从之前的0x10000
加载MSP(主堆栈指针)时的加分点 .