keil c51的指针与存储类型

一:c51的存储类型

在讲c51的指针前,先弄清楚c51的存储类型:
c51存储类型有:code,data,bdata,idata,pdata,xdata

片内ROM部分:
code:8051的只读存储器,程序代码保存的地方
片内RAM部分:
data:固定指前面0x00-0x7f的128个字节RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个字节RAM,其中前128和data的128完全相同,只是因为访问的方式不同,只能使用间接寻址访问;
bdata:固定为data的0X20–0X2F那一段,可位寻址访问。

片外RAM部分:
xdata:片外RAM全部64K空间,0x0000-0xffff,可用DPTR16位指针间接寻址。
pdata:片外xdata的0X00–0XFF那一段,使用R0,R1间接寻址,这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

startup.a51的作用,和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char dATa xxx=“100”;,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。

有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。

二:c51的指针

指针类型和存储区的关系:
对变量进行声明时可以指定变量的存储类型如:
uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。

同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的
使用如:

uchar xdata * data pstr

是指在data区分配一个指针变量("*"号后的data关键字的作用,说明指针存放在哪里),而且这个指针本身指向xdata区("*"前xdata关键字的作用,说明指针指向的变量存放在哪里)

1 普通指针:未指定指针指向
char * ptr; //指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节

char * xdate ptr; //指针存储在片外
char * idate ptr; //指针存储在片内

指针指向的数据可以是片内也可以是片外,由于片外数据地址在0x0000-0xffff之间,片内数据地址在0x00-0xff之间,在未指定数据存储在片内还是片外的情况下,指针长度按固定3个字节:一字节标识存储类型+ 一字节高位地址+ 一字节低位地址。

2 内存特殊指针:指定指针指向

char xdate * ptr;

//在指定指针指向之后,指针就只需要表明地址即可,指针为1个字节或2个字节( one byte (idata, data, bdata, and pdata pointers) or two bytes (code and xdata pointers)),xdate是修饰 *的,也就是数据存储在片外,此时ptr占两个字节

char idate * ptr;//数据是片内,指针ptr只有一个字节
char xdate * date ptr; //指针存放在片内,数据在片外,指针为2个字节

总结:内存特殊指针比一般指针运行快,因为数据存储位置知道,编译时可以优化 指针类型可以转换,但容易出错。所以编程时最好对数据和对指针的修饰都要。

3 指针的绝对地址赋值

char xdata * XROM;
XROM=(char xdata *)0xB012;//指针XROM的值就是0xB012,(char xdata *)表示强制类型转换
XROM=‘r’;//给0xB012的地址内容赋值r
a=
((char xdata *)0xB012);//等同于a=*XROM,此时a=‘r’

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值