找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2056|回复: 1
打印 上一主题 下一主题
收起左侧

问大家c51定义a为idata改成data程序运行和正常不一样,什么原因?

[复制链接]
跳转到指定楼层
楼主
ID:315153 发表于 2018-6-29 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jimjassdf 于 2018-6-30 12:02 编辑

问大家c51定义int idata a改成int a程序编译不出错,运行和正常不一样,什么原因?谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:279005 发表于 2018-12-19 15:13 | 只看该作者
人个经验:不建议使用idata,idata会使用SFR特殊功能寄存器0x80H~0xFF,因为这块通常用于中断与函数调用的堆栈,程序处理不好的话会有冲突,导致程序异常。

Keil C51 语言中的关键字,代表了 RAM 不同区域的划分

data:片内 RAM 从 0x00~0x7F
idata:片内 RAM 从 0x00~0xFF
pdata:片外 RAM 从 0x00~0xFF
xdata:片外 RAM 从 0x0000~0xFFFF


在 Keil 默认设置下, data 是可以省略的,即什么都不加的时候变量就是定义到 data 区域中的。 

data 区域 RAM 的访问在汇编语言中用的是直接寻址,执行速度是最快的。如果你定义成 idata,不仅仅可以访问 data 区域,还可以访问 0x80H~0xFF 的范围,但加了 idata 关键字后,访问的时候 51 单片机用的是通用寄存器间接寻址,速度较 data会慢一些。

而且我们平时大多数情况下不太希望访问到 0x80H~0xFF,因为这块通常用于中断与函数调用的堆栈, 所以在绝大多数情况下,我们使用内部 RAM 的时候,只用 data 就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表