我在公司这一边,板子上跑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
}
}
|