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

STM32单片机的FLASH和RAM

STM32内置有Flash和RAM(而RAM分为SRAM和DRAM,STM32内为SRAM),硬件上他们是不同的设备存储器、属于两个器件,但这两个存储器的寄存器输入输出端口被组织在同一个虚拟线性地址空间内。在这里插入图片描述

MDK预处理、编译、汇编、链接后编译窗口会显示如下一段关于程序和数据大小的信息:

在这里插入图片描述

Code:是程序中代码所占字节大小;

RO-data(Read Only-Data):程序只读的变量,也就是带const的,和已初始化的字符串等;

RW-data(Read Write-Data):已初始化的可读写全局/静态变量;

ZI-data(Zero Initialize-Data):未初始化的可读写全局/静态变量;

程序占用的Flash存储器的空间大小=Code+RO data+RW data = 生成的bin文件大小。
在这里插入图片描述
程序占用的SRAM存储器的空间大小RW data+ZI data。
在这里插入图片描述

STM32上电跑程序前会把可以进行修改的变量复制到SRAM上,如RW data、ZI data,而对于不需要修改的数据如Code、RO-data不用复制到SRAM中,未初始化的变量ZI-data不会占用SRAM的空间,处理器只会把未初始化的变量需要占用的字节个数存放在SRAM,并不会真正为其分配空间。

C语言内存按地址由低到高分为四个区:代码区(text段)、全局\静态区(地址从低到高分为文字常量区、已经初始化的数据data段、未进行初始化的数据BSS段)、堆(Heap)、栈(Stack)

对于栈区:由编译器自动释放,存放函数的形参、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中,然后这个被调用的函数再为它的变量(如局部变量)在栈上分配空间,每调用一个函数一个新的栈就会被使用。局部变量的生命周期也是有区别的,静态局部变量的生命周期是从程序开始到程序结束,而非静态局部变量在函数结束后被回收销毁。栈区存放数据是从高地址位向低地址位存放的,也就是栈顶(地址在栈区里最低)存放最新数据,栈底(地址在栈区里最高)存放第一个数据,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。
栈采用后进先出(LIFO) 策略,就像一杯倒立的水杯,杯底(也就是栈底)的水是最后倒出的也是最先倒进去的,杯顶(也就是栈顶)的水是最先倒出的也是最后倒进去的。
这里讲到变量的生命周期,那就回顾生命周期、作用域的意思。
生命周期:指的是程序执行过程中该变量存在的时间长短;
作用域:指的是变量可以在哪儿用,如只能在本函数调用、只能在本文件调用、可以被其他文件调用;

对于堆区:用于动态内存分配,位于BSS段和栈中间的地址区域,由程序员手动申请分配(malloc)和释放(free)。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的使用malloc/free函数可能造成内存空间的不连续,产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间,因此堆的效率比栈要低的多。

在这里插入图片描述

http://www.lryc.cn/news/27799.html

相关文章:

  • Java 二叉树的遍历
  • 实习日记-C#
  • Tech Lead如何引导团队成员解决问题?
  • 07--组件
  • 怎么做好一个完整的项目复盘
  • 浅谈一下mysql8.0与5.7的字符集
  • paddle推理部署(cpu)
  • 想开发IM集群?先搞懂什么是RPC!
  • 案例13-前端对localStorage的使用分析
  • CNNIC第51次中国互联网络发展状况统计报告用户规模变化发布、解读与白杨SEO看法
  • 【数据结构】单链表的实现
  • 从0到1做产品!产品设计的6个步骤
  • ESP32遥控器软硬件设计
  • vue-template-admin的keep-alive缓存与移除缓存
  • 【人工智能 AI】机器学习快速入门教程(Google)
  • 适配器模式
  • 00后跨专业学软件测试,斩获8.5K高薪逆袭职场
  • 数据结构和算法学习
  • 剑指 Offer II 012. 左右两边子数组的和相等
  • Java货物摆放
  • 计算机求解满足三角形各边数字之和相等的数字填充
  • python魔术方法
  • 从0开始学python -48
  • 当面试官问我前端可以做的性能优化有哪些
  • 一文读懂Java/O流的使用方法和技巧
  • AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!
  • SpringCloud简单介绍
  • 《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置
  • APICloud 弹动与滚轴冲突的解决模拟
  • Spring Cloud(微服务)学习篇(四)