vvviorivvv 发表于 2008-5-8 21:37:42

请教icc中的指针类型!!!小弟在线等啊!!!谢谢各位小弟很急啊!!!

icc教程讲定义char *p类型的指针是位于数据存储空间指向数据存储空间的通用指针类型变量,我想请问他是否可以指向片外的数据存储空间?它和形如#define       REG_CONTROL*(volatile unsigned char *)0x8000)的强制类型的指针变量有什么区别?谢谢各位了!如果一样哪么是否可以这样赋值!p=REG_CONTROL,哪么我在访问片外数据空间时是否可以直接用p=0x11(随便的一个数据)这样的语句给REG_CONTROL这个片外数据空间赋值?谢谢各位小弟很急!

computer00 发表于 2008-5-8 21:49:42

强制转换的指针跟实际的指针没什么区别的。可以直接使用。
#defineREG_CONTROL_BASE(volatile unsigned char *)0x8000)

REG_CONTROL_BASE访问地址0x8000,REG_CONTROL_BASE,访问地址0x8001。

当然你也可以换成short int、long int等等类型的,这样的话一次就访问2字节、四字节。

REG_CONTROL_BASE还可以用在循环语句中。

mirrorok 发表于 2008-5-8 21:49:56

写个测试程序不就知道了吗?
把指针和指针指向的内容通过PRINTF打印就看到了 !!

vvviorivvv 发表于 2008-5-8 22:03:24

谢谢楼上二位,我的意思是如果我定义了char型的指针根据icc的说明它是否可以指向REG_CONTROL,根据标准的c语言char型的
指针是不能指向REG_CONTROL的啊,REG_CONTROL这个指针存了两个字节啊!

vvviorivvv 发表于 2008-5-8 22:42:07

高手都睡觉了吗!郁闷啊!

gingin 发表于 2008-5-8 23:00:11

#define       REG_CONTROL(*(volatile unsigned char *)0x8000)
&REG_CONTROL才表示地址。avr中指针都是2个字节的。

computer00 发表于 2008-5-9 01:13:39

晕,char *中的char修饰的指针指向的对象是char型的,而不是指针本身。对指针本身的修饰要放在后面。

vvviorivvv 发表于 2008-5-9 08:08:52

谢谢!5楼6楼的意见似乎不一样啊!那位给各正解啊!

ATmega32 发表于 2008-5-9 08:27:02

1.类似KEIL的方法
#define XBYTE ((volatile unsigned char *)0)
用XBYTE,XBYTE,XBYTE,…………

2.用首地址加指针访问。
#define         CONTROL       (*(volatile unsigned char *)0x8000)
volatile unsigned char *p=&CONTROL;
p,p,p,…………

个人看法,如果是i/o设备端口,需要用volatile,
如果是片外RAM,没有必要加上volatile。
如果用IAR或者GCC,直接定义一个外部RAM段,然后把变量定义到这个段里面就行了。

computer00 发表于 2008-5-9 10:06:24

晕...6楼是跟3楼的意见不一致...

你的意思好象是char型的指针只有一个字节似的?指针是一个地址,
它的长度是固定的,而char修饰的是所指向的类型是一个字节的长度,
不是修饰这个指针的长度是一个字节!

vvviorivvv 发表于 2008-5-9 12:01:02

刚刚找到的资料!


以前看到#define SREG    (*(volatile unsigned char *)0x5F)
这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~

   嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x5F,
   第一步是要把它强制转换为指针类型
(unsigned char *)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向
unsigned char类型。
   volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
   第二步,对指针变量解引用,就能操作指针所指向的地址的内容了
   *(volatile unsigned char *)0x5F
   第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以#define SREG    (*(volatile unsigned char *)0x5F)

    类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR   (*(volatile unsigned long*)0x0000555F)
    然后就可以用C语言对这个内存地址进行读写操作了
    读:tmp = RAM_ADDR;
    写:RAM_ADDR = 0x55;

taocongrong 发表于 2012-10-24 11:57:01

页: [1]
查看完整版本: 请教icc中的指针类型!!!小弟在线等啊!!!谢谢各位小弟很急啊!!!