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 内存分布探究相关推荐

  1. STM32(C语言)内存分布

    STM32(C语言)内存分布 文章目录 前言 一.STM32内存分布 二.三段式分布 前言 缘由: 最近尝试在STM32上移植SOEM,使用的基例程是原子的LWIP实验,在移植完成后出现了内存冲突的问 ...

  2. STM32内存分布学习

    1.STM32内存分布 下图是一张stm32的内存映射图,其中代码区是从0x0800 0000开始的,他的结束地址是0x0800 0000加上实际芯片的flash大小,他的ram的起始地址是0x200 ...

  3. stm32的内存分布

    一.MDK下的概念 1)Code:代码段,存放程序的代码部分. 2)RO-data:只读数据段,存放定义的常量. 3)RW-data:读写数据段,存放初始化为非0值的全局变量和静态变量. 4)ZI-d ...

  4. STM32之内存分布与总线

    1.总线 系统结构 系统包括一个由多个互相连接的32位AHB总线组成的矩阵 8个主总线 – Cortex-M4 with FPU core I-bus, D-bus and S-bus– DMA1 m ...

  5. Swift 对象内存模型探究(一)

    MemoryLayout 基本使用方法 HandyJSON 是 Swift 处理 JSON 数据的开源库之一,类似 JOSNModel,它可以直接将 JSON 数据转化为类实例在代码中使用. 由于 S ...

  6. 深入理解STM32内存管理

    参考:详解ROM和RAM 作者:嵌入式实验楼 网址:https://mp.weixin.qq.com/s/y2aG7kX-6CTyeMzEJW_YHw 内存相关博文: 1.内存四区(代码区 静态区 栈 ...

  7. STM32内存结构总结

    文中引用图片来源与网络 本文由各方面资料整理而成 文章目录 0.STM32内存结构图 1.要点 1.1 两种存储类型: RAM 和 Flash 1.2 六类存储数据段: .data/.bss/.tex ...

  8. 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

    参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...

  9. C++内存分布之菱形继承(无虚函数)

    菱形继承的定义是:两个子类继承同一父类,而又有子类同时继承这两个子类.例如a,b两个类同时继承c,但是又有一个d类同时继承a,b类.探究的过程还是很有趣的. 菱形继承的内存布局探究花了我几天时间,探究 ...

最新文章

  1. 自动化运维—saltstack
  2. [自动化]Puppet服务安装和部署
  3. linux 进程隐藏常见方法
  4. 【笔记】windows10安装linux(ubuntu)双系统教程(可能是现今最简单方法)
  5. oracle pl/sql 函数
  6. 终端、虚拟控制台与伪终端
  7. 服务器虚拟化怎么使用,服务器使用中的误区及建议 服务器虚拟化安装步骤
  8. linux 1t 分区,Linux磁盘管理——swap分区
  9. 【原创】《算法导论》链表一章带星习题试解——附C语言实现
  10. springboot json 嵌套_Java Bean Validation 2.0 (一): 对Spring Boot应用的数据验证
  11. 国外量化投资的经典案例
  12. Linux网络命令之 `brctl`
  13. Java解压ZIP、RAR文件
  14. 以太坊编程入门实战-熊健-专题视频课程
  15. java设计模式笔记
  16. android wifi热点设置用户数,android 如何获取连接wifi热点的设备数量
  17. Java中涉及到金钱计算方法
  18. 海豚湾(还是忍不住说日本人真的太垃圾了)
  19. 【Python项目】你们还在冲会员看电影电视剧嘛?Python带你免费看电影电视剧资源 | 附源码
  20. npm login报错:npm notice Beginning October 4, 2021, all connections to the npm registry.......

热门文章

  1. boos直聘显示服务器繁忙,BOSS 直聘回应服务“崩了”:系统升级已完成,可正常使用...
  2. JavaScript判断输入的数是不是素数
  3. kernel panic - not syncing : fatal exception
  4. Python基础语法函数——经典函数实例
  5. Ajax.NET中的ajax.js脚本
  6. with root cause 解决办法
  7. day11 反转字符串||反转字符串2
  8. 第19篇 基础(十九)详解QVector(数组)
  9. Android引入Ijkplayer
  10. 有没有什么好的可以做读书笔记的APP推荐?