MCU内存基础知识

文章目录

  • 一、存储器分类
  • 二、C语言内存分区内存区
  • 三、STM32启动文件分析
  • 四、应用分析

一、存储器分类

在这里插入图片描述
RAM(Random Access Memory) :掉电之后就丢失数据,读写速度块
ROM (Read Only Memory) :掉电之后仍然可以保持数据

单片机的RAM和ROM

单片机的ROM,叫只读程序存储器,是FLASH存储器构成的,如U盘就是FLASH存储器。所以,FLASH和ROM是同义的。单片机的程序,就是写到FLASH中了。而RAM是随机读/写存储器,用作数据存储器,是在运行程序时,存放数据的。

二、C语言内存分区内存区

C语言:内存分配—栈区、堆区、全局区、常量区和代码区

一篇带你了解C语言内存五大区——栈区,堆区,全局区,常量区,代码区

干货——聊聊内存那些事(基于单片机系统)
内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域。
在这里插入图片描述

代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。

常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 25,字符串常量”dongxiaodong”, 数组的名字等)

静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放

堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏

栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。在这里插入图片描述

  1. 详细代码如下
#include "main.h"
#include <string.h> //用于字符串处理
#include <stdio.h>	//用于printf打印
#include <stdlib.h> //用于分配堆区---调用malloc和free#include "delay.h"
#include "uart3.h"
#include "led.h"//全局区int 	q1;		//未初始化全局变量
static 	int 	q2;		//未初始化静态变量	
const  	int   	q3;		//未初始化只读变量		int   m1=1;		//已初始化全局变量
static  int   m2=2;		//已初始化静态变量//常量区
const   int   m3=3;		//已初始化只读变量int main(void)
{SystemCoreClockUpdate(); //设置系统时钟为72MLED_GPIO_Config();Uart3_init();while(1){//栈区	int 	 mq1;			//未初始化局部变量int  	*mq2;			//未初始化局部指针变量int   	mq3=3;		//已初始化局部变量	char 	qq[10] = "hello"; //已初始化局部数组const  	int   mq4;			//未初始化局部只读变量const   int   mq5=3;		//已初始化局部只读变量//堆区int *p1 = malloc(4);    //已初始化局部指针变量p1int *p2 = malloc(4);    //已初始化局部指针变量p2		//全局区static 	int 	mp1;			//未初始化局部静态变量	static  int   mp2=2;		//已初始化局部静态变量//常量区char *vv = "I LOVE YOU";//已初始化局部指针变量char *mq = "5201314";printf("\n栈区-变量地址\n");printf("未初始化局部变量 		:0x%p\r\n",&mq1);printf("未初始化局部指针变量		:0x%p\r\n",&mq2);printf("已初始化局部变量			:0x%p\r\n",&mq3);printf("已初始化局部数组			:0x%p\r\n", qq );printf("未初始化局部只读变量 		:0x%p\r\n",&mq4);printf("已初始化局部只读变量		:0x%p\r\n",&mq5);printf("\n堆区-动态申请地址\r\n");printf("已初始化局部int型指针变量p1   :0x%p\r\n", p1);printf("已初始化局部int型指针变量p2   :0x%p\r\n", p2);printf("\n全局区-变量地址\n");printf("未初始化全局变量 	:0x%p\r\n",&q1);printf("未初始化静态变量		:0x%p\r\n",&q2);printf("未初始化只读变量		:0x%p\r\n",&q3);printf("已初始化全局变量 	:0x%p\r\n",&m1);printf("已初始化静态变量		:0x%p\r\n",&m2);printf("未初始化局部静态变量	 :0x%p\r\n",&mp1);printf("已初始化局部静态变量	 :0x%p\r\n",&mp2);			printf("\n常量区地址\n");printf("已初始化只读变量		  :0x%p\r\n",&m3);printf("已初始化局部指针变量	  :0x%p\r\n",vv );printf("已初始化局部指针变量	  :0x%p\r\n",mq );printf("\n代码区地址\n");printf("程序代码区main函数入口地址	:0x%p\n", main);led485_flicker();delay_ms(1000);free(p1);free(p2);        }
}

三、STM32启动文件分析

  • STM32启动流程分析

32位的M3有4GB的寻址空间,2^32(字节) = 4G(字节),STM32的存储器地址映射,地址范围为:0x0000_0000-0xFFFF_FFFF;其中代码区的地址是从0x0800_0000开始的,结束于0x0800_0000+芯片的Flash的大小;
STM32寄存器版的基础知识—内存映射

