OpenEdv-开源电子网

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

LWIP申请内存失败问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-4-18
在线时间
2 小时
发表于 2019-1-31 17:40:04 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 Sunshin 于 2019-1-31 17:41 编辑

是这样的骂我移植了RTOS+LWIP,打算做Modbus-TCP通信,协议栈以及RTOS都已经移植完了,ModbusTCP的代码也写完了,但是遇到了一个问题,就是通信20次LWIP的任务就死机了,我查了一下,卡在接收到数据之后申请内存失败了,卡在代码的这个地方
1.png
当接收的数据的次数大于PBUF_POOL_SIZE 的时候就会出现申请内存失败的问题
这里的PBUF_POOL_SIZE定义如下图,
22.png
不知道为啥,希望大家帮帮忙。谢谢啦!!!我的主程序是这样的,

/*-------------------------------------------------------------------------------------
==  函数名    :
==  描  述    :
==  输入参数  :
==  返回值    :
==  备  注    :  
==
==
---------------------------------------------------------------------------------------
*/
void Modbus_TCP_Tasks(void * pvParameters)
{
struct netconn *conn, *newconn;
int i=0;
err_t err, accept_err;
struct netbuf *buf;
void *data;
u16_t len;
unsigned char *tmpP=NULL;
err_t recv_err;
//--初始化---LWIP协议栈---
ETH_BSP_Config();
LwIP_Init();
MB_TCP_Data_Init();//--协议栈初始化--
//  LWIP_UNUSED_ARG(arg);
/* Create a new connection identifier.----*/
conn = netconn_new(NETCONN_TCP);
err = netconn_bind(conn, NULL, 502);
netconn_listen(conn);
    accept_err = netconn_accept(conn, &newconn);
// netconn_delete(conn);  //删除侦听的连接。
while (1)
{
   recv_err = netconn_recv(newconn, &buf);
   if ( recv_err == ERR_OK)
   {
     do
     {
      netbuf_data(buf, &data, &len);
//      netconn_write(newconn, data, len, NETCONN_COPY);
     }
     while (netbuf_next(buf) >= 0);
     //--拷贝数计--以及数据长度
     for(i=0;buf->p!=NULL;buf->p=buf->p->next)//--非空则继续--
     {
       memcpy((unsigned char *)&TCP_Data,buf->p->payload,buf->p->len);
          i=i+buf->p->len;
     }
     netconn_write(newconn, TCP_Data, len, NETCONN_COPY);
     netbuf_delete(buf);
     
     {
       //--正式开始处理Modbus-TCP 数据--
       if((TCP_Data[2]==0)&&(TCP_Data[3]==0))//--查看该数据帧是否为Modbus-TCP数据--
       {
        MB_TCP_Struct.MB_TCP_Rx_Len=len;//--获取数据长度--
        for(i=0;i<6;i++)
        {
           MB_TCP_Struct.MB_MBAP_Data=TCP_Data;
        }
          //--开始数据拷贝的工作 拷贝的数据应当从第7个数据开始,
        for(i=0;i<(MB_TCP_Struct.MB_TCP_Rx_Len-6);i++)
        {
           MB_TCP_Struct.MB_RxData=TCP_Data[i+6];
        }
        MB_TCP_Struct.MB_TCP_Rx_Len=i;
        //--开始计算CRC
        MB_TCP_Struct.CRC_Data=usMBCRC16(MB_TCP_Struct.MB_RxData,MB_TCP_Struct.MB_TCP_Rx_Len );
        MB_TCP_Struct.MB_RxData[MB_TCP_Struct.MB_TCP_Rx_Len]   = (MB_TCP_Struct.CRC_Data&0xff);
        MB_TCP_Struct.MB_RxData[MB_TCP_Struct.MB_TCP_Rx_Len+1] = ((MB_TCP_Struct.CRC_Data>>8)&0xff);
        MB_TCP_Struct.MB_RxData_Len=MB_TCP_Struct.MB_TCP_Rx_Len+2;//--加上CRC的数据长度--
        
        MB_TCP_Process(&MB_TCP_Struct);
        //--然后完成TCP的组包工作---最后发送--需要消除CRC校验-2-
        //--待添加---
        //--填充TCP的MBAP数据--按照协议标准是需要直接复制前 4位
        for(i=0;i<6;i++)
        {
            MB_TCP_Struct.MB_TCP_TxData=MB_TCP_Struct.MB_MBAP_Data;
        }
        MB_TCP_Struct.MB_TCP_TxData[4]=((MB_TCP_Struct.MB_TxData_Len>>8)&0xff);
        MB_TCP_Struct.MB_TCP_TxData[5]=(MB_TCP_Struct.MB_TxData_Len&0xff);
        //--开始复制数据--
        for(i=0;i<MB_TCP_Struct.MB_TxData_Len-2;i++)
        {
          MB_TCP_Struct.MB_TCP_TxData[i+6]=MB_TCP_Struct.MB_TxData;
        }
        //--修改TCP的数据发送长度--需要减去CRC的数据--
        MB_TCP_Struct.MB_TCP_Tx_Len=MB_TCP_Struct.MB_TxData_Len+4;
        //--TCP 发送---
        netconn_write(newconn, MB_TCP_Struct.MB_TCP_TxData, MB_TCP_Struct.MB_TCP_Tx_Len, NETCONN_COPY);
       }
      }
   }
}
}


2.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2018-12-12
在线时间
32 小时
发表于 2019-2-11 09:48:48 | 显示全部楼层
回复

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2018-12-12
在线时间
32 小时
发表于 2019-2-11 12:59:26 | 显示全部楼层
static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p,err_t err)
{
//  struct pbuf *ptr;
//  u16_t plen;
  
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
  tcp_write(tpcb,p->payload,p->len,1);
        pbuf_free(p);
  return ERR_OK;
}
回复

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2018-12-12
在线时间
32 小时
发表于 2019-2-11 13:00:02 | 显示全部楼层
pbuf_free(p);
回复

使用道具 举报

头像被屏蔽

0

主题

207

帖子

0

精华

禁止发言

积分
276
金钱
276
注册时间
2019-3-4
在线时间
4 小时
发表于 2019-4-2 08:13:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 18:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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