2017-04-26 57 views
0

我已經通過編譯使用Keil實例項目生成* .o文件的具體地址ELF文件,然後我編輯過我想要的默認0x08000000代替地址* SCT文件並生成* .elf在指定載荷並執行地址。生成與

我已裝入* .elf文件到閃存和它的工作。它是在指定的地址下載的,但是當我檢查內存時,我發現數據已經改變,這是因爲我沒有觸及* .o文件,每次只調用鏈接器。

我的問題是,爲什麼用同樣的*的.o,只是通過改變地址,我的數據也會受到影響?

回答

1

對於大多數嵌入式平臺,您必須遵循一些規則。

  1. 重置處理程序和向量表必須位於由硬件指定的定義位置。

  2. 你不能有復位啓動區域不同的加載和執行地址區域(LR/ER)。鏈接器插入一個腳本,該腳本將數據從加載區複製到執行區,如果它們不重疊的話。如下面的區域RW_IRAM1。由於在正常情況下無法寫入閃存,因此失敗。

  3. ,如果它沒有被編譯進是獨立的存儲位置,則無法編譯後更改的內存區域。代碼可能包含絕對跳轉。
    例如:跳轉到0x0800400爲foo()。或者爲char x讀取0x0802FFE。

有效分散文件的示例。

LR_IROM1 0x08000000 0x00100000 { ; load region size_region 
    ER_IROM1 0x08000000 0x00001000 { ; load address = execution address 
    *.o (RESET, +First) ; boot code 
    *(InRoot$$Sections) ; linker loader parts, initializes RW_IRAM1 
    .ANY (+RO)   ; your code 
    } 
    RW_IRAM1 0x20000000 0x00020000 { ; RW data 
    .ANY (+RW +ZI) 
    } 
} 

您可以爲外部存儲器添加額外的加載區域(LR)。如果loader application設置了界面。
您可以添加額外的區域,用於諸如非易失性內存仿真之類的內容。在編程期間預先加載或跳過它。

在這裏你可以找到一切爲了the linker。其中有一段分散加載。

+0

謝謝,所以我需要檢查是否有可能使編譯成爲內存位置獨立? – erfaheel

+0

是的,但請記住,您必須在內存的前幾個單詞上添加內容,以告訴硬件從何處開始。 – Jeroen3

+0

好的,謝謝。 – erfaheel