1

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

4 回答 4

2

关于 Q2,在运行时启动代码将 .bss 段初始化为零之前,您必须确保您的 SDRAM 内存控制器已使用正确的时序和内存设备映射正确初始化。您还必须确保运行时启动代码在位于 SDRAM 中时显式初始化 .bss 段。

于 2013-03-21T15:09:49.167 回答
1

Q1:是的,他们就在那儿。他们为什么要搬家(你为什么要他们搬家?)

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

Q2:我不完全理解这个问题,但你确定你的 SDRAM 真的可以工作吗?您的平台是否有一个监视器允许您读写内存?

于 2013-03-21T13:52:42.573 回答
0

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

要获得所需的 .bss 部分,您必须修改链接描述文件。例如对于 Linux 内核,它是 vmlinux.lds。

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

于 2013-03-21T14:13:10.920 回答
0

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

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

于 2013-03-21T13:57:55.060 回答