在中断函数里面有一段
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 编辑 ]
此帖出自
小平头技术问答
我自己定义的一个函数指针,编译没有问题,但是主程序里面我加入这个初始化的函数就跑飞了。
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都是子函数的函数名,是无参数的子函数。
望高手分析下,我的这个指针是定义以后初始化,而例程的是定义的时候就初始化好了。是不是这里有问题?
一周热门 更多>