【随手笔记】单片机内存

单片机内存(ram)、flash、与数据存储和启动过程说明 1 电脑程序运行过程与单片机的区别 由于电脑中的程序是存储在磁盘中的,而磁盘的读取速度非常慢,因此我们不可能从磁盘中直接读取当前要执行的代码,这样必然导致程序阻塞。好在,电脑的内存非常大,所以在程序执行之前,先把整个代码copy到内存中,然后CPU从内存中读取一条条指令,并运行。 为了合理利用和规划内存资源,除了操作系统的内存管理外,最重要的是内存的分段。对每一个进程,操作系统都会为其分配一片内存... 阅读详情

单片机内存

1. 名词解释

  1. flash、ROM、RAM的区别
  • 在stm32中flash就是ROM,掉电数据还保存的;
  • (通常保存着text段、Code、Ro-data、Rw-data)
  • RAM就是运行内存,掉电数据就丢失;
  • (通常保存着堆、栈、bss段、data段、ZI-data、RW-data)

计算机系统中,变量、中间数据一般存放在 RAM 中,只有在实际使用时才将它们从 RAM 调入到 CPU 中进行运算。一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用

  • 一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在 MCU 不同的存储区。

Program Size: Code=48008 RO-data=5660 RW-data=604 ZI-data=2124

Code:代码段,存放程序的代码部分

RO-data:只读数据段,存放程序中定义的常量 .
const int a= 123;
#define ABCD (123)

RW-data:读写数据段,存放初始化为非 0 值的全局变量.
int a = 123;//非零全局变量

ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量;
int a;//未初始化全局变量(未初始化的全局变量也是0,未初始化的局部变量是任意值)
int a=0;//初始化为0变量

编译完工程会生成一个.map 的文件,该文件说明了各个函数占用的尺寸和地址
Total RO Size (Code + RO Data) 53668 ( 52.41kB)
Total RW Size (RW Data + ZI Data) 2728 ( 2.66kB)
Total ROM Size (Code + RO Data + RW Data) 53780 ( 52.52kB)

RO Size 包含了 Code 及 RO-data,表示程序占用 Flash 空间的大小
RW Size 包含了 RW-data 及 ZI-data,表示运行时占用的 RAM 的大小

ROM Size 包含了 Code、RO-data 以及 RW-data(非0),表示烧写程序所占用的 Flash 空间的大小

程序运行之前,需要有文件实体被烧录到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,该被烧录文件称为可执行映像文件。

如图是可执行映像文件烧录到 STM32 后的内存分布,它包含 RO 段和 RW 段两个部分:
其中 RO 段中保存了 Code、RO-data 的数据,
RW 段保存了 RW-data ,ZI-data的数据,
由于 ZI-data 都是 0,所以未包含在映像文件中。

STM32 在上电启动之后默认从 Flash 启动,启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中,但不会搬运 RO 段,即 CPU 的执行代码从 Flash 中读取,
另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零
在这里插入图片描述

在这里插入图片描述

添加链接描述

栈不需要程序员手动去申请,函数的局部变量、入参都占用栈空间,当函数执行结束是,栈空间会自动释放。
​ 堆需要程序员手动申请、释放。

​ 直接说明,堆和栈在 ram 中。

在启动文件有如下定义
堆区和栈区的大小在如下位置定义,可以按自己的需要修改,注意单片的RAM的大小,堆和栈不是你想改多大就多的

堆空间大小是需要自己分配的

ROM/FlashCode+RO+RW
RAMRW+ZI
RAM动态内存堆手动申请
RAM栈自动(局部变量,传参)

线程栈
RT-Thread 线程具有独立的栈,当进行线程切换时,会将当前线程的上下文存在栈中,当线程要恢复运行时,再从栈中读取上下文信息,进行恢复。

线程栈还用来存放函数中的局部变量:函数中的局部变量从线程栈空间中申请;函数中局部变量初始时从寄存器中分配(ARM 架构),当这个函数再调用另一个函数时,这些局部变量将放入栈中

