本帖最后由 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调试的内存结果
在debug的时候我查看的地址是data,出来的时候是第一排的数据,但是根据我标记的红 {MOD}箭头,前几次的数据都还在。这明显不科学啊?
手动释放应该不行,应该是LWIP分配内存的问题。因为每次分配的内存地址值减少,估计减少到一顶程度就硬件错误了。
你可以看下形参p的地址,我认为p不变,除非调用函数也是你或这第三方写的(只要不是lwip写的)。
p不应该在你的函数里面被free掉,p每次应该是重用的。你考虑其它原因导致的硬错误异常。
一周热门 更多>