STM中FLASH和RAM的关系

一、STM32中的内存分布情况
要搞清楚stm32 FLASH、RAM的使用情况,就需要理清楚stm32的存储结构。
在stm32中,flash,SRAM寄存器和输入输出端口被组织在同一个线性地址空间内
C语言上分为栈、堆、bss、data、code段。重点分析一下STM32以及在MDK里面段的划分。
MDK下Code,RO-data,RW-data,ZI-data这几个段:
在这里插入图片描述
Code是存储程序代码的。
RO-data是存储const常量和指令。(read-Only-data)
RW-data是存储初始化值不为0的全局变量。(Read-Write-data)
ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。(Zero-Initialize-data)
Flash=Code + RO Data + RW Data;
RAM= RW-data+ZI-data;
这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。
在stm32的启动文件中,statrtup_stm32xxxxxxx.s文件中,有一句这样的函数
在这里插入图片描述
表示栈的大小为0x400也就是1024字节,堆的大小0x400也是1024字节(这里的堆进行了修改)。这样CPU在处理任务的时候,函数局部变量最多可以占用的空间大小为1024字节。这里的栈大小包括函数的嵌套,递归等等,都是从这个栈里面分配出来的。
所以如果一个函数的局部变量过多,或者嵌套层数越深,那么程序非常容易出现崩溃的情况。所以一定不要在函数里放过多或者比较大的局部变量/buf。
堆的增长方向时向上的,而栈的增长方向时向下的,并且没有固定的界限,一旦堆栈冲突,函数就会崩溃。总体上也就是说,在使用堆栈的过程中,一定要确保堆栈的大小及使用情况。
二、STM32上的内存使用情况查询
在STM32编译的时候会生成.map文件。如果没有.map文件的话见下图中Memory Map是否勾选。
在这里插入图片描述
MAP文件中内容很多,感兴趣可以自己仔细研究一下,这里只拿出几个问题进行举例,例下两图中,我们可以清晰的看到每一个文件中所编译的代码大小这里包含了我们前面所说的Code,RO-data,RW-data,ZI-data这几部分,甚至,我们还可以看到每一个变量的大小,以及编译之后的地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43448742/article/details/106431903