搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-5-8 21:49:42 | 显示全部楼层
强制转换的指针跟实际的指针没什么区别的。可以直接使用。
#define  REG_CONTROL_BASE  (volatile unsigned char *)0x8000)

REG_CONTROL_BASE[0]访问地址0x8000,REG_CONTROL_BASE[1],访问地址0x8001。

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

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

出0入0汤圆

发表于 2008-5-8 21:49:56 | 显示全部楼层
写个测试程序不就知道了吗?
把指针和指针指向的内容通过PRINTF打印就看到了 !!

出0入0汤圆

 楼主| 发表于 2008-5-8 22:03:24 | 显示全部楼层
谢谢楼上二位,我的意思是如果我定义了char型的指针根据icc的说明它是否可以指向REG_CONTROL,根据标准的c语言char型的
指针是不能指向REG_CONTROL的啊,REG_CONTROL这个指针存了两个字节啊!

出0入0汤圆

 楼主| 发表于 2008-5-8 22:42:07 | 显示全部楼层
高手都睡觉了吗!郁闷啊!

出0入0汤圆

发表于 2008-5-8 23:00:11 | 显示全部楼层
#define       REG_CONTROL  (*(volatile unsigned char *)0x8000)
&REG_CONTROL才表示地址。avr中指针都是2个字节的。

出0入0汤圆

发表于 2008-5-9 01:13:39 | 显示全部楼层
晕,char *中的char修饰的指针指向的对象是char型的,而不是指针本身。对指针本身的修饰要放在后面。

出0入0汤圆

 楼主| 发表于 2008-5-9 08:08:52 | 显示全部楼层
谢谢!5楼6楼的意见似乎不一样啊!那位给各正解啊!

出0入0汤圆

发表于 2008-5-9 08:27:02 | 显示全部楼层
1.类似KEIL的方法
#define XBYTE ((volatile unsigned char *)0)
用XBYTE[0x8000],XBYTE[0x8001],XBYTE[0x8002],…………

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

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

出0入0汤圆

发表于 2008-5-9 10:06:24 | 显示全部楼层
晕...6楼是跟3楼的意见不一致...

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

出0入0汤圆

 楼主| 发表于 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;
头像被屏蔽

出0入0汤圆

发表于 2012-10-24 11:57:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 01:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表