STM32单片机启动流程分析

四、应用分析

  • STM32flash就是ROM

1、编译器编译文件分析
在这里插入图片描述
在这里插入图片描述
那么RAM是什么呢,RAM就是运行内存,掉电数据就丢失;(通常保存着堆、栈、bss段、data段、ZI-data、RW-data)

在map文件可以查看到RAM大小
在这里插入图片描述

RAM = RW-data + ZI-data

text:代码段,存储在FLASH中

data:初始化数据 数据段

bss:未初始化数据 数据段

可以发现RW-data 出现在了 RAM和FLASH(ROM)中,RW-data为什么会即占用Flash又占用RAM空间?

由前文知道RAM掉电数据会丢失,RW-data是非0初始化的数据,已初始化的数据需要被存储在掉电不会丢失的FLASH中,上电后会从FLASH搬移到RAM中
CPU:STM32F103C8T6,LQFP64,FLASH:64KB,RAM:20KB

flash起始地址为0x8000000,大小为0x10000(16进制)—>65536字节(10进制)—>64KB

RAM起始地址为0x2000000,大小为0x5000(16进制)—>20480字节(10进制)—>20KB

ROM(FLASH)的起始地址是0x8000000 512k的flash大小=512*1024=0x80000字节

RAM的起始地址为0x20000000 大小为 64*1024=0x10000字节

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

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

相关文章

Docker部署MinIO对象存储服务器结合Cpolar实现远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远…

反渗透水处理成套设备有哪些

反渗透水处理成套设备主要包括反渗透装置、预处理系统、控制系统等部分。 反渗透装置&#xff1a;反渗透水处理设备的核心部分&#xff0c;由反渗透膜、压力容器、膜组件等组成。反渗透膜是一种高分子材料制成的半透膜&#xff0c;能够截留水中的溶解盐、有机物、细菌等杂质&a…

buildadmin+tp8表格操作(7)表格的事件监听

buildadmin 中的事件都已经在 baTable类中定义好了。我们一般不会去修改&#xff0c;万一我们要在事件上有所操作&#xff0c; 我们可以通过事件的 前置和后置 钩子函数来处理 那么我们是如何使用这些钩子呢&#xff1f; 我们只需要在 创建对象的时候&#xff0c;定义好这些钩…

场景交互与场景漫游-路径漫游(7)

路径漫游 按照指定的路径进行漫游对一个演示是非常重要的。在osgViewer中&#xff0c;当第一次按下小写字母“z”时&#xff0c;开始记录动画路径;待动画录制完毕&#xff0c;按下大写字母“Z”&#xff0c;保存动画路径文件;使用osgViewer读取该动画路径文件时&#xff0c;会回…

二进制部署k8s集群-过程中的问题总结(接上篇的部署)

1、kube-apiserver部署过程中的问题 kube-apiserver.conf配置文件更改 2、calico的下载地址 curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O 这里如果kubernetes的节点服务器为多网卡配置会产生报错 修改calino.yaml配置文件 解决方法&#xff1a; 调…

Modbus转Profinet网关在金银精炼控制系统中应用案例

金银精炼控制系统中采用Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;连接1200plc与PID控制阀门进行通讯&#xff0c;通过控制PID阀门的大小来实现温度的恒温控制。这一系统的好处在于它能够提高金银精炼过程的效率和精确度。PID控制阀门可以根据温度的变化实时调整…

SaleSmartly新增AI意图识别触发器!让客户享受更精准的自动化服务

AI意图识别技术是对话式AI中很重要的组成部分&#xff0c;通俗点来说就是一种可以识别用户在对话中表达的意图的技术。通过对大量数据的分析和学习&#xff0c;AI可以理解用户想要获得的信息&#xff0c;并根据这些信息来采取相应的行动或提供相应的响应。而在对话式AI中&#…

98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

在上章我们只是简单实现了曲线图和折线图的显示: 79.qt qml-如何在QML中使用QCustomPlot之曲线/折线示例(已适配黑白风格)_qml 折线图_诺谦的博客-CSDN博客 所以本章实现综合示例、并添加多种功能如下所示: 详细显示:鼠标任意移动显示具体值内容鼠标右击: 弹出菜单栏,支持…

OPPO Watch纯手机开启远程ADB调试

Wear OS手表中&#xff0c;我们可以直接在开发者设置中打开WiFi调试。但是这在OPPO等魔改Android系统中不再奏效。 需要什么&#xff1f;&#xff1f; 手表一台手机一个OTG转接头一个手表充电器一个 演示设备 手机&#xff1a; OPPO Find X手表&#xff1a; OPPO Watch 1代 …

