我目前正在尝试使用gcc-arm-embedded离线编译mbed项目,但我想更改起始地址,因为此程序旨在与bootloader一起使用,因此最终必须从0x10000运行。我已经将我的项目导出为GCC-ARM-EMBEDDED,并且能够使用gcc构建项目。不过,我不知道如何将开始地址指定为0x10000。我试图更改LPC1768.ld脚本,将FLASH的ORIGIN更改为0x10000,但似乎它没有做任何事情。gcc开始地址
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中的一个选项或其他地方,这将有助于改变程序的起始地址,所以当我从我的引导程序跳转到ADRESS的0x10000它可以正确运行?
编辑:
我想我明白我需要实现得益于几个答复,但由于某些原因,我不能得到它的工作。 Mbed不会导出startup_LPC17xx.s文件,因此我尝试使用CMSIS中的那个文件,但没有运气。我想知道如果我真的需要改变启动代码的过程如下:
- Bootloader的运行是0x0000
- 引导程序会做一些检查,并最终将运行用户应用 坐在在0x10000。在跳转到0x10000之前,引导加载程序实际上移动向量表 。这个用户应用程序是我正在尝试使用gcc编译的 ,并且不会在启动时运行,只有在引导加载程序启动后才会运行 。不知道这是否清楚,但 我会认为只更改链接器脚本将工作...但事实并非如此。链接脚本的
细节,我已经改变了这部分地址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在我的脚本,这似乎现在工作正常:)
在搜索引擎上搜索“arm裸机”。我发现这个例子http://balau82.wordpress.com/2010/02/14/simplest-bare-metal-program-for-arm/ – auselen
因此,当你使用gcc进行调试时,它不会吹走你的引导程序,它跳转到您的主要功能正常? – jjxtra