stm32的内存分布

STM32 内存分配、堆栈以及变量存储位置理解与分析 STM32 内存分配、堆栈以及变量存储位置理解(STM32 flash 和 ram) 阅读详情

一、MDK下的概念

在这里插入图片描述
1)Code:代码段,存放程序的代码部分。
2)RO-data:只读数据段,存放定义的常量。
3)RW-data:读写数据段,存放初始化为非0值的全局变量和静态变量。
4)ZI-data:零数据段,存放未初始化及初始化为0的全局变量和静态变量。

所以在stm32中:flash的容量是前三项相加(RW-data的初始值也要存在flash里),RAM的容量是后两项相加等。

static变量(函数内静态局部变量和函数外静态全局变量)初始化的、未初始化的分别在RW-data、ZI-data;
全局变量初始化的、未初始化的分别在RW-data、ZI-data;
局部变量(函数内)在栈段,动态分配的空间在堆中,栈空间和堆空间初始化为0也计入ZI-data。
代码在flash中;
常量在flash中。

二、ROM和RAM的内存段

在.map文件最后会有如下统计
在这里插入图片描述
1)RO Size包含了Code及RO Data,表示只读数据占用Flash空间的大小。
2)RW Size包含了RW Data及ZI Data,表示运行时占用的RAM的大小。
3)ROM Size包含了Code,RO Data及RW Data,表示烧写程序所占用的Flash的大小。

程序运行之前,需要有文件实体被烧录到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,该被烧录文件称为可执行映像文件。如图 3-3 中左图所示,是可执行映像文件烧录到 STM32 后的内存分布,它包含 RO 段和 RW 段两个部分:其中 RO 段中保存了 Code、RO-data 的数据,RW 段保存了 RW-data 的数据,由于 ZI-data 都是 0,所以未包含在映像文件中。
STM32 在上电启动之后默认从 Flash 启动,启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中,但不会搬运 RO 段,即 CPU 的执行代码从 Flash 中读取(CPU读Flash的速度也很快),另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零。
下面左边的图是每上电flash+ram的状态,右边是上电后运行时flash+ram的状态。
在这里插入图片描述
在这里插入图片描述
从map中摘取的上图可以看出RAM空间地址的三个部分划分:
.data:初始化的全局和静态变量;
.bss:未初始化的全局和静态变量,编译器自动初始化为0;
HEAP:存放局部变量,局部变量超过栈大小将会发生堆栈溢出,程序崩溃;
STACK:栈区,若是程序里面没有动态申请变量不会分配这部分空间,一般固定分配未1024字节。

注意:
1)堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,不然就会发生hardfault错误。
2)所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。所以,如果栈大小为2K,一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!
3)STM32的栈,是向下生长的。事实上,一般CPU的栈增长方向,都是向下的。而堆的生长方向,都是向上的。堆和栈,只是他们各自的起始地址和增长方向不同,他们没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的时候了。
4)程序中的常量,如果没加const也会编译到SRAM里,加了const会被编译到flash中。
在这里插入图片描述

STM32完整内存地址空间分配详解 在STM32这类基于ARM Cortex-M的32位微控制器中,整个4GB的地址空间(从0x00000000到0xFFFFFFFF)有着非常系统化的分配方案,每个区域都有其特定的用途。 阅读详情

相关推荐

STM32H7内存分布的学习

手里有一块H7的板子,买了很久了,最近拿起来跑跑代码,在使用之前我们要先学习下H7的内存分布,之前可能接触过ST的程序员没有发现有内存分布的特性,这可能是在M7系列新加的特性。(推荐大家看看硬汉嵌入式文档,写的很详细) TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM 用于指令,DTCM 用于数据,特点是跟内 核速度一样,而片上 RAM 的速度基本都达不到这个速度。 ITCM 和 DTCM 这两个是直连 CPU 的。 TCM 区 TCM : Tightly-Coupled

qq_36097683的博客 4093

(GCC)STM32基础详解之内存分配

1.硬件说明 使用STM32F103ZET6最小系统板。 2.工程说明 本章所使用工程为STM32CubeMX生成,去掉了时钟初始化,堆栈设置初始都为0,main函数如下: int main(void) { while (1) { } } 初次编译如下: 其中: text:代码段 data:已初始化数据段 bss:未初始化数据段 dec:十进制,结果为text+data+bss总和 hex:16进制,同上 为什么main函数什么都没有使用,却显示有8个字节的已.

