单片机MCU地址理解与记录——以arm m3为例

STM32 的 Flash 和 RAM 地址范围

找到开发手册中都会有这个MCU的地址映射表。

里面就可以知道为什么

内存SRAM的地址起始范围是0x2000 0000

存储FLASH的地址起始是0x0800 0000

以及各个外设的的寄存器起始地址 0x4000 0000

FLASH

代码和数据是存放在 flash 中的,下面是将 flash 内部进行细分之后的一张图,图中标明了代码段,数据段以及常量在 flash 中的位置。

Executable Code执行代码段,即编译完的代码存储在这个位置
Read Only Data只读变量的值
Copy of Data Section非0全局变量的初始值,因为每次上电ram会被清掉
#include <stdio.h>
const int read_only_variable = 2000;
int data = 500;

void my_function(void)
{
	int x = 200;
	char *str = "string";
}

在上述代码中,read_only_variable 是一个用 const 修饰的全局变量,它是只读的,存放在 flash 中的只读数据区域,编译器会给 read_only_variable 分配一个地址,并将 2000 这个数据存放到这个位置。data 这个变量将存放到 RAM 中的RW区域中 (后面将会进行详细讲解),但是 data 后面的初始值 500 将会被存放到数据复制区域中, 也就是上图中从下往上的第三个区域。在 my_function 中的变量 x 将会被存放到 RAM 中的堆栈中,将 x 赋值为 200 ,200 将被存储到 flash 里的 Text 中的常量区 (Literal Valu) 中。str 是一个 char 型的指针变量,它指向的是字符串第一个字符存放的位置,然而对于字符串 string 来讲,它是存放在Text常量区的,所以指针变量指向这个区域的一个地址,但是因为它终归中局部变量,它指向 Flash 的一个地址,但是其本身还是存放于 RAM 中的堆栈上的。

RAM

栈 (Stack) 

存放局部变量  函数调用时的返回地址,保留现场等

堆 (heap)

由 malloc 申请,由 free 释放

bss 

存放未初始化或者是初始化为 0 的全局变量
data存放初始化为非 0 值的全局变量
#include <stdio.h>
#include <stdlib.h>
int data_var = 500;
int bss_var0;
int bss_var1 = 0;
static int static_var;

void my_function(void)
{
	static int static_var1 = 0;
	int stack = 0;
	char *buffer;
	const int value = 1;
	buffer = malloc(10);
}

上述变量的命名已经很清楚地表明了变量处于 RAM 中的哪一个段,data_var 是已经初始化的全局变量,存放在 RAM 的 data 区,bss_var0 和 bss_var1是未初始化和初始化为0的全局变量,他们都存放于 RAM 中的 bss段,由 static 修饰的static_var 和 static_var1 都存放于 bss段,区别只在于两个变量的作用域不同。stack 是在函数内部定义的局部变量,其存放于 RAM 的区域,用 const 修饰的局部变量 value ,虽然他是只读的,但是它是存储于 RAM 中的中的,这里也说明一点,并不是所有用 const 修饰的变量都是存放于只读变量区的。buffer指针变量用 malloc 函数申请了 10 字节的内存空间,那这10字节的内存空间位于中。

 

STM32中的map文件分析

在用 keil 编译 STM32 工程之后,我们会得到一个 map 文件,map 文件的最底部有这么一个信息:

对应关系如下:

CodeRO DataRW DataZI Data
Executable Code(flash)Read Only Data(flash)data(ram)bss(ram)

基本上可以算出flash和ram占用的空间内容

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值