嵌入式技术william hill官网
直播中

tovax

10年用户 23经验值
擅长:可编程逻辑
私信 关注
[问答]

关于GNU链接文件中RAM越界的问题

本帖最后由 tovax 于 2014-8-14 15:19 编辑

链接文件中,放入RAM区的三个段代码如下:
/************************************************************************************
*
*  data section
*  Goes into RAM
************************************************************************************/
        .data : AT (__etext)
        {
    /* Global symbol at start of data */
                __data_start__ = .;
                *(vtable)
                *(.data*)

                . = ALIGN(4);
                /* preinit data */
                PROVIDE_HIDDEN (__preinit_array_start = .);
                KEEP(*(.preinit_array))
                PROVIDE_HIDDEN (__preinit_array_end = .);

                . = ALIGN(4);
                /* init data */
                PROVIDE_HIDDEN (__init_array_start = .);
                KEEP(*(SORT(.init_array.*)))
                KEEP(*(.init_array))
                PROVIDE_HIDDEN (__init_array_end = .);


                . = ALIGN(4);
                /* finit data */
                PROVIDE_HIDDEN (__fini_array_start = .);
                KEEP(*(SORT(.fini_array.*)))
                KEEP(*(.fini_array))
                PROVIDE_HIDDEN (__fini_array_end = .);

                KEEP(*(.jcr*))
                . = ALIGN(4);
                /* Global symbol at end of data */
                __data_end__ = .;

        } > RAM

/************************************************************************************
*
*  bss section (Uninitialized data)
*  Goes into RAM
************************************************************************************/
        .bss :
        {
                . = ALIGN(4);
    /* Global symbol at start of bss */
                __bss_start__ = .;
                *(.bss*)
                *(COMMON)
                . = ALIGN(4);
    /* Global symbol at end of bss */
                __bss_end__ = .;
        } > RAM

/************************************************************************************
*
*  user_heap_stack section
*  Check that there is enough RAM left for stack and heap
************************************************************************************/
  ._user_heap_stack :
  {
    . = ALIGN(8);
    __heap_start__ = .;
    . = . + _Min_Heap_Size;
    __heap_end__ = .;
    . = ALIGN(8);
    __stack_start__ = .;
    . = . + _Min_Stack_Size;
    __stack_end__ = .;
    _estack = .;
    . = ALIGN(8);
  } >RAM


//------------代------码------到------此------------

这是新建的工程生成的链接文件,源文件只有startup.s和main.c,main.c中就一个死循环。
直接build后,提示RAM越界超出344字节。(注:MPU的RAM大小为2KB, _Min_Heap_Size和_Min_Stack_Size都设置为0x80)
极端一点,把_Min_Heap_Size和_Min_Stack_Size都设置为0,再次编译后,仍然提示RAM越界超出88字节。(注:88 = 344 - 0x80 - 0x80)

从以上代码看出,RAM区域包括了.data, .bss, ._user_heap_stack
把_Min_Heap_Size和_Min_Stack_Size都设置为0后,._user_heap_stack段是不是就可以忽略了,那么为什么还会超出88字节呢?
我的RAM只有2KB,这样是不是.data+.bss就超了2KB了,但是我这只是新建了个工程,没这么多数据啊,求大神解释
还有,在.data段中,preinit, init, finit, jcr这些数据都是什么意思,是不是这些数据导致了链接时RAM越界?

再次拜谢!!!


回帖(2)

tovax

2014-8-15 08:20:57
经过测试,把"preinit data, init data, fini data"三部分屏蔽掉就可以了,不知道这么简单的程序,这个几个怎么占用那么大的RAM空间?
举报

ckpl

2014-8-19 09:01:28
举报

更多回帖

发帖
×
20
完善资料,
赚取积分