搜索
bottom↓
回复: 16

GCC中断函数中的指针

[复制链接]

出0入0汤圆

发表于 2007-11-19 15:07:56 | 显示全部楼层 |阅读模式
程序如下
SIGNAL(SIG_INTERRUPT5)
{uint buff;
  uchar *p=0x7018;
  ........
}
编译后提示 error: invalid conversion from `int' to `unsigned char*'
但在别的函数中这样写没问题,急

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-11-19 18:02:29 | 显示全部楼层
SIGNAL(SIG_INTERRUPT5)
{uint buff;
  uchar *p=(uchar*)0x7018;
  ........
}

出0入0汤圆

发表于 2007-11-19 19:52:06 | 显示全部楼层
楼上正解~
结果-》p 指向 0x0718字节型 地址空间;

出0入0汤圆

 楼主| 发表于 2007-11-19 23:18:32 | 显示全部楼层
谢谢一楼的解答
但这和c语言的指针初始化不一样哦


我用指针访问一个接口芯片的缓存区
#define  address *(uchar *)0x7018
   address=12;//编译通过
   buff=address;//编译不通过  
怎么回事?

出0入0汤圆

发表于 2007-11-20 00:33:38 | 显示全部楼层
我编译通过winavr20070525
#include <avr/io.h>
#include <avr/interrupt.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

SIGNAL(SIG_OVERFLOW0)  
{
  uint buff;  
  uchar *p=(uchar*)0x7018;  
#define  address *(uchar *)0x7018
   address=12;//编译通过
   buff=address;//编译通过   
}   
int main()
{
   return 0;
}

出0入0汤圆

 楼主| 发表于 2007-11-20 10:10:16 | 显示全部楼层
谢谢 shark

出0入0汤圆

 楼主| 发表于 2007-11-20 10:49:52 | 显示全部楼层
还想问一下  gcc中如何实现类似c中
uchar *p=address;
*p=0;
*(p+1)=1;
的地址加一的操作

出0入0汤圆

发表于 2007-11-20 12:10:55 | 显示全部楼层
gcc不也是c嘛,一样操作。

出0入0汤圆

 楼主| 发表于 2007-11-20 12:20:12 | 显示全部楼层
获取一个数组的首地址
uchar *p
p=&a[0];
编译时  warning: assignment discards qualifiers from pointer target type
请问如何解决

出0入0汤圆

发表于 2007-11-20 12:23:03 | 显示全部楼层
你的信息不完整,猜不出来,a[0]是什么类型?是如何定义的?

出0入0汤圆

 楼主| 发表于 2007-11-20 12:45:20 | 显示全部楼层
就是一个普通数组    uchar a[9]={......略.......}  保证没越界

出0入0汤圆

发表于 2007-11-20 13:14:46 | 显示全部楼层
我编译没有任何warning和errors,WINAVR20070525

#include <avr/io.h>
#include <avr/interrupt.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

uchar a[10]={1,2,3,4,5};
int main()
{
   uchar *p ;
   p = &a[0];
   PORTB = *p;
   return 0;
}

你如果还有问题,贴一下可重现故障的最小程序。

出0入0汤圆

 楼主| 发表于 2007-11-20 13:40:44 | 显示全部楼层
const prog_uchar EPDescr_Out_HS[7]=
   {           0x07,                           
        0x05,                                                               
        0x01,                                                            
        0x03,                                                                                0x00,                              
        0x02,                                                        
        0x02
   };

int main()
{uchar *p;
  uchar buff;
  p=&EPDescr_Out_HS[0];
  buff=*p;
  .............
}

出0入0汤圆

发表于 2007-11-20 15:49:49 | 显示全部楼层
prog_uchar 是存储在flash中的,不能用*p访问的,要用pgm_read_byte函数

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

prog_uchar EPDescr_Out_HS[7]=
   {           0x07,                             
        0x05,                                                                 
        0x01,                                                              
        0x03,                                                                                0x00,                              
        0x02,                                                         
        0x02
   };

int main()
{
     uchar buff;
     buff = pgm_read_byte(& EPDescr_Out_HS[0]);
}

出0入0汤圆

 楼主| 发表于 2007-11-20 15:55:42 | 显示全部楼层
一语惊醒梦中人,shark真高手也
有没有这方面的书,推荐一下,论坛上的书讲的不够详细,有的部分都没有

出0入0汤圆

发表于 2007-11-20 16:01:10 | 显示全部楼层
用GCC,务必要先看艺芯的《AVR单片机GCC程序设计》。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-22 19:35

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

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