变量.BSS部分

时间:2013-03-21 13:47:10

标签: c embedded

未初始化的变量包含在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
}

4 个答案:

答案 0 :(得分:2)

Re Q2,你必须确保你的SDRAM内存控制器正确初始化,并且在运行时启动之前 .bss段初始化之前,你的内存设备正确的时序和映射 - 代码。您还必须确保运行时启动代码在位于SDRAM中时显式初始化.bss段。

答案 1 :(得分:1)

Q1:是的,那就是他们所在的地方。他们为什么会搬家(为什么你想要他们?)

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

Q2:我完全不明白这个问题,但你确定你的SDRAM是否正常工作?您的平台是否有监视器以允许您读写内存?

答案 2 :(得分:0)

Q1:是的,变量将在.bss部分。

Q2:您可以尝试将.sysmem移动到SDRAM中并检查您是否可以读取和写入值?我怀疑你没有必要的访问权。

答案 3 :(得分:0)

Q2:如何完成此操作的详细信息取决于您使用的系统(您使用的是Linux吗?)

要将.bss部分放在您想要的位置,您必须修改链接描述文件。例如对于Linux内核,它将是vmlinux.lds。

同样在Linux中,引导加载程序将.bss部分清除为全零,例如Uboot,基于elf文件中的信息。你的.bss似乎没有被清零。启动调试的好地方是引导程序。在引导加载程序清除时,您的SDRAM可能无法正确映射到内存中(您可以在系统运行时进行成功的读写测试吗?)。或者CPU的内存保护可能会阻止访问。