2012-10-08 55 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