8051存储区布局

Intel 8051 memory介绍:
8051具有4K的片上ROM,128字节的片上RAM,同时它具有64K的寻址能力,也就是可以扩展程序存储空间和数据存储空间多达64K。

1. 程序存储空间
8051有4K的片上ROM,该区域是只读的,在sdcc中,可以使用关键字__code将变量存储在该区域中,例如:
__code unsigned char test_code;

2. 数据存储空间
8051具有128字节的片上RAM,而128字节又由以下几部分组成:
1)寄存器组
寄存器组总共32字节,分为四组,每一组对应R0~R7,具体使用哪一组由寄存器PSW的RS1和RS0决定。
2)位寻址区
该区域占16字节共128位,位地址范围为0x00~0x7F。定义在该区域的变量值能有0或1两个值,如果要将变量定义在该区域中,可以使用sdcc中的__bit关键字,例如:
__bit test_bit;
3)通用的RAM
该区域占128字节中剩下的80字节。

3. 特殊功能寄存器
特殊功能寄存器位于地址范围为0x80~0xFF,8051中总共有21个特殊功能寄存器,特殊功能寄存器分布如图所示:


4. 关于特殊功能寄存器中的位地址和寄存器地址的疑惑?
可以参见这里: http://stackoverflow.com/questions/3074191/why-does-some-sfr-in-8051-are-bit-addressable
关于疑惑可以看一下头文件8051.h,P0寄存器位于0x80地址处,而后面定义的P0_0地址为0x80,P0_1地址为0x81,但是地址0x81又是寄存器SP的地址,这样那岂不是重复了?位地址其实可以分成两部分,字节地址和位编号,还是以P0为例,假设有位地址为0x87,那么字节地址为0x80,位编号为7,也就说使用setb和clr指令操作的是寄存器P0的第7位。


8052存储区布局:
8052是8051系列的一个子集,同8051有少许不同。8052片上ROM为8K,256字节的片上RAM,这256字节中前128字节同8051完全一样,同8051不同的是,高128字节可以作为通用的RAM来使用,那这样岂不是又和特殊功能寄存器地址冲突了?完全不会,这128字节只能使用间接寻址来访问,而特殊功能寄存器使用的是直接寻址,所以两者并不冲突。
那这里又涉及到变量的存储问题了:
关键字__data用于将变量存储在前128字节处,并且是直接寻址方式访问,也是操作速度最快的区域,例如:
__data unsigned char test_data;
使用Small Memory模式下变量的默认存储方式。
而关键字__idata使用间接寻址方式访问RAM,例如:
__idata unsigned char test_idata;
和__data关键字定义的变量不同的是,__idata关键字定义的变量存储区域更大,为256字节空间。
关键字__xdata则将变量存储外部RAM中,例如:
__xdata unsigned char test_xdata;
这也是使用Large Memory变量的默认存储方式。

对于使用Small Memory还是Large Memory模式可以使用命令行选项--model-small或--model-large来指定,默认为Small Memory模式。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值