我们在使用Keil编译程序成功后会,有一行各部分占用内存的提示信息,如下

Program Size:Code=7492 RO-data=556 Rw-data=72 ZI-data=11688,这是stm32代码编译后的提示

我们分析一下这个编译输出:

- Code: 7492字节 -> 代码部分(存放在Flash)

- RO-data: 556字节 -> 只读数据(存放在Flash)

- RW-data: 72字节 -> 已初始化的读写数据(在Flash中存储初始值,运行时拷贝到RAM)

- ZI-data: 11688字节 -> 未初始化的数据(运行时在RAM中初始化为零)

所以,占用Flash的空间为:Code + RO-data + RW-data(因为RW-data的初始值需要存储在Flash中) 即:7492 + 556 + 72 = 8120字节 ,但是注意,ZI-data不占用Flash空间,因为它只需要在程序运行时在RAM中分配并初始化为零。

因此,这个程序占用的Flash空间为8120字节。 另外,程序运行时占用的RAM空间为:RW-data + ZI-data = 72 + 11688 = 11760字节。

总结:

 Flash占用:8120字节  约7.93KB

 RAM占用:11760字节  约11.48kB

并且我们在购买单片机的时候会经常看到一下字样,Flash ,RAM等今天我们将解密他们究竟是什么

简单来说:

  • Flash大小:决定了你的程序代码能写多大,以及能存储多少常量数据(如图片、字体等)。如果你的程序很大,就要选Flash大的型号。

  • RAM大小:决定了你的程序运行时能同时使用多少变量和数据。如果你的程序需要处理大量数据、有很多全局变量、或者使用了复杂的算法和递归,就需要更大的RAM。RAM不足是导致程序莫名崩溃的常见原因。

要想深入了解这些东西 需要我们对STM32存储器划分结构有一定了解

STM32的存储器结构采用了哈佛架构(Harvard Architecture),这意味着程序存储器(Flash)和数据存储器(RAM)在物理上是分开的并且有独立的地址总线和数据通路,这使得CPU可以同时取指和访问数据,提高了执行效率。

地址划分

Flash

(ROM)

0x0800 0000-程序存储器存储C语言编译之后的代码
0x1FFF F000-系统存储器存储BootLoader,用于串口下载
0x1FFF F800-选项字节存储一些独立于代码的配置参数
RAM0x2000 0000-运行内存SRAM存储运行中的临时变量
0x4000 0000-外设寄存器存储各个外设的配置参数
0xE000 0000-内核外设寄存器存储内核各个外设的配置参数

当芯片手册上标称 “64KB Flash” 时,这个总容量通常包含了主Flash、系统存储器和选项字节等所有部分。需要查阅芯片的内存映射图来了解具体是如何划分的。例如,一颗62KB Flash的STM32芯片,其内存映射可能是:62KB的主Flash + 2KB的系统存储器 + 一小部分(如16字节)的选项字节。

什么是Flash和RAM?

1.Flash (闪存)

  • 它是什么:是一种非易失性存储器。意思是即使断电,里面存储的数据也不会丢失。

  • 在办公室比喻中:它就是你的文件柜。你把不经常用但很重要的东西(比如项目文档、参考资料、年度报告)长期存放在这里。

  • 在单片机中的作用:

    • 存储程序代码:你编写好的程序,经过编译后生成的机器码,就永久地烧录(存储)在Flash中。单片机一上电,就从这里读取指令来执行。

    • 存储常量数据:比如固定的字体、图片、音乐数据、配置参数等只读不写的数据。

  • 特点速度较慢(相比RAM)、容量较大(相比RAM)、断电数据不丢失可擦写(但次数有限,通常10万次以上)。

简单记:Flash是放程序的地方,断电还在

2. RAM (随机存取存储器)

  • 它是什么:是一种易失性存储器。意思是只有在通电时才能保持数据,一旦断电,里面的所有数据都会丢失。

  • 在办公室比喻中:它就是你的办公桌面。你正在处理的文件、临时记下的笔记、计算中的草稿纸都放在桌面上。这些东西只是暂时用一下,工作结束就收走或扔掉。

  • 在单片机中的作用:

    • 存储变量:程序运行中产生的临时变量、中间计算结果、函数调用的堆栈等都放在RAM里。

    • 动态内存分配:像malloc()new申请的内存空间,也位于RAM中。

  • 特点速度极快容量较小(在单片机里通常是KB级别)、断电数据丢失可无限次读写

简单记:RAM是程序运行时的临时工作区,断电就清空。

了解完什么是Flash我们来看看STM32的Flash划分了那几部分

1. 主Flash存储器 (Main Flash Memory)

  • 位置:Flash的绝大部分区域。

  • 功能:这就是我们通常说的“Flash”,用来存储你编写的应用程序代码常量数据

  • 权限:用户程序可以自由地读取这里的数据。在允许自我编程(IAP)的单片机上,用户程序也可以擦写这个区域(比如用于固件升级)。

  • 比喻:大楼里开放的办公区域,员工可以自由进出和使用。

