内容提要
引言1.基于C语言的嵌入式MCU应用工程编译结果的代码和数据段(segment)概述1.1.text/.code段1.2.bss段1.3.data段1.4堆(.heap)1.5栈(.stack)2..text、.bss、.data、.heap和.stack段在嵌入式MCU内存中的空间分布3.链接器对全局符号的处理--强符号(StrongSymbols)与弱符号(WeakSymbols)3.1什么是强符号(StrongSymbols)和弱符号(WeakSymbols)3.2链接器对全局符号的处理规则和注意事项4.什么是.COMMON段及其与.bss段的关系4.1什么是.
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序,将SRAM属性定义为只读存储器(readonly),也可以用作.text段的存储器)。
Tips:代码段中,除了用户程序代码(.code/.text)外,还包含以下只读的常数数据:
.const/.rodata段:存放const定义的只读数据.string段:存放字符串常量;.copy/.init段:存放有初始化值全局变量(.data段)的初始化值;1.2.bss段
.bss符号起始块段(bsssegment)是用于存储程序中初始化值为0或未初始化的全局变量的一块内存区域。
bss是英文BlockStartedbySymbol的简称。
bss段属于静态内存分配。
数据段属于静态内存分配。其初始化值存储在Flash中,掉电不丢失,但运行时(runtime)地址在SRAM中。所以.data段占用相同大小的Flash和SRAM存储器地址空间。
当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);
当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
在函数中定义的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)通常会被分配带栈中。
栈的压栈(push)和出栈(pop)具有后进先出(LIFO--LastInFirstOut)的特点,其保证了C语言程序函数调用和中断处理时的现场保护/恢复,从而使得嵌入式MCU中的应用程序可以正常工作。
从这个意义上讲,可将堆栈看成一个数据临时寄存和交换的内存区。
Tips:关于嵌入式MCU软件开发中C语言堆栈的使用,请参考如下