keil c51中的data idata xdata code详解

51单片机采用哈佛结构。内存空间编址有重叠。可以在不同总线(本文称其为总线域,简称域)上定义不同的变量。在keilc51中定义了data idata xdata code几种域修饰符。这些修饰符决定了变量访问方式。
data:用mov直接访问的内部RAM
idata:用mov @间接访问的内部RAM
xdata:用movx访问的外部RAM
code:用movc访问的rom

这些假定以上以及类型为where。数据类型为type。


干货:
变量(包括指针)默认存储在data中。指针能够智能的指向所有的域。
指定变量(包括指针)在某个域时,域修饰符写在变量类型后面。type where value,type* where point。
想让指针只能指向某个域type where* point
指定指针的域并指定指针本身的存储域 type where* where point
const写在前面const type where* where point
声明struct类型不用where。定义变量时候用。struct变量不能跨域。


以下是干货来源
一下是实验结果
type value :data中的变量
where type value :where中的变量
type where value :where中的变量
where type where value 是的,没错,这种神经病写法也是在where中的变量
type * point data中的跨域指针,
where type * point 存储在where中的跨域指针
type * where point 存储在where中的跨域指针
where type * where point 这种更神经病的写法也是存储在where中的跨域指针
type where* point 存储在内部RAM中只能指向where的指针
where type where* point 存储在where中指向where的指针
type where* where point 存储在where中指向where的指针

很乱是吧?我们整理一下


聪明的同学已经发现规律了,是不是?
作为c不得不提的一种变量——指针。keil c51中还存在一个指针,这个指针实际上是sizeof(type*) + 1的。有一个字节来存储指针指向的区域。访问*point时对于不同区域的数据使用不同的指令。也就是说这中指针可以访问所有的总线。暂且称其跨域指针。

既然指针也是变量“指向什么东西”是指针变量的类型。那么互忽略类型,把这些写法调换顺序。

发现规律了么?data,idata,xdata,code可以在类型前,也可以在类型之后,或者前后都有。
定义变量时,c类型最前面最着最后面添加(或者前后都有)总线域修饰符,可以决定该变量存储的位置。前后都不加,默认是
data。
我们在单独关心一下指针。

发现规律了么?type *是可以指向任何区域的指针。决定指针指向位置时候域修饰符必须在type和*之间。
至于const struct,呵呵自己试试就知道了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值