硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2256|回复: 21
收起左侧

[ThreadX全家桶] 终于搞明白ThreadX NetXDUO的TCP Socket数据包申请和释放问题

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-12-25 00:22:54 | 显示全部楼层 |阅读模式

1、函数nx_tcp_socket_receive 会申请一个NX_PACKET数据包用于接收,如果用户不使用了必须使用函数nx_packet_release释放。
2、使用函数nx_tcp_socket_send必须有申请好的NX_PACKET数据包,可以使用函数nx_packet_allocate申请,也可以使用nx_tcp_socket_receive申请的。

特别要注意的地方来了,函数nx_tcp_socket_send调用后会释放nx_packet_allocate或者nx_tcp_socket_receive申请的数据包。无需用户再去调用函数nx_packet_release释放。






回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2021-12-25 15:17:37 来自手机 | 显示全部楼层
研究的真细
回复

使用道具 举报

24

主题

119

回帖

191

积分

初级会员

积分
191
发表于 2021-12-25 19:25:37 来自手机 | 显示全部楼层
好像是收发不一样,接收成功释放,发送不成功释放。
回复

使用道具 举报

24

主题

119

回帖

191

积分

初级会员

积分
191
发表于 2021-12-25 19:26:33 来自手机 | 显示全部楼层
好像是收发不一样,接收成功释放,因为user还得用,用完自己释放。发送不成功释放,如果成功,后台就给你释放了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2021-12-25 20:13:01 | 显示全部楼层
yxydoctor 发表于 2021-12-25 19:26
好像是收发不一样,接收成功释放,因为user还得用,用完自己释放。发送不成功释放,如果成功,后台就给你释 ...

这周准备发一章TCP客户端的例子,反复测试了下才整明白。我把发送数据包和接收数据包分开分别处理了。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2021-12-25 22:12:25 | 显示全部楼层
NetXDuo的UDP通信也是一样的,使用 nx_packet_allocate(&AppPool, &data_packet, NX_UDP_PACKET, TX_WAIT_FOREVER)
来申请一个packet,然后使用nx_packet_data_append(data_packet, (VOID *)sendVal, sizeof(sendVal), &AppPool, TX_WAIT_FOREVER)
来更新数据,这个API有意思了,数据超过一个Packet的空间,他里面会继续申请,省的你来计算了。
回复

使用道具 举报

23

主题

211

回帖

280

积分

高级会员

积分
280
发表于 2022-11-14 22:19:35 | 显示全部楼层
那如果在函数nx_tcp_socket_receive 处不是无限等待,是不是每次超时了出来的时候,也要主动释放一次NX_PACKET数据包?
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2022-11-15 08:57:22 | 显示全部楼层
blackfire531 发表于 2022-11-14 22:19
那如果在函数nx_tcp_socket_receive 处不是无限等待,是不是每次超时了出来的时候,也要主动释放一次NX_PAC ...

不用的,失败的时候应用程序并没有获得数据包,所以不用释放
回复

使用道具 举报

23

主题

211

回帖

280

积分

高级会员

积分
280
发表于 2022-11-15 11:18:37 | 显示全部楼层
catro 发表于 2022-11-15 08:57
不用的,失败的时候应用程序并没有获得数据包,所以不用释放

收完之后如果不使用之前的packet做回环发送回去,就需要手动调用nx_packet_release()函数释放数据包,不然收几次之后线程就挂了。
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2022-11-16 09:00:16 | 显示全部楼层
blackfire531 发表于 2022-11-15 11:18
收完之后如果不使用之前的packet做回环发送回去,就需要手动调用nx_packet_release()函数释放数据包, ...

可能我们的理解有点不同,我理解你说的超时了出来是指nx_tcp_socket_receive的返回值是非0,这个时候packet_ptr是指向空的,如果调用nx_packet_release是会出现空指针访问的。只有当返回值是0的时候用户程序才需要释放包。
回复

使用道具 举报

23

主题

211

回帖

280

积分

高级会员

积分
280
发表于 2022-11-16 09:54:16 | 显示全部楼层
catro 发表于 2022-11-16 09:00
可能我们的理解有点不同,我理解你说的超时了出来是指nx_tcp_socket_receive的返回值是非0,这个时候pack ...

