先来看个重定义:
typedef int(*CallBack)(char *p)
重定义的解释:
1.*CallBack:CallBack是一个指针
2.(*CallBack)():指向一个函数
3.(*CallBack)(char *p):这个函数有一个参数,类型为char*
4.int(*CallBack)(char *p):这个函数有一个返回值,类型为int
最终:CallBack是一个指针,指向具有一个char*类型参数,且返回一个int型数据的函数
前面有个typedef,所以现在CallBack是这种类型的别名
如何用:
int func(char *p){
...
}
...
CallBack my_callback1 = func;//OK
CallBack my_callback2 = &func;//OK
言归正传:
再看
typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp)
err_t 就是 int8_t 也就是8位的---一个字节大小的一个int型的数据类型
这句代码就很明显了:
1.*netif_input_fn:netif_input_fn是函数指针
2.(*netif_input_fn)():指向一个函数
3.(*netif_input_fn)(struct pbuf *p, struct netif *inp)有两个参数分别是 *p和*inp
4.err_t :函数返回值是8位的一个int型的变量
继续往下挖:
LWIP源代码中是这样使用它的,上代码
struct netif {
……
netif_input_fn input;
……
}
调用的时候:
if (netif->input(p, netif) != ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
else
{
xSemaphoreTake( s_xSemaphore, 0);
goto TRY_GET_NEXT_FRAGMENT;
}
即netif->input(p, netif)
现在的问题:为何调用netif->input()就会运行函数tcpip_input()?
每次开机跑起来程序都要先TCPIP_Init(),代码如下:
void TCPIP_Init(void){
……
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
……
}
重点关注函数netif_add()的第七个参数,也就是最后一个参数
给出函数netif_add()
struct netif *netif_add( struct netif *netif,
const ip4_addr_t *ipaddr,
onst ip4_addr_t *netmask,
const ip4_addr_t *gw,
void *state,
netif_init_fn init,
netif_input_fn input)
{
……
netif->input = input;
……
}
至此,也就解决了为何调用netif->input()就会运行函数tcpip_input()的问题!
在最后继续:
给出tcpip_input()代码
err_t tcpip_input(struct pbuf *p, struct netif *inp)
{
#if LWIP_ETHERNET
if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
return tcpip_inpkt(p, inp, ethernet_input);
} else
#endif /* LWIP_ETHERNET */
return tcpip_inpkt(p, inp, ip_input);
}
至此,本文也就完全解释了(*input)() -> tcpip_input() -> tcpip_inpkt()这个过程!