STM32 内存分配、堆栈以及变量存储位置理解与分析 STM32 内存分配、堆栈以及变量存储位置理解(STM32 flash 和 ram) 阅读详情

相关推荐

嵌入式开发(10)Flash、RAM、ROM理解

Cortex-M3和Cortex M4处理器本身并不包含存储器(没有程序存储器、SRAM或缓 存),它们具有通用的片上总线接口,因此,微控制器供应商可以将它们自己的存储器系统添加 到系统中。一般来说,微控制器供应商需要将下面的部件添加到存储器系统中:(1)程序存储器, 一 般是Flash。(2)数据存储器, 一般是SRAM。(3)外设。

Yank_k的博客 8821

关于单片机内存详解

存储器单元实际上是时序逻辑电路的一种。按存储器的使用类型可分为只读存储器ROM)和随机存取存储器RAM),两者的功能有较大的区别,因此在描述上也有所不同。

嵌入式学习之路 2989

应广单片机PMS154入门指南:从环境搭建到红外解码实战

在嵌入式开发领域,理解程序如何直接控制硬件是核心基础。8位单片机以其精简的架构和贴近硬件的编程模式,成为掌握这一原理的理想起点。通过操作寄存器直接配置时钟、GPIO、定时器和ADC等外设,开发者能深入理解计算机体系结构中的内存映射I/O和中断机制。这种底层控制能力对于实现实时控制、传感器数据采集和低功耗设计具有重要技术价值,广泛应用于智能家居、工业控制和消费电子等领域。本文以应广PMS154单片机为例,详细介绍了从Mini-C编程、定时器中断到PWM电机控制的全流程,并通过红外遥控解码项目,演示了如何利用外

weixin_34174322的博客 345

单片机内存管理

单片机内存管理,单片机内存位于RAM中,它被分成四个区:静态存储区、栈区、堆区和未用区。

weixin_42550185的博客 3881

蓝桥杯单片机备忘录:高频考点与实战避坑指南

单片机开发是嵌入式系统入门核心技能,而蓝桥杯作为国内权威工程实践赛事,其单片机组高度聚焦STC系列芯片在真实开发板(如CT107D)上的工程落地能力。理解寄存器配置、时序约束与硬件耦合关系,是实现稳定通信、精准控制与可靠存储的技术基础。尤其在I²C、SPI、ADC、DAC7578、AT24C02等模块应用中,微小的初始化顺序错误、上拉电阻选型偏差或BUSY标志忽略,都会导致功能失效——这正是‘蓝桥杯单片机备忘录’的价值所在:它将真题反向工程得出的条件反射级操作规范,转化为可即插即用的功能单元。面向备赛学生与

weixin_30263073的博客 346

51单片机心形动画显示全套开发包:Keil工程+Proteus仿真图+可烧录HEX文件

直接可用的51单片机心形图案显示项目,含完整Keil uVision工程(.uvproj、.uvopt等)、已编译好的心形.hex烧录文件、Proteus仿真电路图(prutuse仿真系统电路图.png),以及源码aiixn1.c和启动文件STARTUP.A51。所有文件开箱即用,无需额外配置——在Keil中一键编译,在Proteus中加载HEX即可运行软硬件联合仿真。配套生成的中间文件(.OBJ、.LST、.M51)和调试日志(.plg)便于理解编译流程与底层执行细节。心形图案通过LED点阵或数码管实现,

qsc901234的博客 226

【随手笔记】EEPROM之AT24C512

AT25C512

Longrun的博客 8082

基于51单片机Proteus仿真的智能婴儿车系统设计全流程

单片机嵌入式系统设计是电子信息类课程的核心实践环节,其本质是通过主控芯片与传感器、执行器的协同工作,实现环境感知与智能控制。以51单片机为典型代表,结合Proteus仿真工具,开发者无需硬件即可验证电路逻辑与代码时序,大幅降低调试成本。温湿度检测与超声波测距是此类系统中常见的传感应用,前者通过单总线协议获取环境数据,后者利用声波回波时间计算障碍物距离,二者结合可实现婴儿车场景下的安全预警与状态显示。仿真验证通过后,再依托Altium Designer完成原理图绘制与BOM整理,即可实现从逻辑设计到物理落地的

