4857|2

14

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

lpc1343的USB源码问题 [复制链接]

在中断函数里面有一段

if (USB_P_EP[0]) {
         USB_P_EP[0](USB_EVT_SETUP);
         continue;

}

原型在下面:

#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)

/* USB Endpoint Events Callback Pointers */
void (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {
  P_EP(0),
  P_EP(1),
  P_EP(2),
  P_EP(3),
};

寻高人解释下。

----------------------------------

好好分析了一下:

void (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {
  P_EP(0),
  P_EP(1),
  P_EP(2),
  P_EP(3),
};这个我知道是结构体函数指针,他指向的应该是4个逻辑端点中断处理函数的地址。

 

那么里面的

#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)

就应该是指向函数的指针,这个宏是一个判断语句。

主要还是这个USB_EndPoint##n 不知道什么含义。

 

结合上下文的意思。个人觉得就是也是一个MDK预处理类的命令。

编译的时候USB_EndPoint##n 就相当于USB_EndPointn。 (n编译的时候带入前面的数字)

 

 

 

不知道上面的理解对不对。

[ 本帖最后由 443799600 于 2010-6-7 14:07 编辑 ]
此帖出自NXP MCU论坛

最新回复

USB_EndPoint##n中##是连接符,例如:当n = 2时,USB_EndPoint##n,就是USB_EndPoint2#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)这个宏定义中,USB_EP_EVENT宏 表示打开了哪几个端点。如果打开了端点2就有一个端点函数USB_EndPoint2,否则就是一个空的函数NULL。如果将USB_EP_EVENT定义为0x05,那么void (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {  P_EP(0),  P_EP(1),  P_EP(2),  P_EP(3),};就是oid (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {  USB_EndPoint0,  NULL,  USB_EndPoint2,  NULL,};  详情 回复 发表于 2011-10-26 09:47
点赞 关注
 

回复
举报

14

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

我自己定义的一个函数指针,编译没有问题,但是主程序里面我加入这个初始化的函数就跑飞了。

 

void (*call_fkt_[256])(void);

void initCommands(void)
{
    u16 count=0;
    currentSession = 0;

    for (count=0; count < 0x0100; count++)
    {
        call_fkt_[count] = callWrongCommand;
    }

    call_fkt_[OUT_FIRM_HARDW_ID] = callHardwareID; //#define OUT_FIRM_HARDW_ID       0x10
    call_fkt_[OUT_INVENTORY_ID] = callInventory;               //#define OUT_INVENTORY_ID        0x31
}
//callWrongCommand、callHardwareID、callInventory都是子函数的函数名,是无参数的子函数。


望高手分析下,我的这个指针是定义以后初始化,而例程的是定义的时候就初始化好了。是不是这里有问题?

此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
USB_EndPoint##n中##是连接符,例如:当n = 2时,USB_EndPoint##n,就是USB_EndPoint2

#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)
这个宏定义中,USB_EP_EVENT宏 表示打开了哪几个端点。如果打开了端点2就有一个端点函数
USB_EndPoint2,否则就是一个空的函数NULL。

如果将
USB_EP_EVENT定义为0x05,那么
void (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {
  P_EP(0),
  P_EP(1),
  P_EP(2),
  P_EP(3),
};
就是
oid (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {
  USB_EndPoint0,
  NULL,
  USB_EndPoint2,
  NULL,
};
此帖出自NXP MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表