是的,我没表达清楚,如果返回正常那么就需要手动释放包,如果是其他就不用清理
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-5-31 11:06:52 | 显示全部楼层
我用nx_packet_allocate来把数据往数据包里放的时候,返回NX_NO_PACKET,可能原因是什么,已经按照协议栈教程的0.4版本把初始化时候需要开启的服务都开启了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-5-31 12:19:10 | 显示全部楼层
873750398 发表于 2023-5-31 11:06
我用nx_packet_allocate来把数据往数据包里放的时候,返回NX_NO_PACKET,可能原因是什么,已经按照协议栈教 ...

返回这个是表示空间不足,没有可用的空间了,是不是前面一直申请,没有释放。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-5-31 13:49:11 | 显示全部楼层
eric2013 发表于 2023-5-31 12:19
返回这个是表示空间不足,没有可用的空间了,是不是前面一直申请,没有释放。

这个原因我找到了, 前边为了打印要回复的数据,把传进去的第三个参数,长度变成0了。改了以后可以了。
但是出现了一个新的问题,长度十几个字节的时候没问题,设置成4K的长度以后,这里也申请不下来了,这是因为
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-5-31 13:52:08 | 显示全部楼层
eric2013 发表于 2023-5-31 12:19
返回这个是表示空间不足,没有可用的空间了,是不是前面一直申请,没有释放。

刚才的回复可能没说全,刚开始确实是没释放,释放完了以后还出现返回NX_NO_PACKET。发现是传进去的长度参数变成0了。把这个参数改成几十好了,但是长度设置成4K的长度,又返回这个NX_NO_PACKET了,所以想请教下这个长度的限制在哪里调整下。是最开始创建内存池的那里限制了嘛
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-5-31 14:38:57 | 显示全部楼层
873750398 发表于 2023-5-31 13:52
刚才的回复可能没说全,刚开始确实是没释放,释放完了以后还出现返回NX_NO_PACKET。发现是传进去的长度参 ...

对,最开始创建的内存池限制的。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-5-31 15:33:49 | 显示全部楼层
eric2013 发表于 2023-5-31 14:38
对,最开始创建的内存池限制的。

数据比较大的时候,一个TCP包是放不下的,我测试的时候,在nx_packet_data_append的时候和send的时候,都用了很久,前者大约300ms,后者大约700ms,导致我的上位机认为通信中断了,从而认为超时关闭了连接。这个可以通过设置哪里的参数来解决嘛
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-6-1 00:52:03 | 显示全部楼层
873750398 发表于 2023-5-31 15:33
数据比较大的时候,一个TCP包是放不下的,我测试的时候,在nx_packet_data_append的时候和send的时候,都 ...

直接跑我们这种例子的原始应用层,你那边测试正常不,可以试试。
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2023-6-1 15:12:33 | 显示全部楼层
873750398 发表于 2023-5-31 15:33
数据比较大的时候,一个TCP包是放不下的,我测试的时候,在nx_packet_data_append的时候和send的时候,都 ...

是不是创建的数据包不够多?如果整个系统就一个包裹池,那么驱动会占用一部分用于收包。当数据包不够多时候,nx_packet_data_append和nx_tcp_socket_send会等其它数据包释放后继续操作。

最简单的验证方法是把nx_packet_pool_create的内存大小翻10倍,看看问题是否还存在
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-6-2 15:14:22 | 显示全部楼层
catro 发表于 2023-6-1 15:12
是不是创建的数据包不够多?如果整个系统就一个包裹池,那么驱动会占用一部分用于收包。当数据包不够多时 ...

昨天没上论坛。是你说的这个问题,我们原版这里的数值是填的*128.后边因为外扩SRAM用不了,把这个值改小了,改成20。只不过在之前的测试里忽略掉了。后来变大以后就可以了。并且我测试了一些值对应能PING通的最大值。放在后边
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-6-2 15:15:49 | 显示全部楼层
eric2013 发表于 2023-6-1 00:52
直接跑我们这种例子的原始应用层,你那边测试正常不,可以试试。

是一样的,本质是nx_packet_pool_create的空间不够,将这个扩的足够大就好了, 并且测了一些典型值。因为我们最大数据量也就4K,所以没再去测更多的。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-6-2 15:19:05 | 显示全部楼层
eric2013 发表于 2023-6-1 00:52
直接跑我们这种例子的原始应用层,你那边测试正常不,可以试试。

接上一个回复,另外,接交换机的话,能PING通的数据量比直接接板卡会大一些,可能是交换机的缓存机制??序号        对应值        可以ping通的最大值
1        32        11832字节
2        24        5192字节
3        16        1472字节
4        20        2952字节
5        22        4432字节
6        21        2952字节             由于我们最大想用的也就4K,所以在这个范围测试的比较细
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 04:06 , Processed in 0.226696 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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