2. 系统存储器 (System Memory)

  • 位置:Flash中一段固定的、出厂前预设好的区域。

  • 功能:里面存储的是芯片制造商预先烧录好的Bootloader程序。这个Bootloader通常是用于通过某种串行接口(如USART, USB, CAN等)来下载用户程序到主Flash存储器。最常见的例子就是STM32的USB DFUUART烧录功能。你选择从“系统存储器启动”时,芯片就会运行这里的程序。

  • 权限:这段区域是只读的。用户无法修改或擦除这里的内容,这是芯片厂商写死的,为了防止用户误操作导致芯片“变砖”。

  • 比喻:大楼里一个上了锁的机房,里面放着大楼的基础控制系统(如消防、供电)。只有大楼管理员(芯片厂商)有钥匙,普通员工(用户)只能使用它提供的功能(比如通过它来部署新程序),但不能改动里面的设备。

3. 选项字节 (Option Bytes)

  • 位置:Flash中一个非常小但极其重要的特殊区域。

  • 功能:它不是用来存储程序或数据的,而是用来配置单片机的硬件特性的,可以看作是芯片的“配置开关”。常见的配置包括:

    • 读写保护:给主Flash上锁,防止别人通过调试器读取或抄袭你的程序代码。

    • 写保护:保护Flash的某些扇区不被意外擦写。

    • 硬件看门狗:配置看门狗是硬件开启还是软件开启。

    • 复位级别:配置NRST引脚是作为复位引脚还是普通IO。

    • 启动配置:决定芯片上电后从主Flash、系统存储器还是RAM启动。

  • 权限:用户可以通过特定的编程流程(通常需要先解锁)来修改选项字节。修改后需要触发一个系统复位才能生效。

  • 比喻:大楼总电箱里的那些开关和保险丝。它们不参与日常办公,但决定了整个大楼的用电安全、照明方式等基础设置。改动它们需要谨慎并有特定权限。

4. Bootloader (引导加载程序)

  • 概念:这是一个程序,而不是一个存储区域。它是一段特殊的代码,负责在单片机正式运行用户主程序之前,完成一些初始化工作,或者决定从哪里、如何加载主程序。

  • 存放位置:它可能存放在两个地方:

    1. 系统存储器:即芯片厂商自带的,如上所述。

    2. 主Flash存储器:用户自己编写的Bootloader。比如你想通过网络来升级固件,你就可以自己写一个更强大的Bootloader,把它放在主Flash的开头部分。芯片上电后先运行你的Bootloader,你的Bootloader再决定是跳转到主应用程序,还是进入升级模式。

  • 比喻:大楼的前台接待员或门卫。每天早上(上电后),他先到岗,检查今天有没有新的快递(新的固件包)要接收,或者决定是让员工直接进入办公区(跳转到主程序),还是先组织一个安全会议(系统配置)。

RAM内存布局示例

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

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

相关文章

手机 浏览器调用摄像头扫描二维码Quagga

注&#xff1a;需用谷歌浏览器才能调用权限1. 引入依赖&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】伪列之Version Query:全链路追踪行数据变更的所有记录(不仅仅是被修改的最后时间)(第二篇,总共六篇)

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

代理模式深度解析:从静态代理到 Spring AOP 实现

代理模式是软件开发中一种经典的设计模式&#xff0c;它通过引入 "代理对象" 间接访问目标对象&#xff0c;从而在不修改目标对象代码的前提下&#xff0c;实现功能增强&#xff08;如日志记录、事务管理&#xff09;、权限控制等横切需求。从简单的静态代理到灵活的…

算法 ----- 链式

目录 一 、链式 二 、题目 1、两两相加 &#xff08;1&#xff09;题目 (3) 代码书写 2、两两交换链表中的节点 &#xff08;1&#xff09;题目 &#xff08;2&#xff09; 解题思路 &#xff08;3&#xff09;代码书写 3、重排链表 &#xff08;1&#xff09;题目 …

运维监控prometheus+grafana

目录 一、环境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、验证、使用 一、环境 系统使用CentOS7虚拟机。 监控三台服务器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …

数字孪生 :提高制造生产力的智能方法

近年来&#xff0c;在先进数字技术深度整合的推动下&#xff0c;制造业经历了深刻变革。数字孪生技术作为其中最具前景的创新之一&#xff0c;正重塑工厂和生产流程的设计、监控和优化方式。该技术的核心在于为物理资产、系统或流程创建虚拟映射。这种虚拟映射实时同步现实世界…

【论文阅读】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》

Sign-OPT: 一种查询高效的硬标签对抗攻击 原文链接&#xff1a;https://arxiv.org/pdf/1909.10773 摘要 我们研究在访问受限情况下评估机器学习系统对抗鲁棒性的最实用问题设置&#xff1a;用于生成对抗样本的硬标签黑盒攻击设置&#xff0c;其中允许有限的模型查询&#xff…

安卓11 12系统修改定制化_____如何去掉 搜狗输入法 首次运行时权限授权弹窗 其他应用可借鉴

