gcc起始地址

时间:2012-10-08 19:51:58

标签: gcc embedded arm bootloader cortex-m3

我目前正在尝试使用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中的那个,但没有运气。我想知道我是否真的需要更改启动代码,因为过程如下:

  • Bootloader以0x0000
  • 运行
  • Bootloader将进行一些检查,最终将运行用户应用程序 坐在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,现在看起来工作正常:)

2 个答案:

答案 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(主堆栈指针)时的加分点。