STM32 内存分布探究
出处:中国电子网 发布于:2018-07-04 14:30:30
今天详细了解一下编译后的STM32工程,堆栈内存分布情况,有助于对堆栈大小分配的理解。打开一个基于STM32f103RET6的工程,具有512KB内置flash,以及64KBSRAM,通过map文件可以看出:
名称
位置
地址
备注
RESET复位向量
Flash
0x08000000
上电执行的条代码
库函数代码段
Flash
0x08000144
在程序中调用的库函数,例如字符串处理函数、内存分配函数等
用户自定义函数代码段
Flash
0x08001110
工程模板函数库、用户自定义函数编译后的代码,以函数名首字母排序
.constdata
Flash
0x0800d07c-0x0800d680
用户定义的常量
剩余空间
Flash
名称
位置
地址
备注
.data
SRAM
0x20000000
数据段,以及初始化的全局变量
.bss
SRAM
0x20000268
未初始化的全局变量
HEAP(堆)
SRAM
0x200033e8
启动文件定义的堆空间开始,程序调用malloc自由分配的内存在堆上
STACK(栈)
SRAM
0x200073e8
启动文件定义的栈空间开始,各个函数中的局部变量空间分配到栈上
剩余空间
SRAM
例如在这个工程中,flash自定义参数存储地址,不要定义在0x0800d680之前。
另外,还可以看出在SRAM里,分配存储的是全局变量区,未初始化变量区,堆以及栈。要注意的是,如果堆和栈定义的过小,程序默认定义都不大,一旦使用了一个较大的局部变量,有可能造成栈空间溢出,覆盖掉堆空间甚至上面的全局变量区,造成系统出错的问题。例如在做IAP的过程中,每当向flash写入512个字节时,由于大容量STM32片上flash块大小为2K,写之前要先读出,调用写函数的时候就自动创建一个2K大小的局部变量,由于栈是向上增长的,自然会覆盖堆以及全局变量区,造成未知的错误。根据片上SRAM的资源,将堆和栈适当调大一些为好,比如各设置为4K大小。
上一篇:IC安全烧录量产设计的一种机制
下一篇:再塑超声波成像系统设计
版权与免责声明
凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。
本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。
如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
- cps是什么意思?cps的含义_cps的特征2024/4/16 17:56:11
- 你所知道的DCS系统都有哪些?2024/4/16 17:50:53
- 煤矿人员定位系统的功能及重要性分析2024/4/16 17:43:54
- 什么是冗余?2024/4/15 17:33:02
- linuxfind命令详解2024/4/15 17:27:22