未初始化的变量包含在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
}
答案 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的内存保护可能会阻止访问。