OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5149|回复: 6

请教个c语言问题

[复制链接]

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
发表于 2014-5-4 11:55:01 | 显示全部楼层 |阅读模式

ApuResource *APU;  声明

#define APU_WRITEFUNC(name, evtype) \
void ApuWrite##name(WORD addr, BYTE value) \
{ \
  ApuEventQueue[APU->cur_event].time = APU->entertime - CPU->g_wPassedClocks; \
  ApuEventQueue[APU->cur_event].type = APUET_W_##evtype; \
  ApuEventQueue[APU->cur_event].data = value; \
  APU->cur_event++; \
}
APU_WRITEFUNC(C1a, C1A);
APU_WRITEFUNC(C1b, C1B);
APU_WRITEFUNC(C1c, C1C);
APU_WRITEFUNC(C1d, C1D);

APU_WRITEFUNC(C2a, C2A);
APU_WRITEFUNC(C2b, C2B);
APU_WRITEFUNC(C2c, C2C);
APU_WRITEFUNC(C2d, C2D);

APU_WRITEFUNC(C3a, C3A);
APU_WRITEFUNC(C3b, C3B);
APU_WRITEFUNC(C3c, C3C);
APU_WRITEFUNC(C3d, C3D);

APU_WRITEFUNC(C4a, C4A);
APU_WRITEFUNC(C4b, C4B);
APU_WRITEFUNC(C4c, C4C);
APU_WRITEFUNC(C4d, C4D);

APU_WRITEFUNC(C5a, C5A);
APU_WRITEFUNC(C5b, C5B);
APU_WRITEFUNC(C5c, C5C);
APU_WRITEFUNC(C5d, C5D);

APU_WRITEFUNC(Control, CTRL);
const ApuWritefunc pAPUSoundRegs[20] = 
{
  ApuWriteC1a,
  ApuWriteC1b,
  ApuWriteC1c,
  ApuWriteC1d,
  ApuWriteC2a,
  ApuWriteC2b,
  ApuWriteC2c,
  ApuWriteC2d,
  ApuWriteC3a,
  ApuWriteC3b,
  ApuWriteC3c,
  ApuWriteC3d,
  ApuWriteC4a,
  ApuWriteC4b,
  ApuWriteC4c,
  ApuWriteC4d,
  ApuWriteC5a,
  ApuWriteC5b,
  ApuWriteC5c,
  ApuWriteC5d,
};


调用语句
pAPUSoundRegs[ wAddr & 0x1f ]( wAddr, byData );

结构体
typedef struct
{
    int  cur_event;
    WORD entertime;
    BYTE ApuCtrl;
}ApuResource;
typedef struct
{
  long time;
  BYTE type;
  BYTE data;
}ApuEvent;


问题:这种结构的执行流程?在确定 wAddr & 0x1f的值后怎么展开单独调用
pAPUSoundRegs[ wAddr & 0x1f ]( wAddr, byData )改成xxxx( wAddr, byData )该怎么改?真心请教,谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-4 13:27:05 | 显示全部楼层
调用语句
pAPUSoundRegs[ wAddr & 0x1f ]( wAddr, byData );
跟前面有关系?


结构体是编译的时候直接分配好空间的,是告诉编译软件这是一段连续的空间,每个地址的类型跟长度各是什么,不存在啥执行流程吧?
回复 支持 反对

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
 楼主| 发表于 2014-5-4 13:50:05 | 显示全部楼层
回复【2楼】聚东风:
---------------------------------
谢谢你的回复
主要是不明白
#define APU_WRITEFUNC(name, evtype) \
void ApuWrite##name(WORD addr, BYTE value) \
{ \
  ApuEventQueue[APU->cur_event].time = APU->entertime - CPU->g_wPassedClocks; \
  ApuEventQueue[APU->cur_event].type = APUET_W_##evtype; \
  ApuEventQueue[APU->cur_event].data = value; \
  APU->cur_event++; \
}
这种结构
WORD addr这个参数没用吗?双#在这里是什么意思
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-5-4 14:03:42 | 显示全部楼层
回复【3楼】ye781205:
---------------------------------
你这函数没用到,双##,你可以百度下,这个比较少用,不过最近看龙元的h.264解码,里面也有这个东西
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-5-4 14:29:41 | 显示全部楼层
回复【3楼】ye781205:
---------------------------------
双## 是连接符, 

举个例子 ,
#define A(x) TEST##x

程序中,  就可以用 A(2) 代替 TEST2了


 上面例子中 ,宏定义, APU_WRITEFUNC(name, evtype) 是函数定义。

定义了 从ApuWriteC1a ->ApuWriteC5d 这么多的函数。[## 直接替换name内容]

 

回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-5-4 14:37:58 | 显示全部楼层
下面  是函数指针 的 数组,

pAPUSoundRegs[n](...);
选择第n个函数, 

分别对应上面几个函数定义的内容。
回复 支持 反对

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
 楼主| 发表于 2014-5-4 14:38:19 | 显示全部楼层
明白了,谢谢楼上所有热心人的回答
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-10 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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