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

STM32的Code、RO-data、RW-data、ZI-data和RAM以及flash的关系

对于刚接触stm32编程的同学来说,通常不知道如何选择合适型号的芯片来开发自己的项目,下面就分析一下多大的片内ram以及flash能符合我们项目的需求。

不知道大家有没有注意到,我们的项目每次编译完成后,都会出现这个Program Size,然后后面跟着Code、RO-data、RW-data、ZI-data,其实这里就是编译软件在告诉我们,这个项目需要用到多少ram以及flash才能正常运行。

Program Size中各个参数的含义

1.Code(代码)

Code部分包括程序的被调用的函数代码量,如果只是被定义了,不被调用,那么不会增加到Code里面,Code被保存在我们MCU的flash里面。

(1)定义addcode函数前 code为1256

(2)定义addcode函数后,未调用,code依旧为1256

(3)调用addcode函数以后,Code增加到1272字节,由此可见,只有函数被调用以后,才会被存到flash计算到代码量中

2.RO-data(只读数据)

RO-data(只读数据)表示所有被调用的全局常量数据,RO-data被保存在MCU的flash中,因为它们在程序执行期间不会被修改。

(1)定义了常量数组,被调用前,RO-data=460,RO-data没有增加

(2)定义了常量数组,被调用后,RO-data=464,RO-data增加了4,说明我们定义的全局常量只有被调用后才会加入到RO-data中

注意的是,此结果博主亲测只有在Optimization为Level 0的情况下,自己写的这个常量才被加入到RO-data中,在level 1/2/3的时候都被当做冗余量被优化。

3.RW-data(读写数据)

RW-data(读写数据)代表被调用的已经初始且初始化不为0的全局变量,RW-data会先被存储到flash里面,等待程序运行的时候,再被复制到RAM中,所以RW-data既占用一份flash,也会占用一份RAM

(1)定义变量数组,被调用前,RW-data=12字节。

(2)定义变量数组,被调用后,RW-data=1012字节,说明初始化后不为0的常量数组被调用后会增加到RW-data中。

4.ZI-data(零初始化数据)

ZI-data(零初始化数据)是被调用的初始化为0或者未初始化的全局变量,ZI-data被保存在我们MCU的RAM中。

(1)定义未初始化的数组被调用前,ZI-data=1292,无变化。

(2)定义未初始化的数组被调用后,ZI-data=2292,增加了1000,说明被调用到的未初始化的全局变量是存在ZI-data中的。

Program Size和RAM以及flash的关系

由上面分析得出

RAM=RW-data+ZI-data

flash=Code+RO-data+RW-data

我们在挑选单片机芯片的时候,RAM和flash要根据实际项目大于上面算出的容量,才能确保我们的项目能够正常运行。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring AOP 基础知识
  • HashMap第7讲——get方法源码分析
  • python,利用可变对象实现设置参数的自动回存
  • Knife4j的原理及应用详解(七)
  • 探索大模型:袋鼠云在 Text To SQL 上的实践与优化
  • 技校专业群的生成机制研究
  • linux系统“/“目录比“/home“目录小
  • 多图详解入门级AI绘画 Midjourney工具注册使用流程,AI绘画必备工具
  • MySQL篇:日志
  • ubuntu计划任务反弹
  • php获取,昨,今,后天.... 本周,月,年...日期时间戳
  • 1.浅谈蓝牙BLE的总体框架
  • 【Mark笔记】基于Centos7.7更改SSH端口重启服务报错
  • SAP S4 销售组的定义和分配
  • WGS84坐标转换代码(JS版)
  • ➹使用webpack配置多页面应用(MPA)
  • cookie和session
  • docker-consul
  • fetch 从初识到应用
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JAVA多线程机制解析-volatilesynchronized
  • Linux快速复制或删除大量小文件
  • React的组件模式
  • vuex 笔记整理
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 订阅Forge Viewer所有的事件
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 关于Android全面屏虚拟导航栏的适配总结
  • 选择阿里云数据库HBase版十大理由
  • #NOIP 2014# day.1 T2 联合权值
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)Android布局类型(线性布局LinearLayout)
  • (转载)Linux 多线程条件变量同步
  • *1 计算机基础和操作系统基础及几大协议
  • .chm格式文件如何阅读
  • .Net 垃圾回收机制原理(二)
  • .net 微服务 服务保护 自动重试 Polly
  • .NetCore 如何动态路由
  • .NET是什么
  • .net中生成excel后调整宽度
  • @SuppressWarnings注解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [20150629]简单的加密连接.txt
  • [asp.net core]project.json(2)
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#7] 1.Tuples(元组)
  • [CISCN 2023 初赛]go_session
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [Flutter]WindowsPlatform上运行遇到的问题总结
  • [IDF]被改错的密码