2013-03-21 81 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段。