oncoPredict文献学习

原文&#xff1a;oncoPredict: an R package for predicting in vivo or cancer patient drug response and biomarkers from cell line screening data oncoPredict&#xff1a;一种R包&#xff0c;用于从细胞系筛选数据中预测体内或癌症患者的药物反应和生物标志物 - PMC (n…

Vue网页中使用PDF.js弹窗显示pdf文档所有内容

本文中使用的PDF.js组件版本为3.11.174&#xff08;最新版使用上会有所不同&#xff09;&#xff0c;引入文件如下&#xff1a; 首先页面定义一个隐藏的弹窗块&#xff08;此处用ElementUI的Dialog组件&#xff09; <el-dialog ref"dialogPDF" :title"pdffi…

同创永益联合红帽打造一站式数字韧性解决方案

随着AI技术的快速兴起&#xff0c;IT技术已成为推动业务持续增长的重要驱动力&#xff0c;这要求企业不断尝试新事物&#xff0c;改变固有流程&#xff0c;加强IT技术与业务的合作&#xff0c;同时提升数字韧性能力&#xff0c;以实现业务目标。10月26日&#xff0c;红帽2023中…

“释放视频潜力,批量放大视频尺寸,高效提升视频质量“

在视频制作和编辑的过程中&#xff0c;我们经常需要调整视频的尺寸。然而&#xff0c;一个一个地手动调整不仅耗时&#xff0c;还容易出错。为了解决这个问题&#xff0c;现在有一款全新的视频批量剪辑工具&#xff0c;可以帮助你批量将视频尺寸放大&#xff0c;提升工作效率。…

FISCOBCOS入门(十)Truffle测试helloworld智能合约

本文带你从零开始搭建truffle以及编写迁移脚本和测试文件,并对测试文件的代码进行解释,让你更深入的理解truffle测试智能合约的原理,制作不易,望一键三连 在windos终端内安装truffle npm install -g truffle 安装truffle时可能出现网络报错,多试几次即可 truffle --vers…

2023.11.17 hadoop之HDFS进阶

目录 HDFS的机制 元数据简介 元数据存储流程:namenode 生成了多个edits文件和一个fsimage文件 edits和fsimage文件 SecondaryNameNode辅助NameNode的方式: HDFS的存储原理 写入数据原理: 发送写入请求,获取主节点同意,开始写入,写入完成 读取数据原理:发送读取请求,获取…

团结引擎已全面支持 OpenHarmony 操作系统

Unity 中国宣布与开放原子开源基金会达成平台级战略合作。 据称团结引擎已全面支持 OpenHarmony 操作系统&#xff0c;同时将为 OpenHarmony 生态快速带来更多高品质游戏与实时 3D 内容。Unity 称现在用户可以 “在 OpenHarmony 框架中感受到与安卓和 iOS 同样丝滑的游戏体验”…

系列十一、你平时工作用过的JVM常用基本配置参数有哪些?

一、常用参数 1.1、-Xms 功能&#xff1a;初始内存大小&#xff0c;默认为物理内存的1/64&#xff0c;等价于 -XX:InitialHeapSize 1.2、-Xmx 功能&#xff1a;最大分配内存&#xff0c;默认为物理内存的1/4&#xff0c;等价于 -XX:MaxHeapSize 1.3、-Xss 功能&#xff1a;设置…

CICD 持续集成与持续交付——git

git使用 [rootcicd1 ~]# yum install -y git[rootcicd1 ~]# mkdir demo[rootcicd1 ~]# cd demo/ 初始化版本库 [rootcicd1 demo]# git init 查看状态 [rootcicd1 demo]# git status[rootcicd1 demo]# git status -s #简化输出 [rootcicd1 demo]# echo test > README.md[roo…

开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势未来发展方向

开源vs闭源大模型如何塑造技术的未来&#xff1f;开源模型的优劣势&未来发展方向 写在最前面一、开源与闭源&#xff1a;定义与历史背景开源和闭源的定义开源大模型&#xff1a;社区驱动的创新 二、开源和闭源的优劣势比较开源大模型&#xff08;瓶颈&#xff09;数据&…

QT下使用QChart绘制曲线

目录 头文件内容构造函数AddSeries方法UpdateSeries方法AppendSeriesData方法SetLegendVisiableSetRubberBandCPP内容测试函数 需要用到的头文件&#xff1a; #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QValueAxis> #…