当前位置: 首页 > news >正文

STM32 程序内存分布详解

1. STM32 内存的逻辑分布

从高地址到低地址,程序运行时的内存布局一般可以划分为如下区域:

2. 各存储区详解

(1) 栈区(Stack)

  • 用于存放局部变量函数形参返回值
  • 特点是 先进后出(FILO),函数调用时自动开辟,函数返回后自动释放。
  • 例如:

int Demo(int x) {int y = 5;   // y 在栈区return x + y;
}

(2) 堆区(Heap)

  • 程序运行时通过 malloc/new 动态申请的内存块存放于堆区。
  • 堆内存不会自动释放,需手动调用 free/delete 否则可能造成内存泄漏
  • 例如:

void *p = malloc(20);  // p指针本身在栈,分配的20字节在堆
free(p);

(3) 全局/静态区

由两部分组成:

  • .bss 段:存放未初始化的全局变量、初始化为 0 的全局/静态变量。该区域在程序启动时由系统自动清零,不占用可执行文件大小。
  • .data 段存放已初始化的全局变量和静态变量,占用可执行文件空间。

(4) 常量区(.rodata)

  • 存放 const 全局变量、字符串常量等。
  • 该区域内容只读,不允许修改。

(5) 代码区(.text)

  • 存放编译生成的程序指令。
  • 在 STM32 中,通常位于 Flash 存储器中。

3. 示例程序解析

来看一个示例:


static  unsignedint val1 = 1;    // .data 段
unsigned int val2 = 1;           // .data 段
unsigned int val3;               // .bss 段
const unsigned int val4 = 1;     // .常量区 段unsigned charDemo(unsignedint num) {char var[] = "123456";       // var 数组在栈,字符串常量在.rodataunsigned int num1 = 1;       // 栈区static unsigned int num2 = 0;// .data 段const unsigned int num3 = 7; // 栈区void *p = malloc(8);         // 堆区free (p);return 1;
}
int main(void) {unsigned int num = 0;        // 栈区num = Demo(num);             // 返回值在栈区
}

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


4. 存储介质的差异

(1) RAM

  • 随机存取存储器,断电数据丢失。
  • STM32 内部的 SRAM 用于存放运行时数据(栈、堆、全局区等)。

(2) ROM

  • 只读存储器,通常在出厂时就写入程序,几乎无法修改。

(3) Flash Memory

  • 现代 MCU 常用的程序存储介质,掉电数据不丢失。
  • STM32 的程序代码和常量就存放在 Flash 中。

总结:

  • RAM:栈区、堆区、.data、.bss
  • Flash:代码区、常量区(rodata)

5. Keil 编译输出分析

在 Keil 的 Build Output 窗口中,我们常见到如下统计信息:

Code    : 程序代码大小
RO-data : 只读数据(常量、字符串)
RW-data : 已初始化的可读写数据(.data)
ZI-data : 未初始化数据(.bss)

由此可以计算出 RAM 和 ROM 的占用情况:

  • ROM 占用 = Code + RO-data + RW-data
  • RAM 占用 = RW-data + ZI-data

这对于开发过程中评估内存使用、优化代码结构非常关键。

http://www.dtcms.com/a/423170.html

相关文章:

  • Django 入门:快速构建 Python Web 应用的强大框架
  • 返利机器人的智能对话架构:基于NLP(ChatGLM)+Spring Boot的客服机器人开发实践
  • 专题:2025零售数字化与即时零售竞争洞察报告|附130+份报告PDF、数据仪表盘汇总下载
  • 语义网络对人工智能中自然语言处理的深层语义分析的影响与启示
  • ADC (Analog-to-Digital Converter) 模数转换器详解
  • 商城类的网站怎么做优化网络建设方案ppt
  • Go基础(⑧JSON Web Token)
  • MR+AI变革传统MRO,提升工作效率
  • 每周读书与学习->初识JMeter 元件(三)
  • MR模板以及代码审查规范
  • 什么是网站推广优化剧院网站建设
  • dede如何手机网站和电脑网站的数据同步更新网站改版是什么意思
  • ubuntu安装go
  • 用 go-commons 高效处理字符串
  • 二手网站建设论文广州做网站多少钱
  • 网站建设前端工程师岗位职责网页设计页面代码
  • 从神经信号到驾驶安全:Mentalab无线脑电图系统赋能汽车人因研究与HMI优化
  • AST语法树应用于sql检查
  • 分转科技:科技乐享生活,时尚分转未来
  • 推广型网站免费建设网页开发价格
  • Livox-Mid360驱动安装(ROS1/Ubuntu20.04)
  • 建设厅网站查询电工证件做枪版视频网站犯法吗
  • 开启C++新世界:从函数到对象的两天思维跃迁
  • C# 中Ping 网络连通性检测实战
  • 阿里 + 南洋理工新突破!MMR1 模型破解多模态推理训练难题,开源160 万数据 + 15k RL 样本!
  • 多模态PDF解析
  • 如何判断模型矩阵是否做了镜像
  • C语言常量和存储类别详解
  • 计算机视觉进阶教学之Mediapipe库(一)
  • 《道德经》第八章