STM32的堆与栈与编译信息查看(二)

Keil IDE的编译信息在工程文件夹的xx.map文件中,STM32的RAM分区从0x0200 0000开始,静态区、堆、栈。

所有的全局变量,包括静态变量之类的,全部存储在静态存储区。然后是堆区(如没用到malloc,则没有该区),之后是栈区,栈在程序中存储局部的变量。

 ; Amount of memory (in bytes) allocated for Stack

; Tailor this value to your application needs
; Stack Configuration
; Stack Size (in Bytes)
;Stack_Size      EQU     0x00000400
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
 
; Heap Configuration
;    Heap Size (in Bytes)
;Heap_Size       EQU     0x00000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

这里定义了堆栈各自大小,堆:512bytes 栈1k;

所以栈区大小有限制,我们在局部变量中不要定义大数组否则容易溢出。

查看xx.map文件

Removing Unused input sections from the image.就是将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。

第一行, Removing startup_stm32f10x_md.o(HEAP), (512 bytes).意思是因为没有使用malloc动态分配内存,所以没有分配堆。
 
Image Symbol Table
 
    Local Symbols      符号表里的局部符号。
 
    Symbol Name             Value     Ov Type        Size  Object(Section)
最后一项
    STACK                  0x2000560  Section     1024  startup_stm32f10x_md.o(STACK)
    Global Symbols     符号表里的全局符号
    Symbol Name             Value     Ov Type        Size  Object(Section)
最后一项
    __initial_sp          0x2000960   Data           0  startup_stm32f10x_md.o(STACK)
STACK是栈底,__initial_sp 栈顶地址,此地址被存在Flash0x0800 0000中,占用四个字节。
所以栈大小 为 0x400 即1024个字节。
再加入malloc看一下

HEAP                                      0x20000568   Section      512    startup_stm32f10x_md.o(HEAP)  
STACK                                    0x20000768   Section     1024   startup_stm32f10x_md.o(STACK)  
 __heap_base                         0x20000568   Data           0       startup_stm32f10x_md.o(HEAP)  
 __heap_limit                          0x20000768   Data           0       startup_stm32f10x_md.o(HEAP)  
 __initial_sp                             0x20000b68   Data           0      startup_stm32f10x_md.o(STACK) 

可见分配了堆,大小为512 bytes在栈的下面,这里也可以看出, 堆向上增长,栈向下增长,如果栈分配的空间不足,将会占用堆的空间,malloc时,可能因为堆空间不足,导致不能分配内存。

要想分配堆空间和栈空间的大小可以设置启动文件的和Heap_Size和Stack_Size的值,随着堆分配和栈分配空间加大,此时编译后看到ZI-data将相应变大,但这个并不是真正的变大,只是分配了较大的空间,可能并没有使用。网上还有把栈顶直接分配到RAM的最高处,这样不管如何分配栈空间,基本不会导致内存溢出。
银火虫 发表于06-12 10:27 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

银火虫
银火虫(中将)
金币:5919个|学分:6733个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号