硬汉嵌入式论坛

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

[以太网] stm32H7+freertos+lwip 运行一段时间后卡死

[复制链接]

13

主题

54

回帖

93

积分

初级会员

积分
93
发表于 2022-6-7 12:06:42 | 显示全部楼层 |阅读模式
我在公司这一边,板子上跑TCP的服务端的Modbus,还有一个接收UDP的广播信息用来查找设备,lwip运行的时候时不时打印
[C] 纯文本查看 复制代码
Assertion "pbuf_free: p->ref > 0" failed at line 650 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c

但没挂,但是去到车间那边板子就可能跑几分钟就直接挂了,打印的信息也是会有这个。


然后我说一下我回到公司这边的测试,我同时开两个UDP的广播往板子上对应的UDP端口发送查找设备的数据,就会很频繁的出现上面那句报错,但是没有卡死。现在我纠结时不时我udp这一块没有处理好导致的卡死。
UDP通信的代码贴一下:
[C] 纯文本查看 复制代码
while(1)
			{
				netconn_recv(udpconn,&recvbuf); //接收数据
				if(recvbuf != NULL)          	//接收到数据
				{ 
					memset(udp_set_sendbuf,0,UDP_SEND_BUFSIZE);	  //发送接收缓冲区清零
					taskENTER_CRITICAL();           //进入临界区
					memset(udp_set_recvbuf,0,UDP_RX_BUFSIZE);  //数据接收缓冲区清零
					for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
					{						
						//判断要拷贝到UDP_DEMO_RX_BUFSIZE中的数据是否大于UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于
						//的话就只拷贝UDP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
						if(q->len > (UDP_RX_BUFSIZE-data_len)) memcpy(udp_set_recvbuf+data_len,q->payload,(UDP_RX_BUFSIZE-data_len));//拷贝数据
						else memcpy(udp_set_recvbuf+data_len,q->payload,q->len);
						data_len += q->len;  	
						if(data_len > UDP_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出	
					}
					taskEXIT_CRITICAL();            //退出临界区
					memcpy(udp_set_sendbuf,udp_set_recvbuf,8);
					/*
                    *****省略协议处理部分
                    */
					sentbuf = netbuf_new();		
					netbuf_alloc(sentbuf,send_len); 	//	UDP_SEND_BUFSIZE 此处要加一个申请空间是否成功的判断 但是加了后还是一样会有卡死的现象
					memcpy(sentbuf->p->payload,(void*)udp_set_sendbuf,send_len);
					if(Func_Code==0x67||Func_Code==0x50)
					{
						netconn_sendto(udpconn,sentbuf,IP_ADDR_BROADCAST,recvbuf->port);
						if(Func_Code==0x50)	
								ResetSta = 1;	//重启生效
					}
					else if(Func_Code==0x52||Func_Code==0x53||Func_Code==0x44)
					{
						err = netconn_sendto(udpconn,sentbuf,((ip_addr_t*)&recvbuf->addr),recvbuf->port);
						if(Func_Code==0x53)	
							ResetSta = 1;	//重启生效
					}
					data_len=0;  //复制完成后data_len要清零。		
					netbuf_delete(sentbuf);      	//删除buf						
					netbuf_delete(recvbuf);      		//删除buf
				}
			}

回复

使用道具 举报

13

主题

54

回帖

93

积分

初级会员

积分
93
 楼主| 发表于 2022-6-7 12:09:31 | 显示全部楼层
刚才重新测试了一下,我这边服务端可以连接多个客户端,我电脑这边每次连接一个客户端也会出现
Assertion "pbuf_free: p->ref > 0" failed at line 650 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c
,但是断开的时候不会出现。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2022-6-8 10:02:02 | 显示全部楼层
是UDP时,开关中断这种骚操作不要加 taskENTER_CRITICAL();   
回复

使用道具 举报

13

主题

54

回帖

93

积分

初级会员

积分
93
 楼主| 发表于 2022-6-24 14:46:08 | 显示全部楼层
eric2013 发表于 2022-6-8 10:02
是UDP时,开关中断这种骚操作不要加 taskENTER_CRITICAL();

那TCP里有没有影响呢,我这里UDP和TCP都是在接收的时候加了关闭中断
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 23:08 , Processed in 0.167224 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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