weixin_28721917的博客 304

软件设计——随手笔记

头文件包含其它头文件尽量少 include头文件会导致文件体积增大吗?不会。最后生成的可执行文件.hex里面只有函数定义、全局变量、以及一些字符串常量等。这些才会占据.hex文件的空间。c文件里定义变量和函数,h文件里声明变量(有的用extern声明对应c文件的变量成外部变量)和函数 软件中标志位变量,计数变量什么时候复位非常重要,要么是置位后马上复位,要么在其它地方复位,计数变量一般是计满值触发执行后马上复位 全局变量的共用时间点非常关键,不要这边在改变,那边却要使用改变前的值,这样程序就会出现奇怪值

改变自己现在能改变的,珍惜自己现在所拥有的 694

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 253

ROS2与Gazebo协同实现多机器人避障仿真

本文详细介绍了如何利用ROS2与Gazebo协同搭建多机器人避障仿真环境。通过创建SDF机器人模型、编写多机器人启动文件以及集成基础避障算法,构建了一个低成本、高效率的虚拟测试平台,为AGV编队、机器人集群等项目的算法验证与迭代提供了完整解决方案。

weixin_29065659的博客 295

【随手笔记】keil HardFault_Handler问题整理(一)

在此处打断点定义数组10,然后让数组非法越界每次先输出计数值,然后重置数组,然后运行通过打印OK4. 打断点。

Longrun的博客 401

抖音视频数据获取实战:从API调用到热门内容挖掘

通过抖音API获取视频数据,企业可快速构建数据驱动的运营体系。本文提供了从权限申请到商业落地的全流程指南,建议结合自身业务扩展功能。如有技术问题,欢迎​​评论​​区留言讨论!#抖音开发 #数据挖掘 #短视频运营 #API调用 #Python实战。

WBKJ_Noah_的博客 6397

单片机计算机基础知识总结,自学单片机第九篇:基础知识--计算机基础操作

这个更基础了也许是我说的都是一些百度认为完全可以靠百度就能知道的东西,所以一直不给推荐,或许我这个不食人间烟火的标题让百度觉得太稀松平淡,觉得丝毫吸引不到眼球,于是就放弃了推荐,但是,作为一个理科男,脑子有时候就是会稍微倔强那么一丝丝,我就是不写《连这个操作都会,还说自己会玩电脑?》这样的题目,太狗血,理科,就是这么单刀直入,哪怕没有什么内容,也是一样在题目上就可以看出来,不过说实话,有时看着只有...

weixin_39637661的博客 381

黑科技已上线|Lazada数据分析软件,一键式搞定你的店铺!

工欲利其事,必先利其器。在lazada跨境电商的整个流程中,适当的使用一些工具,不仅能大大的简化工作流程,而且可以提高实施效率。Mengla专为lazada电商卖家行业精细化分析lazada数据分析软件都有哪些强大功能! 一、两大优势: 1.海量数据: 数据覆盖面积大;数据分析维度逛;精确算法抓取海量数据;亿万数据秒级响应多种数据来源; 2.技术成熟: 深耕SaaS大数据挖掘;提供一站式数据分析服务;拥有领先的采集技术和运算模型架构; 二、Lazada数据分析软件的功能: 1.各国站点一键分析: 马来西亚

Menglakeji的博客 1146

Procedural modeling

What is procedural modeling? One content generation option is modeling buildings, plants, clouds, cities, and worlds using an underlying system of rules. 1 Procedural Modeling: Grammars A rule-based generative system loosely organized as: ...

qq_24505417的博客 711

动态内存分配

如果说你这个数组是在栈里面的,那么他的生命周期是跟函数相关的,函数一旦执行完毕了,里面的数组也会随之消失,如果在其他函数里面还想要用下面这个数组,其实是用不了的,因为函数都消失了,函数里面的东西也就没了,而使用melloc,则是在堆里面,只要不要free,那么他永远存在,一直到程序 的结束才消失。用我们以前的方式定义的数组是在栈里面的,而用melloc定义的空间,是在堆里面的,而堆里面的空间比栈要大的多,如果说数组中的内容比较多,这个时候放到栈里,不太合适,

