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,呵呵自己试试就知道了。
上一篇:#51单片机#定时器
下一篇:c51中bdata是什么意思及使用方法
推荐阅读
史海拾趣
[摘要]新加坡正计划推动一项RFID(射频识别)技术,以实现零售物品的标签电子化,按照有关报道,新加坡将于2006年将这项技术普及于制造业、物流业、零售业、基础设施与药剂业。预计涉及金额高达1000万新元。新加坡正计划推动一项RFID(射频识别)技术, ...… 查看全部问答∨ |
|
现在要想在SEED-dec138里面跑一个图片jpeg处理算法,已经有matlab代码了,不知道怎么实现比较好?主要是从sd卡里面读出Jpeg然后进行处理,LCD显示出一些参数。 问了技术员,如果Qt的话要进行移植,比较麻烦 minigui的话不是太清楚 大家 ...… 查看全部问答∨ |
|
在低功耗应用中,系统的功耗除了和频率相关之外,和电源电压的高低也息息相关,电源电压越低,系统功耗越小。MSP430系列MCU的工作电压范围为 1.8 ~ 3.6V,在有ADC的应用场合,则最少需要2.4V的电压。然而最常用的供电电池,大部分都是3V 或 3.6V 或 ...… 查看全部问答∨ |