野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16785|回复: 3

使用STM32F429的Lwip例程报错死机

[复制链接]
发表于 2016-12-22 15:57:47 | 显示全部楼层 |阅读模式
在STM32F429自带的光盘中的LWIP+UCOS3基础上实现一个TCP Client向主机每秒发送一次数据。现存在的问题是:
开发板上的程序在发送几次数据后,通过串口输出得知出现如下错误:
Assertion "pbuf_free: sane type" failed at      line 635 in ..\..\USER\lwip-1.4.1\src\core\pbuf.c
以上错误报告反复几次后,最后出现 hardfault!开发板停机。

为什么会出现这个问题?应该怎样解决?
在网上看到说LWIP网络协议栈的坑很多,这个是不是就是坑之一呢?
如果是,在STM32上还有没有其他靠谱的开源网络协议栈?

网络发送数据代码如下:
#include "lwip/opt.h"

#if LWIP_NETCONN

#include "lwip/sys.h"
#include "lwip/api.h"
#include "tcpip.h"
#include "includes.h"
#include "SendQ.h"
#define TCPCLIENT_THREAD_PRIO  ( 5 )

/*-----------------------------------------------------------------------------------*/
static void tcpclient_thread(void *arg)
{
  struct netconn *conn;
  err_t bind_err,connect_err;
  err_t lwip_err;
  struct ip_addr addr;
  struct ip_addr local_addr;       
  LWIP_UNUSED_ARG(arg);
  OS_ERR err;
  CPU_TS ts;
  struct SendQBlock* blk;

  while(1)
  {          
    conn = netconn_new(NETCONN_TCP);
        if (conn!=NULL)
        {  
          IP4_ADDR(&local_addr,192,168,3,68);
          bind_err = netconn_bind ( conn, &local_addr, 0 );
          if(bind_err==ERR_OK)
          {          
               
                IP4_ADDR(&addr,192,168,3,29);
                connect_err = netconn_connect(conn,&addr,6868);

                /* Process the new connection. */
                if (connect_err == ERR_OK)
                {   blk=SendQ_GetBlock(&ts);
                       
                        printf("Connenct Success! send data\r\n");
                        netconn_write(conn, blk->data, sizeof(struct SendQBlock), NETCONN_NOCOPY);

                        err=SendQ_PutMem(blk);
                        if(err!=OS_ERR_NONE)
                        {
                                printf("SendQ_PutMem Err!!!\r\n");
                        }
                        lwip_err=netconn_close(conn);
                       
                        if(lwip_err!=ERR_OK)
                        {
                                printf("netconn_close error! %s\r\n",lwip_strerr(lwip_err));
                        }
                        lwip_err=netconn_delete(conn);
                       
                        if(lwip_err!=ERR_OK)
                        {
                                printf("netconn_delete error! %s\r\n",lwip_strerr(lwip_err));
                        }
                       
                       
                       
                }else{
                    netconn_delete(conn);
                }
               
          }
        }
  else
  {
    printf("can not create TCP netconn\r\n");
  }

  }
}
/*-----------------------------------------------------------------------------------*/

void tcpclient_init(void)
{
  sys_thread_new("tcpclient_thread", tcpclient_thread, NULL, DEFAULT_THREAD_STACKSIZE, TCPCLIENT_THREAD_PRIO);
}



回复

使用道具 举报

发表于 2016-12-22 16:06:31 | 显示全部楼层
有点像之前遇到的这个bug:

官方说明网址:http://git.savannah.gnu.org/cgit ... 3dd8ace9db9fd814ad1

出现该bug时,串口会输出“unsent_oversize mismatch”之类的字符,修改后已没有该错误输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-22 16:23:42 | 显示全部楼层
flyleaf 发表于 2016-12-22 16:06
有点像之前遇到的这个bug:

官方说明网址:http://git.savannah.gnu.org/cgit/lwip.git/commit/?id=32b1 ...

谢谢管理员的热心关注。

我感觉我这个问题可能和内存越界有关。但不知道该怎么下手去排查错误和定位问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-22 16:26:16 | 显示全部楼层
flyleaf 发表于 2016-12-22 16:06
有点像之前遇到的这个bug:

官方说明网址:http://git.savannah.gnu.org/cgit/lwip.git/commit/?id=32b1 ...

我想打印一下当程序出错时的函数调用栈,请问该怎么做呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-13 22:42 , Processed in 0.030249 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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