Wjs153612的博客 784

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

算法大师! 1324

GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存

前面测试了多种技术路线,本篇补全剩下的2种主流技术,v4l2+sdl2(偏底层),v4l2+QtOpengl(应用),v4l2+ffmpeg+QtQImage(Image的方式转图低于1ms,但是从yuv格式转到rgb格式需要ffmpeg进行转码耗时)。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 1万+

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及TRNG(真随机数生成)。

认真搞搞汽车MCU 5746

C-Lodop打印服务系统存在任意文件读取

C-Lodop打印服务系统存在任意文件读取

weixin_43567873的博客 2875

ARM Cortex-M 单片机启动流程与向量表深度解析(保姆级复习笔记)

摘要:本文详细解析了ARM Cortex-M系列单片机从复位到执行main函数的完整启动过程。复位后CPU会自动从向量表前两项读取栈顶地址和复位处理函数地址,分别加载到SP和PC寄存器。随后执行Reset_Handler进行数据段初始化、BSS段清零等C环境准备工作,最终跳转至main函数。文章通过寄存器解析、内存映射说明、汇编指令讲解和生动比喻,帮助读者深入理解启动机制,并指出掌握该流程对调试启动问题、开发Bootloader和中断管理具有重要意义。同时提供了实际验证方法和常见问题解答,可作为嵌入式开发的

2502_92009732的博客 1056

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【随手笔记】FLASH-W25Q16(二)

SPI通信W25Q64。W25Q 系列为台湾华邦公司推出的是一种使用 SPI 通讯协议的 NOR FLASH 存储器,64代表的是64Mbit的大小,也就是8MB的大小。> 8MB被分为128个块(一个块64KB),而一个块又被分为16个扇区(一个扇区4KB)。

Longrun的博客 1007

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C51单片机复习-DAY2

这是我重新学习 51 单片机 C 语言的第二天笔记。第一天主要学习了 51 单片机 C 程序的基本结构,包括main()while(1)sbit、IO 高低电平控制以及 LED 闪烁程序。第二天开始进入 C 语言基础部分,不过这里不会单纯讲语法,而是结合 51 单片机实际开发场景来理解数据类型、变量、常量、溢出和嵌入式编程习惯。在单片机程序中,数据类型的选择非常重要。因为单片机资源有限,变量类型选得是否合适,会直接影响程序的 RAM 占用、Flash 占用、运行速度和稳定性。C51 常用数据类型;

weixin_43204652的博客 261

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Keil5项目管理实战:如何高效组织单片机项目文件结构(附完整配置流程)

本文详细介绍了在Keil5环境下高效组织单片机项目文件结构的实战方法。通过规划清晰的物理目录与Keil工程虚拟群组,并配置头文件路径与编译输出,构建了一套可维护、可扩展的标准化流程。文章还指导如何创建可复用的项目模板,旨在提升开发效率和团队协作的规范性,是Keil5项目管理的实用指南。

bush的博客 264

嵌入式智能门锁项目学习笔记(一) 标准库扫盲

嵌入式智能门锁开发入门:GPIO与定时器实战 本项目使用MounRiver Studio开发环境和CH32V307芯片,通过GPIO和定时器实现基础控制功能。开发方式对比了寄存器、标准库和HAL库三种方法,标准库因其易用性成为新手首选。文章详细讲解了GPIO初始化流程,以PC2引脚控制LED为例,展示了从时钟配置到引脚输出的完整代码。同时引入定时器中断机制,通过TIM2实现非阻塞延时,类比"闹钟"解释中断原理,提供定时器初始化和中断服务函数的移植代码。这些基础模块为后续智能门锁功能开发奠

GOAT210的博客 748
上一篇: CRC8使用记录
下一篇: 【随手笔记】GPS基础知识+模组使用
Long-Run
博客等级 码龄3年 4600粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值