标题:
问大家c51定义a为idata改成data程序运行和正常不一样,什么原因?
[打印本页]
作者:
jimjassdf
时间:
2018-6-29 22:51
标题:
问大家c51定义a为idata改成data程序运行和正常不一样,什么原因?
本帖最后由 jimjassdf 于 2018-6-30 12:02 编辑
问大家c51定义int idata a改成int a程序编译不出错,运行和正常不一样,什么原因?谢谢
作者:
deity0750
时间:
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 就可以了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1