微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 关于GNU链接文件中RAM越界的问题

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

时间:10-02 整理:3721RD 点击:

链接文件中,放入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越界?
再次拜谢!

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top