STM32中的Flash、ROM与RAM全解析 - 指南

news/2025/9/28 15:57:01/文章来源:https://www.cnblogs.com/wzzkaifa/p/19116948

目录

1. flash、ROM、RAM

RAM(Random Access Memory)

ROM(Read-Only Memory)

FLASH(FLASH EEPROM)

SRAM?就是2. 在stm32中,.text段、.data段和.bss段都在哪里?flash上?还

1. .text 段 (代码段)

2. .data 段 (已初始化内容段)

3. .bss 段 (未初始化或初始化为0的数据段)

总结与类比

STM32启动流程回顾

如何查看?


1. flash、ROM、RAM

在计算机硬件中,RAM(随机存取存储器)和ROM(只读存储器)是两种基本的存储技术,它们在数据存储和处理方面有着根本的区别。

RAMRandom Access Memory

RAM是计算机的主存储器,用于临时存储正在运行的应用和素材。它允许数据被随机访问,意味着行直接读取或写入任何位置的数据,而不需要按顺序进行。RAM的特点包括:

  • 易失性:当电源关闭时,存储在RAM中的数据会丢失。

  • 快速读写:RAM可以快速地读取和写入资料,这对于计算机运行程序和处理任务是非常重要的。

  • 容量和速度:RAM的容量通常从几MB到数百GB不等,速度非常快,能够通过高速总线迅速访问数据。

常见的RAM类型包括DRAM(动态随机存取存储器)、SRAM(静态随机存取存储器)、SDRAM(同步动态随机存取存储器)和DDR SDRAM(双倍内容率同步动态随机存取存储器)。

ROM(Read-Only Memory)

ROM是一种只读存储器,通常用于存储固定的程序指令和数据,如启动程序和固件。ROM的特点包括:

  • 非易失性:即使在断电的情况下,ROM中的数据也不会丢失。

  • 只读:ROM中的内容通常在制造过程中预先写入,用户无法修改。

FLASH(FLASH EEPROM)

  • Flash 存储器(FLASH EEPROM)又称闪存,快闪。它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑(EEPROM)的性能,还不会断电丢失数据同时能够快捷读取数据。它于EEPROM的最大区别是,FLASH按扇区(block)操作,而EEPROM按照字节操作。FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因此适合用于做程序存储器。

  • FLASH 可以说就是 ROM 的子集。

我们再来看看STM32中flash、ROM、RAM三者的关系:

堆、栈、flash、ROM、RAM、bss段、data段、text段、Code、Ro-data ZI-data、RW-data的区别_栈是在flash-CSDN博客

综合上述种种,我们可以总结出:在STM32中,flash 就是ROM,而STM32中的RAM,就是SRAM

2. 在stm32中,.text段、.data段和.bss段都在哪里?flash上?还是SRAM?

简单直接的答案是:这些段同时存在于Flash和SRAM中,但它们的“存在”方式不同。

