打印
[IoT技术交流]

一分钟了解8051的RAM如何分布和使用

[复制链接]
1500|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

1.RAM分布
8051的RAM有片内和片外之分,片内又分为直接寻址和间接寻址。片外称之为xdata,片内直接寻址称之为data,片内间接寻址称之为idata。
data:   指片内0x00-0x7F的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:  指片内0x00-0xFF的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。
xdata: 指片外0x0000-0xFFFF空间。

下图以N76E003的1KB RAM(片内256B+片外768B)来说明data、idata和xdata是如何分布的:
                                         



2.如何在代码里指定变量存放的位置
下图以IAR和keil为例,就是在正常申明变量时加上红色部分关键字就可以指定变量在RAM中存放的位置。
注意:IAR的关键字前是两个下划线


问题来了那么不加关键字变量是存放在哪里呢?那就取决于你的工程配置了。

下图是keil的配置在Memory Model那项选择
Small:     变量默认存放在data区
Compact:变量默认存放在pdata区,pdata是什么呢?其实就是xdata的0x00-0xFF区域
Large:   变量默认存放在xdata区



下图是IAR的配置在Data Model那项选择
Tiny:       变量默认存放在data区
Small:     变量默认存放在idata区
Large:     变量默认存放在xdata区
Generic:变量默认存放在xdata区
至于Far选项是地址超过0xFFFF才会用到,感兴趣的可以自行查阅IAR C/C++ Compiler User Guide for the 8051



最后再说下变量要用到idata的高128字节不要忘记将STARTUP.A51中IDATALEN的改成100H

使用特权

评论回复
沙发
liuje| | 2020-11-11 11:50 | 只看该作者
很詳細, 很實用,  謝謝.

使用特权

评论回复
板凳
函数不想导| | 2020-11-11 23:20 | 只看该作者
适合入门的人看看 不过我多少也了解些了 顶顶

使用特权

评论回复
地板
氧化二氢| | 2020-11-11 23:27 | 只看该作者
最后那个提醒挺及时的 之前没改IDATALEN就报错了

使用特权

评论回复
5
尼罗河L| | 2020-11-11 23:32 | 只看该作者
原来是这么分布的 用的时候稀里糊涂并没有细究

使用特权

评论回复
6
isageko| | 2020-11-11 23:35 | 只看该作者
不错的分享 学习到了

使用特权

评论回复
7
guanjiaer| | 2020-12-4 08:27 | 只看该作者
总是分不清楚这些地址

使用特权

评论回复
8
heimaojingzhang| | 2020-12-4 08:33 | 只看该作者
从学习单片机那天起就学过这  但是现在也不知道怎么用

使用特权

评论回复
9
keaibukelian| | 2020-12-4 08:35 | 只看该作者
只要是51的核  基本上都可以这么理解 是吗

使用特权

评论回复
10
labasi| | 2020-12-4 08:37 | 只看该作者
这种东西不用背下来吧

使用特权

评论回复
11
paotangsan| | 2020-12-4 08:39 | 只看该作者
只要用到idata字段就需要改动地址吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2034

主题

7329

帖子

10

粉丝