我目前正在嘗試使用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