关于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空间?