2013-03-21 52 views
1

未初始化的變量包含在BSS部分中。變量.BSS部分

第一個問題:當他們被分配時他們會留在那裏嗎?

第二個問題/問題:我想將這部分加載到外部SDRAM中。變量正確地位於內存映射中,但填充了奇怪的值,並且我不能將任何其他數字存儲到內存中。你有關於這個問題的想法嗎?

/* Memory Map                 */ 
MEMORY{ 
    VECTORS (X) : origin=0x00000000 length=0x00000020 
    FLASH0 (RX) : origin=0x00000020 length=0x0017FFE0 
    FLASH1 (RX) : origin=0x00180000 length=0x00180000 
    STACKS (RW) : origin=0x08000000 length=0x00001500 
    RAM  (RW) : origin=0x08001500 length=0x0003EB00 
    SDRAM (RW) : origin=0x80000000 length=0x00800000 
} 

/*----------------------------------------------------------------------------*/ 
/* Section Configuration              */ 
SECTIONS{ 
    .intvecs : {} > VECTORS 
    .text : {} > FLASH0 | FLASH1 
    .const : {} > FLASH0 | FLASH1 
    .cinit : {} > FLASH0 | FLASH1 
    .pinit : {} > FLASH0 | FLASH1 
    .bss  : {} > SDRAM 
    .data : {} > RAM 
    .sysmem : {} > RAM 
} 
+1

Joachim:錯......仔細閱讀數字:) – Anonymouse 2013-03-21 13:53:04

+2

另外,給我們更多關於系統的細節。即使將'.bss'正確地移動到SDRAM地址空間,執行'crt0'時'SDRAM'可能尚未配置,等等。因此,給我們更多信息! – 2013-03-21 13:53:08

+0

@Anonymouse是的,注意到在我看到你的評論之前。 :) – 2013-03-21 13:54:35

回答

1

Q1:是的,那就是它們的位置。他們爲什麼要移動(爲什麼你會希望他們?)

http://en.wikipedia.org/wiki/.bss

Q2:我不完全理解的問題,但你肯定你的SDRAM actualy工作?您的平臺是否有監視器,以便您可以讀取和寫入內存?

0

Q1:是的,變量將在.bss部分。問題2:你可以嘗試將.sysmem移動到SDRAM中,並檢查你是否可以讀寫值?我懷疑你沒有必要的訪問。

0

Q2:如何這是一定要做詳細信息取決於你使用的系統(?你使用的是Linux)

要得到你想要的.bss節,你將不得不修改鏈接腳本。例如對於將是vmlinux.lds的Linux內核。

同樣在Linux中,引導加載程序將.bss段清除爲全零。 Uboot基於elf文件中的信息。您的.bss似乎不會清零。啓動調試的好地方是引導加載程序。在引導加載程序清除它時,您的SDRAM可能無法正確映射到內存中(您可以在系統運行時執行成功的寫入讀取測試嗎?)。或者CPU的內存保護可能會阻止訪問。

+0

實際上不是在修改鏈接描述文件嗎?問題中的代碼片段看起來像LD腳本:) – 2013-03-21 14:36:35

2

重新Q2,你必須確保你的SDRAM內存控制器正確與正確的時序和映射您的存儲設備初始化前體的.bss段被零運行時啓動代碼初始化。您還必須確保運行時啓動代碼在SDRAM中明確初始化.bss段。