OpenEdv-开源电子网

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

请问LWIP中的回调函数怎样传递参数

[复制链接]

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2016-12-22 20:53:19 | 显示全部楼层 |阅读模式
10金钱
在函数IAP_httpd_init();中调用了函数:tcp_accept(pcb, http_accept);
在函数http_accept();中调用了函数:tcp_recv(pcb, http_recv);

最后一个回调函数的部分代码如下:
static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t err)
{
  int32_t i,len=0;
  uint32_t DataOffset, FilenameOffset;
  char *data, *ptr, filename[13], login[LOGIN_SIZE], logina[LOGINA_SIZE];
  struct fs_file file = {0, 0};
  struct http_state *hs;
  
  hs = arg;
。。。。。。。
}


那么请问:arg这个参数是哪里传来的呢?

在网上搜索回调函数的资料,似乎都没有明确讲解过回调函数参数传递的问题。
唯有下面网址的文档提到了这个问题,但是只给出了编译结果,没有从C语言的原理方面作出解释。

另外一个问题是“注册回调函数”中的“注册”怎么理解呢?从实验现象来看,似乎只要以太网收到了有效数据就会触发回调函数。但是以我有限的C语言知识无法理解这段在程序初始化的时候写下的代码是怎么在程序初始化完成之后被“触发的”。







1.PNG
2.PNG
3.PNG
1.JPG
2.JPG
3.JPG
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
 楼主| 发表于 2016-12-22 20:54:39 | 显示全部楼层
http://www.docin.com/p-704390500.html
网址忘记发了,图片本不想传,可能由于网速卡没删掉。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2016-12-22 20:59:16 | 显示全部楼层
还是好好学习下C语言吧  ,回调函数是经常会用到的。
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
 楼主| 发表于 2016-12-22 21:07:52 | 显示全部楼层
jiaozhu 发表于 2016-12-22 20:59
还是好好学习下C语言吧  ,回调函数是经常会用到的。

不明白你的回复用意何在,难道是这个问题过于简单不值得回答?连一个方向也不指引给我。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
发表于 2017-7-10 15:28:30 | 显示全部楼层
楼主这个问题搞清楚了吗。。。我这里也很困惑
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
 楼主| 发表于 2017-7-11 19:21:55 | 显示全部楼层
wrnb11 发表于 2017-7-10 15:28
楼主这个问题搞清楚了吗。。。我这里也很困惑

这个问题我也搁置下来了。不过最近看UCOSIII的回调函数写法比较典型,也比较容易理解,你可以看看软件定时器部分的源码。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
发表于 2017-7-11 21:56:11 | 显示全部楼层
XUZJWWSZ 发表于 2017-7-11 19:21
这个问题我也搁置下来了。不过最近看UCOSIII的回调函数写法比较典型,也比较容易理解,你可以看看软件定 ...

好的,谢谢楼主的建议哈哈
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-28
在线时间
16 小时
发表于 2017-7-13 23:37:18 | 显示全部楼层
XUZJWWSZ 发表于 2017-7-11 19:21
这个问题我也搁置下来了。不过最近看UCOSIII的回调函数写法比较典型,也比较容易理解,你可以看看软件定 ...

楼主,我找到回调函数参数传入的地方了!!
udp_input()函数中一的句代码

if (pcb->recv != NULL) {
    /* now the recv function is responsible for freeing p */
    pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src), src);   //回调函数的参数从这里传入
}
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
 楼主| 发表于 2017-7-14 17:36:46 | 显示全部楼层
wrnb11 发表于 2017-7-13 23:37
楼主,我找到回调函数参数传入的地方了!!
udp_input()函数中一的句代码

君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
 楼主| 发表于 2017-8-15 18:25:04 | 显示全部楼层
wrnb11 发表于 2017-7-13 23:37
楼主,我找到回调函数参数传入的地方了!!
udp_input()函数中一的句代码

我也随便找到了一处:
pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
和你找到那个不太一样,至此我也明白了,其实我们注册了回调函数之后,内核在调用回调函数的时候到底传什么样的参数给它LWIP的作者说了算,而我们以前太执着于C语言语法了。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

1

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2018-11-7
在线时间
16 小时
发表于 2018-11-14 00:45:58 | 显示全部楼层
帮顶   
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
发表于 2020-2-3 14:57:47 | 显示全部楼层
在你的倒数第二章截图中 tcp_arg(pcb, hs); 这里就是注册回调函数的arg参数啊 hs这个结构就是将要发送的数据包 注册的回调函数里面会共用这个结构。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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