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