有些内置应用或者第三方应用在首次使用时会跳出权限允许弹窗。虽然这个是系统为了用户安全设置的一道检测机制。但无形之中会影响到定制类用户的使用。那么能不能去除这个首次运行的权限弹窗呢。其实也有多方法可参阅解决。 通过博文了解💝💝💝 1💝💝💝-----首次…

双环模型:一个蕴含安全哲学的类设计解析

双环模型&#xff1a;一个蕴含安全哲学的类设计解析 在编程世界中&#xff0c;优秀的类设计不仅能实现功能需求&#xff0c;更能体现开发者对系统本质的理解。本文将深入剖析一个看似简单却蕴含深刻安全哲学的OP类&#xff0c;探讨其双环模型背后的设计思想与实践价值。 类结构…

牛津大学xDeepMind 自然语言处理(4)

牛津大学xDeepMind 自然语言处理 Natural Language Processing 语音识别 Speech Recognition语音识别概述 问题定义&#xff1a;自动语音识别&#xff08;ASR&#xff09;、文本到语音合成&#xff08;TTS&#xff09;等相关任务&#xff1a;说话人识别、语音增强、语音分离等语…

MyBatis处理SQL语句映射

基础MyBatis问题以去看MyBatis基础。 使用log4j设置日志在控制台打印SQL语句及其执行信息 也可以使用MyBatis基础中用的slf4j。 在pom.xml文件中引入log4j坐标依赖 <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><…

嵌入式硬件篇---麦克纳姆轮轨迹偏移

麦克纳姆轮的轨迹偏移是机械结构、驱动系统、控制逻辑及外部环境等多因素共同作用的结果&#xff0c;其核心是各轮子的驱动力 / 运动状态无法按理论模型实现协同&#xff0c;导致车体实际运动与期望轨迹产生偏差。以下是具体影响因素的详细分析&#xff1a;一、机械结构偏差&am…

C语言安全函数分享

在日常写程序中有一些功能函数是可以重复使用的&#xff0c;在c语言的标准库里面也有对应的功能函数&#xff0c;但是那些功能函数有会有小问题然后我就整理了一下对应功能的安全函数的使用。其中前四个函数可以编译成一个动态库&#xff0c;然后在项目工程中只需要包含对应的头…

汽车之家联合HarmonyOS SDK,深度构建鸿蒙生态体系

汽车之家作为一家领先的汽车互联网公司&#xff0c;致力于打造服务全球的汽车生态科技平台&#xff0c;覆盖"看选买用换"的一站式购车体验。2023年12月底&#xff0c;汽车之家正式启动鸿蒙开发&#xff0c;并于2024年年底成功构建了完整的鸿蒙生态体系&#xff0c;涵…

深度学习驱动的订单簿分析与交易策略优化

订单簿数据特征与预处理方法 高频金融数据中&#xff0c;订单簿&#xff08;Order Book&#xff09;承载着市场参与者的实时交易意图。不同于K线数据的聚合特性&#xff0c;订单簿数据具有独特的时空特征&#xff1a; 多维层级结构&#xff1a;包含不同价格档位的买卖盘深度信息…

Redis--day9--黑马点评--分布式锁(二)

&#xff08;以下所有内容全部来自上述课程&#xff09; 分布式锁 1. Redisson功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 不可重入&#xff1a;同一个线程无法多次获取同一把锁不可重试&#xff1a;获取锁只尝试一次就返回false&#xff0c;没有重试机…

ES入门教程 (python 版)

ES入门教程 1. 创建ES对象from elasticsearch import Elasticsearch # 实例化一个ip为localhost&#xff0c;端口为9200&#xff0c;允许超时一小时的es对象 es Elasticsearch(hosts"localhost",port9200,timeout3600) # 1. 创建 索引 index_name "test"…

Gateway中Forward配置+源码观赏

系列文章目录 文章目录系列文章目录一、ForwardPathFilter二、RouteToRequestUrlFilter三、ForwardRoutingFilteryaml forward配置gateway:routes:- id: user-route # uri: lb://useruri: forward:///user/indexpredicates:- Path/user/**- YoGET # filt…

BAS16XV2T1G ON安森美半导体 高速开关二极管 电子元器件IC

BAS16XV2T1G ON Semiconductor 高速开关二极管专业解析1. 产品技术档案BAS16XV2T1G是安森美半导体(ON Semiconductor)推出的高速开关二极管&#xff0c;采用SOT-523超微型封装&#xff08;1.60.80.95mm&#xff09;&#xff0c;专为现代高密度电子设备设计&#xff0c;以其超快…

亲测可用 [安卓]《神秘来电》V1.1无需登入无广告离线打开即用手机模拟发起虚假来电免费版

神秘来电是一款可以模拟虚拟电话的应用程序&#xff0c;它能够在用户需要的时候模拟各种来电&#xff0c;以便用户能够在尴尬的场合脱身。用户可以预设多个不同的来电号码和铃声&#xff0c;并可随时触发这些虚拟电话&#xff0c;在特殊情况下帮助用户摆脱尴尬。它为那些社交恐…