0

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

  • 引导加载程序在 0x0000 处运行
  • Bootloader 将进行一些检查,最终将运行位于 0x10000 的用户应用程序。引导加载程序实际上在跳转到 0x10000 之前移动了向量表。这个用户应用程序是我正在尝试使用 gcc 构建的用户应用程序,并且不会在启动时运行,仅在引导加载程序自行启动后运行。不确定这是否清楚,但我认为只有更改链接器脚本才能工作......但事实并非如此。

我已将此部分地址更改为 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,现在这似乎工作正常 :)

4

2 回答 2

1

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

于 2012-10-08T23:33:51.503 回答
0

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

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

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

于 2012-10-09T23:07:35.927 回答