2012-10-08 56 views
0

我目前正在尝试使用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在我的脚本,这似乎现在工作正常:)

+0

在搜索引擎上搜索“arm裸机”。我发现这个例子http://balau82.wordpress.com/2010/02/14/simplest-bare-metal-program-for-arm/ – auselen

+0

因此,当你使用gcc进行调试时,它不会吹走你的引导程序,它跳转到您的主要功能正常? – jjxtra

回答

1

在linke r文件,请指定从0x10000开始的部分。然后在你的crt0或类似的启动代码中,你需要定义你的重置条目处理程序,因为它位于本节中,所以链接器将把它放在那里。这可以通过.section#pragma或类似的机制。您可以通过查看链接器生成的映射文件来验证它是否将重置处理程序置于0x10000。

+0

谢谢你,我已经添加了一些细节到我的问题中,因为bootloader部分对于理解我想实现的内容非常重要。 – batmat

+0

这实际上是有道理的,并且像一个魅力工作:)对不起,迟到的回应,但我们无法与GCC编译,现在都很好!为了记录,我编辑了当前正在工作的问题的链接描述文件。 – batmat

0

我试图更改LPC1768.ld脚本,将FLASH的ORIGIN改为 0x10000,但似乎它没有做任何事情。

检查您的链接器设置,是否使用正确的链接器脚本。更改ORIGIN和大小在此处运行(带有arm-none-eabi-gcc的LPC1768)。请注意,由于向量表位于错误的位置,所以生成的程序将不再执行裸机,而是而不是:您的引导加载程序必须到位以启动它。

请注意,您的引导加载程序不能跳转到0x10000,而是将表中的复位向量从加载到PC中。当您刚刚从0x10000加载MSP(主堆栈指针)时的奖励积分。

+0

感谢TurboJ的帮助,我修改了“HelloWorld \ mbed \ LPC1768 \ GCC_ARM \”中的LPC1768.ld脚本,我的makefile指定了链接脚本:“LINKER_SCRIPT = ./mbed/LPC1768/GCC_ARM/LPC1768.ld” 。现在,如果我用FLASH的ORIGIN构建到0x10000或ORIGIN到0x00000,我会得到完全相同的文件。如果我摆脱LPC1768.ld文件,海湾合作委员会会抱怨,所以我想这是真的使用它。我认为我了解矢量部分,因为我可以用Keil uVision(地址0x10000)编译一些项目,但我们还没有考虑购买uVision来超过大小限制,这就是为什么我们使用gcc。 – batmat