STM32 内存分布探究
STM32 内存分布探究
2016-2-2
本人在运行ucos时遇到一个非常奇怪的问题,运行一段时间后就会莫名进入hardfault函数,导致系统死机。后来根据对堆栈调试,发现每次调用的函数都不一样,甚是费解。通过map文件最后得出结论,原来在系统初始化的时候在flash里面读出了系统配置参数,在系统运行过程中会写flash,而flash定义的地址与程序代码存储的位置发生了重叠,一写数据就擦掉了一些函数,当调用到这些函数的时候就会发生未知指令的错误。把这个参数存储地址定义的分开些就会解决这个问题。可是,开始这个地址写好了,随着程序代码不断增多,消耗的片上flash也会增大,是个动态增长的过程,不注意很有可能发生冲突。所以在项目开发过程中定期检查定义的参数存储地址,或者干脆把参数存储地址定义在程序地址之前。
今天详细了解一下编译后的STM32工程,堆栈内存分布情况,有助于对堆栈大小分配的理解。打开一个基于STM32f103RET6的工程,具有512KB 内置flash,以及64KB SRAM,通过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大小。
STM32 内存分布探究相关推荐
- STM32(C语言)内存分布
STM32(C语言)内存分布 文章目录 前言 一.STM32内存分布 二.三段式分布 前言 缘由: 最近尝试在STM32上移植SOEM,使用的基例程是原子的LWIP实验,在移植完成后出现了内存冲突的问 ...
- STM32内存分布学习
1.STM32内存分布 下图是一张stm32的内存映射图,其中代码区是从0x0800 0000开始的,他的结束地址是0x0800 0000加上实际芯片的flash大小,他的ram的起始地址是0x200 ...
- stm32的内存分布
一.MDK下的概念 1)Code:代码段,存放程序的代码部分. 2)RO-data:只读数据段,存放定义的常量. 3)RW-data:读写数据段,存放初始化为非0值的全局变量和静态变量. 4)ZI-d ...
- STM32之内存分布与总线
1.总线 系统结构 系统包括一个由多个互相连接的32位AHB总线组成的矩阵 8个主总线 – Cortex-M4 with FPU core I-bus, D-bus and S-bus– DMA1 m ...
- Swift 对象内存模型探究(一)
MemoryLayout 基本使用方法 HandyJSON 是 Swift 处理 JSON 数据的开源库之一,类似 JOSNModel,它可以直接将 JSON 数据转化为类实例在代码中使用. 由于 S ...
- 深入理解STM32内存管理
参考:详解ROM和RAM 作者:嵌入式实验楼 网址:https://mp.weixin.qq.com/s/y2aG7kX-6CTyeMzEJW_YHw 内存相关博文: 1.内存四区(代码区 静态区 栈 ...
- STM32内存结构总结
文中引用图片来源与网络 本文由各方面资料整理而成 文章目录 0.STM32内存结构图 1.要点 1.1 两种存储类型: RAM 和 Flash 1.2 六类存储数据段: .data/.bss/.tex ...
- 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系
参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...
- C++内存分布之菱形继承(无虚函数)
菱形继承的定义是:两个子类继承同一父类,而又有子类同时继承这两个子类.例如a,b两个类同时继承c,但是又有一个d类同时继承a,b类.探究的过程还是很有趣的. 菱形继承的内存布局探究花了我几天时间,探究 ...
最新文章
- 自动化运维—saltstack
- [自动化]Puppet服务安装和部署
- linux 进程隐藏常见方法
- 【笔记】windows10安装linux(ubuntu)双系统教程(可能是现今最简单方法)
- oracle pl/sql 函数
- 终端、虚拟控制台与伪终端
- 服务器虚拟化怎么使用,服务器使用中的误区及建议 服务器虚拟化安装步骤
- linux 1t 分区,Linux磁盘管理——swap分区
- 【原创】《算法导论》链表一章带星习题试解——附C语言实现
- springboot json 嵌套_Java Bean Validation 2.0 (一): 对Spring Boot应用的数据验证
- 国外量化投资的经典案例
- Linux网络命令之 `brctl`
- Java解压ZIP、RAR文件
- 以太坊编程入门实战-熊健-专题视频课程
- java设计模式笔记
- android wifi热点设置用户数,android 如何获取连接wifi热点的设备数量
- Java中涉及到金钱计算方法
- 海豚湾(还是忍不住说日本人真的太垃圾了)
- 【Python项目】你们还在冲会员看电影电视剧嘛?Python带你免费看电影电视剧资源 | 附源码
- npm login报错:npm notice Beginning October 4, 2021, all connections to the npm registry.......
热门文章
- boos直聘显示服务器繁忙,BOSS 直聘回应服务“崩了”:系统升级已完成,可正常使用...
- JavaScript判断输入的数是不是素数
- kernel panic - not syncing : fatal exception
- Python基础语法函数——经典函数实例
- Ajax.NET中的ajax.js脚本
- with root cause 解决办法
- day11 反转字符串||反转字符串2
- 第19篇 基础(十九)详解QVector(数组)
- Android引入Ijkplayer
- 有没有什么好的可以做读书笔记的APP推荐?