这下必须要召唤大神了 ----关于LWIP

2019-03-23 18:05发布

本帖最后由 yl20084784 于 2016-7-23 19:18 编辑

硬件:stm32+DP83848
问题:搭建LWIP(回调函数版本)好网页服务器后,用浏览器打开网页。这一步正常。但是多打开几次后就进入stm32就硬件错误了。调试发现,在我的http处理函数里面观察接收到的P buff数据一直存在,因此怀疑,是P buff溢出导致进入硬件错误的。但是在HTTP处理函数里面加入了        pbuf_free(p);  语句。
附上我的HTTP处理函数大概结构
static err_t My_http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
  hs = arg;
  char *data;
  if (err == ERR_OK && p != NULL)
  {
    /* Inform TCP that we have taken the data. */
    tcp_recved(pcb, p->tot_len);
    data = p->payload;
       if((strncmp(data,"GET",3)==0))
       {
         unsigned char *Pyl;
         if(strstr(data,"Cf_1")!= NULL)//强制触发1
         {
                pbuf_free(p);//P buff 释放函数
                tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),0);
                send_data(pcb, hs);
                tcp_sent(pcb, http_sent);               
         }
else
      {
        close_conn(pcb, hs);
      }
}
    else
    {
      pbuf_free(p);
    }
  if (err == ERR_OK && p == NULL)
  {
    close_conn(pcb, hs);
  }
  return ERR_OK;
}
再附上DEBUG调试的内存结果 LWIP Pbuff释放不了?.png
在debug的时候我查看的地址是data,出来的时候是第一排的数据,但是根据我标记的红 {MOD}箭头,前几次的数据都还在。这明显不科学啊?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
moyanming2013
1楼-- · 2019-03-24 01:32
 精彩回答 2  元偷偷看……
yl20084784
2楼-- · 2019-03-24 02:34
moyanming2013 发表于 2016-7-26 10:23
free一个空间又不会对该空间全部清零,你要有具体的len来指出当前有效的数据长度。
你可以在free之前对这 ...

手动释放应该不行,应该是LWIP分配内存的问题。因为每次分配的内存地址值减少,估计减少到一顶程度就硬件错误了。
moyanming2013
3楼-- · 2019-03-24 03:51
yl20084784 发表于 2016-7-26 17:15
手动释放应该不行,应该是LWIP分配内存的问题。因为每次分配的内存地址值减少,估计减少到一顶程度就硬件 ...

你可以看下形参p的地址,我认为p不变,除非调用函数也是你或这第三方写的(只要不是lwip写的)。
p不应该在你的函数里面被free掉,p每次应该是重用的。你考虑其它原因导致的硬错误异常。

一周热门 更多>