单片机的存储空间

单片机从硬件上来说,只有两种空间:

ROM和RAM!

再说一遍,只有ROM和RAM!

再说一遍,只有ROM和RAM!

也就是说,你程序里的所有东西,不是放在RAM里,就是放在ROM里。

ROM的属性是read only(只读),只能用来读取,无法修改,其实也可以修改,只是需要特殊方法,这里暂时不谈!

RAM的属性是read+write(可读可写)

ROM和RAM区域有可能是间断的,分段的。其中RAM主要有数据段+堆+栈+通用寄存器+特殊功能寄存器等

所以编译器(你可以认为是keil)根据只读或者读写的属性将程序划分为

1、ROM区(也就是单片机的FLASH区)

我们都了解,rom是只读的,所以里面的内容也是只读的,这里面包括

1.1、软件的代码段(code)

void main(void)
{
    ;
} 

1.2、数据常量(被const修饰的数据常量)就是放在这里的。

const unsigned int a[100] = 
{
    1,2....
};

1.3、数据段,定义的数据(这个理解起来有点困难,因为涉及运行视图和加载视图

2、RAM区

RAM区域读写的,掉电易失的,再说一遍,掉电易失!

那么问题来了,刚上电复位时,ram区肯定是空的,那么访问全局变量时,数是怎么找到的?

如果我们仔细看一下ARM启动过程(从上电到main),就是main之前东西,我们就能知道了。这里我们首先要明白两个概念。程序的运行视图和加载视图。

其中RAM区域主要包含以下内容:

2.1、数据段(data)

BSS(未初始化的全局变量+未初始化的静态变量)

Data初始化的全局变量+初始化的静态变量

2.2、STATCK(栈)

(1)、函数传递参数较多时,参数会入栈;

(2)、中断发生时,用于保存和恢复中断前的现场。

2.3、HEAP(堆)

Malloc函数申请的空间(需要了解操作系统内核和链表)

2.4、SFR(通用寄存器,R1,R2。。。。。R15等)

(1)传递函数参数(个数较少时,一般为3个)使用

(2)中间变量使用

(3)寻址等等(查看汇编的寻址方式等)

2.5、SFR特殊功能寄存器(AD,UART,PWM等)

(1)设置芯片工作状态,操作外设。

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值