IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32内存映射解析 -> 正文阅读

[嵌入式]stm32内存映射解析

请添加图片描述

Block 0 代表Flash,Block1代表SRAM

请添加图片描述

FLASH内存分布

请添加图片描述

Flash memory

请添加图片描述

Executable Code可执行代码
Literal Values常量,是用enum类型和#define宏
Read Only Data只读的变量,const修饰的全局变量
Copy of Data Section非0的全局变量

SRAM内存分布

请添加图片描述

data非0的全局变量
bss未初始化或初始化为0的全局变量,由static修饰的为0的全局变量或局部变量,区别在于作用域不同
Stack局部变量,const修饰的局部变量
Heapmalloc动态申请的内存

程序运行过程

请添加图片描述

RO段代码+只读变量
RW段非0的全局变量

运行时内存呢分布,RO段与RW段中间的空白可以看成Flash与SRAM之间的区域。 也可以说ROM与RAM之间的内存区域。

STM32 在上电启动之后默认从 Flash 启动
启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中
但不会搬运 RO 段

即 CPU 的执行代码从 Flash 中读取(CPU读Flash的速度也很快)
另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零。

拓展

auto :用于区分局部变量和全局变量. 用auto定义的变量都是局部变量
volatile :读取该变量的值都重新从内存中读取
register :变量存在CPU 内部寄存器中而不是通过内存寻址访问

整理

存储位置:栈

void fun(void)
{
	unsigned char  str[] = "12345678";				  	//str在栈中
    const unsigned char  str[] = "12345678";          	//str在栈中

	unsigned int i = 5;          						//i在栈中
    const unsigned int i = 5;          					//i在栈中
	unsigned char *p ="12345678";          				//p在栈中
}

存储位置:Flash的RO段

unsigned char *p ="12345678";          				//p在RW段,初始值在RO段
static unsigned char *p ="12345678";   				//p在RW段,初始值在RO段

const unsigned char  str[] = "12345678";          	//str在RO段
static const unsigned char  str[] = "12345678";  	//str在RO
static const unsigned int i = 5;   				  	//i在RO段

void fun(void)
{
    static  const unsigned char  str[] = "12345678";  //str在RO段
    static  const unsigned int i = 5;   			  //i在RO段
}

存储位置:RW段

unsigned int i = 5;                					//i在RW段
static  unsigned char  str[] = "12345678";        	//str在RW段
unsigned char *p ="12345678";          				//p在RW段,初始值在RO段
static unsigned char *p ="12345678";   				//p在RW段,初始值在RO段

void fun(void)
{
    static  unsigned char  str[] = "12345678";        //str在RW段
}

计算内存是否溢出

Keil/MDK 编译完工程,得到如下信息:
Program Size: Code=25648 RO-data=400 RW-data=800 ZI-data=8752

Total RO Size (Code + RO Data) 26048 ( 25.44kB)
Total RW Size (RW Data + ZI Data) 9552 ( 9.33kB)
Total ROM Size (Code + RO Data + RW Data) 26372 ( 25.75kB)****(即烧/下载程序到FLASH/ROM时,所占用的最小空间)

Keil生成Bin文件

在这里插入图片描述

fromelf.exe --bin -o "$L@L.bin" "#L"
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:38:13  更:2022-07-05 23:38:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 14:08:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码