飞临云的博客 1万+

嵌入式驱动源代码(3):STM32 内存分配详解

1、KEIL 编译后数据 code RO-data RW-data ZI-data flash 实际存储数据 2、内存段 bss 段、data段、text段、堆(heap)和栈(stack)。 2.1、bss 段 bss 段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域; bss 是英文Block Started by Symbol的简称; bss...

产品线负责人 4352

STM32 内存分配

文章目录一、C程序的内存分配1.全局变量2.局部变量3.堆4.栈5.C程序的内存分配二、Ubuntu和STM32下对C程序输出信息进行验证1.Ubuntu2.在STM32上查看三、总结四、参考链接 一、C程序的内存分配 1.全局变量 全局变量也就是编程术语中的一种,也称为外部变量,它是在函数外部定义的变量,也可以是在本程序任何地方创建。此外,变量分为局部与5261全局,局部变量又可被叫做内部的变量。是由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用。 我们知道,全局变量是C语言语法和语义中一个

cleveryoga的博客 2391

避开SiC MOSFET驱动设计的3个大坑:电流/电阻/电压配置全指南

本文深入解析SiC MOSFET驱动设计中的三大关键参数:驱动电流、栅极电阻和工作电压,揭示常见设计误区与优化方案。通过实际案例与数据对比,指导工程师避开第三代电力电子半导体应用中的典型陷阱,提升系统可靠性与效率。特别针对驱动电源配置、栅极电阻选型等核心问题提供可落地的解决方案。

weixin_29214199的博客 384

RT-Thread与ROS2通信:micro-ROS在STM32上的移植实践

本文详细介绍了在STM32平台上使用RT-Thread实时操作系统移植micro-ROS实现与ROS2通信的实践方案。通过对比rosserial方案,重点阐述了micro-ROS基于XRCE-DDS协议栈在数据可靠性(丢包率低于1%)、双模式通信(UDP/串口)以及C/C++混合编程方面的优势,为嵌入式设备与ROS2的高效通信提供了完整解决方案。

emacs5lisp的博客 327

STM32 内存分布探究

STM32 内存分布探究2016-2-2         本人在运行ucos时遇到一个非常奇怪的问题,运行一段时间后就会莫名进入hardfault函数,导致系统死机。后来根据对堆栈调试,发现每次调用的函数都不一样,甚是费解。通过map文件最后得出结论,原来在系统初始化的时候在flash里面读出了系统配置参数,在系统运行过程中会写flash,而flash定义的地址与程序代码存储的位置发生了重叠,一写

DanielLee_ustb的专栏 3603

Hcaptcha验证码的‘免浏览器’破解思路:协议分析与N值算法逆向

本文深入解析Hcaptcha验证码的‘免浏览器’破解思路,通过协议分析与N值算法逆向,实现高效自动识别。文章详细拆解Hcaptcha的API交互流程,揭示关键参数`req`和`n`的生成机制,并提供轻量级实现方案,显著降低资源消耗,适用于大规模数据采集等场景。

weixin_30838873的博客 535

STM32之内存分布与总线

STM32之内存分布与总线 YellowMax2001 2016-05-14 09:16:08 13303 收藏 8 分类专栏: STM32 STM32学习之路 版权 1、总线 系统结构 系统包括一个由多个互相连接的32位AHB总线组成的矩阵 8个主总线 – Cortex-M4 with FPU core I-bus, D-bus and S-bus – DMA1 memory bus – DMA2 memory bus ...

coldrainbow的专栏 782

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2779

基于知识图谱的电影推荐系统——Neo4j&Python

也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6。修改main.py中的driver,输入自己数据库的用户名与密码。系统会询问是否需要重新加载并创建知识图谱,在第一次时输入1。

weixin_46351593的博客 6355

STM32内存分布学习

1.STM32内存分布下图是一张stm32的内存映射图,其中代码区是从0x0800 0000开始的,他的结束地址是0x0800 0000加上实际芯片的flash大小,他的ram的起始地址是0x2000 0000,然后结束地址依然是加上芯片实际的ram大小。 2.单片机中RAM\ROM\FLASH区别1.RAM(Random Access Memory)特点: 1. 掉电丢失数据; 2.

逗倪豌儿 2623

