首页 新闻资讯 技术资料 论坛 网站地图
接口电路 传感控制 安防产品 CPLD/FPGA AD/DA IC设计 嵌入式软件
电子元器件搜索:
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
维库电子市场网是知名的电子元器件交易网站, 为电子生产企业提供IC库存和技术资料查询服务。
位置: 首页 > 详细信息
  请教LWIP中err_t lwip_tcp_event()函数为什么没定义?
出处:21ic 时间: 2007-10-26
yanyunsong 发布于 2007-10-26 9:38:00

最近闲来没事,在看LWIP,是uc/os版本的,在应用程序线程和TCP/IP线程的交互方面,有个疑问,望大家指点迷津:
在opt.h中,定义了
#ifndef LWIP_EVENT_API
#define LWIP_EVENT_API                  0
#define LWIP_CALLBACK_API               1
#else
#define LWIP_EVENT_API                  1
#define LWIP_CALLBACK_API               0
#endif

也就是说,应用程序应该有两种方式和协议栈通讯, 在tcp.h中,定义了对应于这两种方式的进程间通信宏定义:

#if LWIP_EVENT_API

enum lwip_event {
  LWIP_EVENT_ACCEPT,
  LWIP_EVENT_SENT,
  LWIP_EVENT_RECV,
  LWIP_EVENT_CONNECTED,
  LWIP_EVENT_POLL,
  LWIP_EVENT_ERR
};

err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
         enum lwip_event,
         struct pbuf *p,
         u16_t size,
         err_t err);

#define TCP_EVENT_ACCEPT(pcb,err,ret)    ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
                LWIP_EVENT_ACCEPT, NULL, 0, err)
#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
                   LWIP_EVENT_SENT, NULL, space, ERR_OK)
#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
                LWIP_EVENT_RECV, (p), 0, (err))
#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
                LWIP_EVENT_CONNECTED, NULL, 0, (err))
#define TCP_EVENT_POLL(pcb,ret)       ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
                LWIP_EVENT_POLL, NULL, 0, ERR_OK)
#define TCP_EVENT_ERR(errf,arg,err)  lwip_tcp_event((arg), NULL, \
                LWIP_EVENT_ERR, NULL, 0, (err))
#else /* LWIP_EVENT_API */
#define TCP_EVENT_ACCEPT(pcb,err,ret)     \
                        if((pcb)->accept != NULL) \
                        (ret = (pcb)->accept((pcb)->callback_arg,(pcb),(err)))
#define TCP_EVENT_SENT(pcb,space,ret) \
                        if((pcb)->sent != NULL) \
                        (ret = (pcb)->sent((pcb)->callback_arg,(pcb),(space)))
#define TCP_EVENT_RECV(pcb,p,err,ret) \
                        if((pcb)->recv != NULL) \
                        { ret = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err)); } else { \
                          if (p) pbuf_free(p); }
#define TCP_EVENT_CONNECTED(pcb,err,ret) \
                        if((pcb)->connected != NULL) \
                        (ret = (pcb)->connected((pcb)->callback_arg,(pcb),(err)))
#define TCP_EVENT_POLL(pcb,ret) \
                        if((pcb)->poll != NULL) \
                        (ret = (pcb)->poll((pcb)->callback_arg,(pcb)))
#define TCP_EVENT_ERR(errf,arg,err) \
                        if((errf) != NULL) \
                        (errf)((arg),(err))
#endif /* LWIP_EVENT_API */


可是,我在整个工程程序中,找不到:
err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
         enum lwip_event,
         struct pbuf *p,
         u16_t size,
         err_t err);
函数的实现在什么地方,望各位给点思路?
 


dld2 发布于 2007-10-26 9:57:00
被协议栈调用,由应用实现。应用程序就在这个函数里处理这些事件。


yanyunsong 发布于 2007-10-26 10:06:00
楼上的意思就是说它是回调函数了。协议栈已经帮我们定义了宏LWIP_CALLBACK_API
下的种种消息处理函数,不知道它又提供LWIP_EVENT_API这样的接口,意义何在?


armecos 发布于 2007-10-26 10:49:00
不带OS时采用回调函数的方式
带OS时采用事件驱动方式
www.armecos.com自助商城有详细文档图片讲解lwip架构。


yanyunsong 发布于 2007-10-26 11:16:00
谢过armecos,你的商城我去过了啊!
总结上面两位的高见:我妄测:

LWIP_EVENT_API:从宏名来看,应对应于事件驱动(带操作系统),其实是对应于不带操作系统下的回调函数,函数
err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
         enum lwip_event,
         struct pbuf *p,
         u16_t size,
         err_t err);
就是用户自己要完成编写的回调函数;

LWIP_CALLBACK_API:从宏名来看,应对应于回调函数驱动(不带操作系统),其实却是带操作系统下的事件驱动方式。


对LWIP结构没搞通,暂时这么理解吧,等搞清了再发! 


关闭】 【打印
相关专题  
嵌入式软件
工业控制
软件开发
传感控制
SOPC
应用产品
嵌入式开发新闻
开发工具
测试测量
医疗电子
数控系统
嵌入式硬件
军工/航空航天
存储器
汽车电子
IC设计
CPLD/FPGA
通信产品
计算机外设
消费电子
综合电子技术
AD/DA
接口电路
电源系列
安防产品

© 2007 百斯嵌入式开发网 网站地图