OpenEdv-开源电子网

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

LWIP使用TFTP出现死机的问题

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-6-4
在线时间
16 小时
发表于 2016-9-23 13:57:57 | 显示全部楼层 |阅读模式
1金钱
PC端与开发板网络连接正常。
采用tftp32.exe软件进行tftp get 测试时,出现了hardfault,串口打印

Assertion "pbuf_free: p->ref > 0" failed at line 651 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c
Assertion "pbuf_free: sane type" failed at line 636 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c

搜索论坛发现之前有类似现象,原子建议关中断解决,尝试后无效。

之后采用抓包软件发现tftp请求能够正常收到,并且从sd卡已经读取文件并且发送了block1 - block3 在发送block4时,死机。

结合打印提示应该是内存相关的问题。

然后单步仿真跟踪,发现pbuf链表中,有一个链表元素的next指针指向了FFFFFFF,并且FFFFFFFF中所有成员的值均为FFFF。
因此在low_level_output中memcpy((u8_t*)&buffer[l], q->payload, q->len);调用了非法的指针导致程序死机。

目前还没找到这个FFFFFFF成员从哪里来的,继续debug。


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

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-6-4
在线时间
16 小时
 楼主| 发表于 2016-9-23 14:53:18 | 显示全部楼层
进一步跟踪,发现
err_t tftp_send_message(struct udp_pcb *upcb, struct ip_addr *to_ip, unsigned short to_port, char *buf, unsigned short buflen)
{
  err_t err;
  struct pbuf *pkt_buf; /* Chain of pbuf's to be sent */

  /* PBUF_TRANSPORT - specifies the transport layer */
  pkt_buf = pbuf_alloc(PBUF_TRANSPORT, buflen, PBUF_POOL);

  if (!pkt_buf)      /*if the packet pbuf == NULL exit and end transmission */
    return ERR_MEM;

  /* Copy the original data buffer over to the packet buffer's payload */
  memcpy(pkt_buf->payload, buf, buflen);

  /* Sending packet by UDP protocol */
  err = udp_sendto(upcb, pkt_buf, to_ip, to_port);

  /* free the buffer pbuf */
  pbuf_free(pkt_buf);

  return err;
}

执行memcpy(pkt_buf->payload, buf, buflen);的时候pkt_buf中next中的next指向地址从000000变为FFFFFF
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 22:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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