法兰克仿真软件FANUC CNC Guide v25.0 安装教程及中文设置

下载地址在文末。我们公司用新到一批FANUC 系统的设备,为方便使用就装了一个 FANUC 数控系统仿真软件FANUC CNC Guide v25.0 ,还是最新版不是市面上流传的老版本。模拟学习一下。

hakesashou的博客 1万+

STM32 程序内存分布详解

malloc/newconst通过该例子,可以直观理解不同修饰符与变量的存储区域。

Cha3043445754的博客 511

UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)

相信读者基于Diagnostic/ISO TP Confighration中cdd、dll文件的测试并不陌生,本文基于其的基础上,介绍在capl中调用内置的函数diagGenerateKeyFromSeed实现27服务解锁,从而进行诊断自动化测试。本文基于4个byte的Seed、16个byte的Key的安全访问,实现27服务的自动化测试。需要加载项目使用的cdd文件,如果没有的情况下可以使用canoe例程中默认的cdd文件。

诊断协议那些事儿's blog 2054

使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型

智能家居中的智能照明控制系统旨在通过自动化手段优化家庭照明,提高能源效率和居住舒适度。这通常涉及传感器(如光敏传感器、运动传感器)、控制器(如微控制器或PLC)以及执行器(如调光器或开关)。在这个教程中,我们将使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型。

xiaoheshang_123的博客 219

STM32 内存分布

网上找到两篇很详细的关于stm32内存分布的讲解: http://www.openedv.com/forum.php?mod=viewthread&tid=271679&page=1 https://blog.youkuaiyun.com/gmq_syy/article/details/82220158 下图我觉得描述的很好,能把图看明白,这个知识点就掌握了。 ...

muyepiao1的博客 501

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Ubuntu与STM32下C程序变量内存分布对比实验

摘要: 本实验对比了Ubuntu(x86)和STM32(ARM Cortex-M)系统中C程序变量的内存分布。通过打印全局变量、局部变量、静态变量、常量及堆变量的地址,发现二者结构相似但地址空间不同:在STM32中,常量存储在Flash(0x08000000起),变量位于SRAM(0x20000000起),栈向高地址增长,堆向低地址分配。实验验证了Cortex-M的固定内存映射特性,包括Code区、SRAM和外设区等划分,为理解嵌入式内存管理提供了实践基础。

2503_93440598的博客 706

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

一图看懂STM32程序的内存分布(新手向)

ZI-data Zero Initialie data 初始化为0或未初始化的数据,这些数据与RW-data的区别就是RW-data由于有值在flash中已经分配好了内存去存他,而ZI-data不需要flash为他开辟内存,直接在SRAM中运行,存在上图中的.BSS段。所以我们知道了程序在掉电和上电的时候内存分布其实是有区别的,因为flash掉电不丢失而sram掉电丢失,区别主要表现在上电后在执行main函数之前会将flash中的RW-data拷贝到sram中,并在sram中开辟bss段和堆栈的内存。

2201_75288841的博客 330

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32(C语言)内存分布

STM32内存分布

Telly_的博客 957

STM32L471内存分布

扇区编号 首地址十进制 扇区编号 该地址之前内存K 首地址16进制 #define STM32L471Sector0 0 0 0 0 #define STM32L471Sector1 2048 1 2 800 #define STM32L471Sector2 4096 2 4 1000 #define STM32L471Sector3 6144 3 6 1800 #define STM32L47...

GKoSon的博客 942

stm32内存分布

stm32的内存分布

weffgerg的博客 477

C语言-内存分布(STM32内存分析)

在上述程序中,若不存在 BSS 段,则可执行文件将开辟一个 10000 * sizeof(int) 大小的空间,并全部存储为0,int 为4字节的情况下,该变量将在磁盘上占用39KB的空间。FreeRTOS的内存分配有五个方案: 如果申请的内存空间都在一个连续的空间内heap_4就够用了,但如果存在部分空间申请在内部RAM、部分在外部RAM,这时候就需要使用heap_5方案了,heap_5是在heap_4基础上实现的。,程序运行之前不需要占用存储器的空间,BSS段的变量只有名称和大小却没有值。

洋洋的博客 4144
上一篇: stm32笔记
下一篇: 蓝牙协议栈的简单介绍
Red fog
博客等级 码龄8年 139粉丝 54原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值