更准确的说法是:

  • 编译和链接后,所有段的原始数据都存储在Flash中。

  • 程序运行时.text段仍在Flash中被CPU读取执行,而.data.bss段则位于SRAM中。

    下面我们来详细分解每一个段,并解释STM32的启动过程是如何实现这一点的。


    1. .text 段 (代码段)

    • 内容:存放程序的执行代码(机器指令)、常量字符串以及只读的常量数据(例如被const关键字修饰的全局变量)。

    • 位置

      • Flash (ROM):这是.text段的永久存储位置。单片机掉电后,代码不会丢失。

      • SRAM:.text段通常不复制到SRAM。CPU通过称为I-Bus (Instruction Bus) 的系统总线直接从Flash中读取指令并执行。这样做是为了节省宝贵的SRAM空间。

      结论:.text段始终在Flash中,运行时也从Flash直接读取。


      2. .data 段 (已初始化数据段)

      • 内容:存放已初始化且初始值不为零的全局变量和静态变量(static)。

        • 例如:int global_var = 100;static int static_var = 5;

      • 位置

        • Flash (ROM):存储这些变量的初始值(例如1005)。这些值是程序映像的一部分,掉电不丢失。

        • SRAM:这是这些变量运行时真正被存放和操作的地方。

        关键过程:启动时的“材料拷贝”

        单片机启动时,一段特殊的启动代码(通常是Startup文件中的代码,会调用__main,其中包含拷贝操作)会自动将.data段在Flash中的初始值复制到SRAM中为其分配好的地址空间。之后,程序的所有读写操作都是针对SRAM中的副本。


        3. .bss 段 (未初始化或初始化为0的数据段)

        • 内容:存放未初始化或初始化为0的全局变量和静态变量。

          • 例如:int uninit_var;static int static_zero_var = 0;int big_array[1024] = {0};

        • 位置

          • Flash (ROM):.bss段在Flash中不占用存储变量的空间,它只占用了“描述信息”(记录了这块内存的起始地址和大小)。没有必要开空间,这会浪费Flash空间。

          • SRAM:这是.bss变量运行时存在的地方。系统在启动时需要在SRAM中为它们分配空间。

          关键过程:启动时的“内存清零”

          启动代码在执行完.data段的拷贝后,会紧接着对.bss段对应的SRAM区域进行清零初始化。这就是为什么你没有给全局变量赋值,它默认是0的原因。


          总结与类比

          • Flash (ROM)你的硬盘。它存储了所有的“原始材料”:就是就像

            • 程序指令(.text

            • 已初始化变量的初始值(.data的初始值)

            • .bss段的大小信息(一个“需要准备多少空位”的清单)

            • SRAM就像是你的电脑内存。程序运行时:

              • CPU从Flash(硬盘)读取指令(.text)来执行。

              • 把已初始化变量的值(.data)从Flash(硬盘)加载到SRAM(内存)中操作。

              • 在SRAM(内存)中为未初始化变量(.bss)开辟一片空间并清零。

              STM32启动流程回顾

              1. 上电或复位后,CPU从Flash的复位中断向量表找到复位处理函数的地址,并开始执行启动代码。

              2. 启动代码调用__main,它主要做两件事:

                1. 数据拷贝 (Copy .data):将.data段从Flash复制到SRAM。

                2. 清零初始化 (Zero .bss):将.bss段对应的SRAM区域全部清零。

              3. 上述初始化完成后,才跳转到用户的main()函数开始执行。

                如何查看?

                在IDE(如Keil MDK或STM32CubeIDE)编译项目后,在构建输出窗口 (Build Output) 中可以看到一个类似下面的内存分布报告,它清楚地展示了各个段在Flash和RAM中占用了多少空间:

                Program Size: Code=6320 RO-data=432 RW-data=52 ZI-data=1024

                • Code + RO-data 属于 .text 段(在Flash中)。

                • RW-data 属于 .data 段(初始值在Flash,运行时在SRAM)。

                • ZI-data 属于 .bss 段(运行时在SRAM)。

                  我们也可以通过查看项目生成的链接脚本(.ld文件或是.map文件)来精确了解每个段被链接到了哪个地址(Flash地址通常以0x08000000开始,SRAM地址以0x20000000开始)。

                  本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920794.shtml

                  如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

                  相关文章

                  Functions

                  FunctionsVector std:ranges::sort() -std=c++20 是一个C++20引入的排序函数,收录于#include<algorithm> ()里的内容通常是 vector 和 array(满足随机访问迭代器要求),也可以是其它符合范围 概念 的序列。 使…

                  科技网站推荐台州找人做网站

                  1、FACTORY—追MM少不了请吃饭了&#xff0c;麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西&#xff0c;虽然口味有所不同&#xff0c;但不管你带MM去麦当劳或肯德基&#xff0c;只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory (下载源码就到源码网:…

                  QOJ #5421. Factories Once More 题解

                  Description 有一个王国,共有 \(n\) 座城市,这些城市编号为 \(1\) 到 \(n\)(包含两端)。 王国中有 \(n-1\) 条双向道路将这些城市相连,并且保证任意两座城市之间都可以通过这些道路到达。 女王最近决定新建 \(k\)…

                  IDEA JAVA项目gitignore文件模板

                  target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache### IntelliJ IDEA ##…

                  自动生成验证码

                  include int main() { srand(static_cast(time(NULL))); string s = "0123456789zxcvbnmasdfghjklqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP"; cout << "请输入验证码长度:"; int length; cin…

                  商城网站带宽控制美肤宝网站建设

                  运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发…

                  365 赚钱宝小程序系统:多元化变现与趣味运营一体的小程序解决方案

                  在数字化营销与流量变现需求增长的当下,365 赚钱宝作为微信小程序运营工具,凭借 “趣味养成 + 广告盈利 + 裂变引流” 模式,为个人与企业提供低门槛、高潜力的流量变现路径,降低技术与维护成本。 一、概述总结 365…

                  9.22 总结

                  T1 这题就是一个二分答案,因为 x 特别小所以可以直接跑背包。然后可以 \(O(1)\) check,所以复杂度是一个 \(\log\)。 T2 这题比较难,当时只写了部分分。 T3 这题也只写了部分分。 T4 就是这题的复杂度是 \(O(n^2)\)…

                  保亭县住房城市建设局网站域名可以绑定几个网站

                  Q:给你一个有序数组nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。 第一种解决方法&a…

                  iOS 26 系统流畅度深度评测 Liquid Glass 动画滑动卡顿、响应延迟、机型差异与 uni-app 优化策略 - 教程

                  iOS 26 系统流畅度深度评测 Liquid Glass 动画滑动卡顿、响应延迟、机型差异与 uni-app 优化策略 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

                  邯郸做网站熊掌号WordPress获取标签名字

                  文章目录 前言一、什么是UART&#xff1f;二、K210的UART三、实验过程总结 前言 串口通讯是平时大家进行调试最常用的方法&#xff0c;嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求&#xff0c;它能够灵活地…

                  即刻搜索收录网站河南省两学一做网站

                  8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;chmod命令用来变更文件或目录的权限。在UNIX系统家族里&#xff0c;文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分&#xff0c;另有3种特殊权限可…

                  网站app封装怎么做wordpress 后台好卡

                  短短一生不过数十载&#xff0c;对于很多人而言&#xff0c;作IT、作技术只是生命中的某一段&#xff0c;并非所有。而无论是换工作还是换行业&#xff0c;只是一种形式而已&#xff0c;最终我们追求的是成功、是荣誉、是收获。于是在年轻的这几年里&#xff0c;作为技术人员理…

                  怎么用手机做抖音上最火的表白网站注册1千万的公司需要多少钱

                  我正在尝试使用php中的正则表达式来匹配base64编码的块。 它以Content-Transfer-Encoding: base64开头&#xff0c;因此我希望可以在此之后匹配内容&#xff0c;但是下面的正则表达式无法正常工作。 请帮助我修复此正则表达式以匹配base64块。 在电子邮件正文中&#xff0c;bas…

                  网站建设维护费合同范本2020ppt模板免费下载

                  青铜挑战-回溯是怎么回事 回溯&#xff0c;最重要的算法之一 主要解决一些暴力枚举也搞不定的问题&#xff0c;例如组合、分割、子集、排列、棋盘等 从性能角度来看回溯算法的效率并不高&#xff0c;但对于这些暴力都搞不定的算法能出结果就很好了&#xff0c;效率低点没关系…

                  capsWriter-offline可否支持更小声音输入调研-opus4.1答复

                  我来帮您分析这个项目以及关于支持耳语输入的可行性。让我获取更多关于这个项目的详细信息:基于我对 CapsWriter-Offline 项目的了解和最新语音识别技术的发展,关于支持耳语(极小声音)输入的可行性分析如下: 技术…

                  线上教学网站wordpress 外观

                  转载于:https://www.cnblogs.com/yver/p/6054131.html

                  Java 旋转 PDF 页面:启用 Spire.PDF 实现高效页面处理

                  Java 旋转 PDF 页面:启用 Spire.PDF 实现高效页面处理2025-09-28 15:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; d…

                  wordpress 调用指定id文章seo公司是干嘛的

                  【考证须知】IT行业高含金量的证书(传送门)&#x1f496; 【软件设计师笔记】计算机系统基础知识考点(传送门)&#x1f496; 【软件设计师笔记】操作系统考点(传送门)&#x1f496; &#x1f413; 编程语言之间的翻译形式 汇编 高级程序不能直接在计算机上执行&#xff0c;…