OpenEdv-开源电子网

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

求助LWIP:在F4上采用TCP Server模式连续发送数据 会频繁卡死!

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-7-16
在线时间
9 小时
发表于 2016-7-16 16:37:06 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 shengzhou02 于 2016-7-16 21:20 编辑

参考正点原子F4开发板例程移植LWIP 裸跑,配置为TCP Server模式,向网络调试助手连续发送数据,速率大概在400KB/s左右,能实现通信,但是运行不了多长时间就会出现卡死的现象,通过串口调试助手打印出如下提示信息:
经常出现的错误提示为:Assertion "pbuf_take: invalid buf" failed at line 973 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c

偶尔出现的提示为:Assertion "mem_free: legal memory" failed at line 323 in ..\LWIP\lwip-1.4.1\src\core\mem.c
Assertion "pbuf_free: p->ref > 0" failed at line 650 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c
Assertion "tcp_write: arg == NULL (programmer violates API)" failed at line 382 in ..\LWIP\lwip-1.4.1\src\core\tcp_out.c

找了好久,不知道什么原因导致的,而且卡死的时间不规律,请教论坛大神,是有经验的,请给出指导意见!

问题更新:传输数据卡死后,ping命令还是可以通的,也就是能ping通,但是数据传不了了!

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

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-7-16 17:09:22 | 显示全部楼层
移植有问题,底层驱动或者配置参数的原因。目测很大可能性是底层驱动的原因
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-7-16
在线时间
9 小时
 楼主| 发表于 2016-7-16 18:26:39 | 显示全部楼层
zuozhongkai 发表于 2016-7-16 17:09
移植有问题,底层驱动或者配置参数的原因。目测很大可能性是底层驱动的原因

请问,如果这样应该从哪些方面进行排查呢!我用的LAN8720!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-7-20 23:37:46 | 显示全部楼层
内存申请和释放,加保护!
[mw_shl_code=applescript,true]//释放内存(外部调用)
//memx:所属内存块
//ptr:内存首地址
void myfree(u8 memx,void *ptr)  
{  
    OS_CPU_SR cpu_sr=0;
        u32 offset;   
        if(ptr==NULL)return;                //地址为0.  
        OS_ENTER_CRITICAL();                //添加保护
        offset=(u32)ptr-(u32)mallco_dev.membase[memx];     
    my_mem_free(memx,offset);        //释放内存
        OS_EXIT_CRITICAL();   
}  
//分配内存(外部调用)
//memx:所属内存块
//size:内存大小(字节)
//返回值:分配到的内存首地址.
void *mymalloc(u8 memx,u32 size)  
{  
    OS_CPU_SR cpu_sr=0;
    u32 offset;   
        OS_ENTER_CRITICAL();                //添加保护       
        offset=my_mem_malloc(memx,size);  
        OS_EXIT_CRITICAL();                           
    if(offset==0XFFFFFFFF)return NULL;  
    else return (void*)((u32)mallco_dev.membase[memx]+offset);  
}  [/mw_shl_code]
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-7-16
在线时间
9 小时
 楼主| 发表于 2016-7-21 15:44:32 | 显示全部楼层
正点原子 发表于 2016-7-20 23:37
内存申请和释放,加保护!
[mw_shl_code=applescript,true]//释放内存(外部调用)
//memx:所属内存块

添加了中断保护,定义了四个函数如下:
#define NVIC_Shut        0x00000001

OS_CPU_SR OS_CPU_SR_Save(void)
{
        register uint32_t __regPriMask         __ASM("primask");
        return(__regPriMask);
}

void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
        register uint32_t __regPriMask         __ASM("primask");
        __regPriMask = (cpu_sr);
}

//#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
//#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}

OS_CPU_SR OS_ENTER_CRITICAL(void)
{
        OS_CPU_SR cpu_sr;
        cpu_sr = OS_CPU_SR_Save();
        OS_CPU_SR_Restore(NVIC_Shut);
        return cpu_sr;
}

void OS_EXIT_CRITICAL(OS_CPU_SR cpu_sr)
{
        OS_CPU_SR_Restore(cpu_sr);
}

在myfree和mymalloc中保护程序添加如下:

//释放内存(外部调用)
//memx:所属内存块
//ptr:内存首地址
void myfree(u8 memx,void *ptr)  
{  
        OS_CPU_SR cpu_sr = 0;
        u32 offset;   
        if(ptr==NULL)return;//地址为0.  
        cpu_sr = OS_ENTER_CRITICAL();        //添加保护
        offset=(u32)ptr-(u32)mallco_dev.membase[memx];     
    my_mem_free(memx,offset);        //释放内存  
        OS_EXIT_CRITICAL(cpu_sr);       
}  
//分配内存(外部调用)
//memx:所属内存块
//size:内存大小(字节)
//返回值:分配到的内存首地址.
void *mymalloc(u8 memx,u32 size)  
{  
        OS_CPU_SR cpu_sr = 0;
    u32 offset;   
        cpu_sr = OS_ENTER_CRITICAL();        //添加保护
        offset=my_mem_malloc(memx,size);
        OS_EXIT_CRITICAL(cpu_sr);       
    if(offset==0XFFFFFFFF)return NULL;  
    else return (void*)((u32)mallco_dev.membase[memx]+offset);  
}  

运行后还是会出现卡死的问题,串口打出的信息为:
Assertion "pbuf_take: invalid buf" failed at line 973 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c
请问是添加的方法不对吗?
回复

使用道具 举报

19

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2014-10-19
在线时间
42 小时
发表于 2016-10-9 17:21:47 | 显示全部楼层
楼主 你好 请问你的问题解决了吗?我跟你出现了同样的问题
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
发表于 2017-7-28 14:38:59 | 显示全部楼层
正点原子 发表于 2016-7-20 23:37
内存申请和释放,加保护!
[mw_shl_code=applescript,true]//释放内存(外部调用)
//memx:所属内存块

原子哥,添加了好是好了点,但时间长了数据量大了还是会出现这个问题啊
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2017-7-28
在线时间
8 小时
发表于 2017-7-28 15:53:35 | 显示全部楼层
朋友啊   我也在历程上做了修改,在循环中连续调用TCP_WRITE函数,速度跑着跑着就死了    能指点下不
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
发表于 2017-7-31 11:12:23 | 显示全部楼层
现在主要就是Assertion "pbuf_take: invalid buf" failed at line 974 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c这个错误,然后就卡死了
回复

使用道具 举报

12

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-10-27
在线时间
34 小时
发表于 2017-10-16 10:01:50 | 显示全部楼层
Szep 发表于 2017-7-31 11:12
现在主要就是Assertion "pbuf_take: invalid buf" failed at line 974 in ..\LWIP\lwip-1.4.1\src\core\pbu ...

我现在也遇到这个问题,请问你有解决这个问题吗,能给我讲讲怎么解决的吗
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
发表于 2017-12-7 14:16:07 | 显示全部楼层
风语者1991 发表于 2017-10-16 10:01
我现在也遇到这个问题,请问你有解决这个问题吗,能给我讲讲怎么解决的吗

还没呢,后来只能降低发送速率了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-8-12
在线时间
8 小时
发表于 2020-2-26 15:31:00 | 显示全部楼层
关于这个问题  偶尔出现的提示为:Assertion "mem_free: legal memory" failed at line 323 in ..\LWIP\lwip-1.4.1\src\core\mem.c
在程序里面是static err_t tcp_echoclient_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
  struct echoclient *        es = NULL;
  #ifdef LWIP_TCP_DEBUG
        printf("\r\n connected 开始 ");
        #endif
  if (err == ERR_OK)   
  {
    /* allocate structure es to maintain tcp connection informations */
                myes = (struct echoclient *)mem_malloc(sizeof(struct echoclient)); //注意这个是采用mem_malloc来分配的

其对应的释放是采用 static void tcp_echoclient_connection_close(struct tcp_pcb *tpcb, struct echoclient * es )
{
  /* remove callbacks */
        tcp_recv(tpcb, NULL);
  tcp_sent(tpcb, NULL);
  tcp_poll(tpcb, NULL,0);

  if (es != NULL)
  {
    mem_free(es); //采用LWIP的内存释放
  }
如果你采用了原子哥的内存分配 myes = (struct echoclient *)mymalloc(SRAMIN,sizeof(struct echoclient));
对应的mem_free也需要采用原子哥的
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-6-13
在线时间
4 小时
发表于 2020-6-30 19:04:12 | 显示全部楼层
顶一下,遇到了 同样的问题,服务器发送一段时间的数据就会卡死,不知道怎么解决,楼主解决没提供一下思路
回复

使用道具 举报

22

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
金钱
429
注册时间
2016-5-23
在线时间
118 小时
发表于 2020-10-9 10:54:50 | 显示全部楼层
正点原子 发表于 2016-7-20 23:37
内存申请和释放,加保护!
[mw_shl_code=applescript,true]//释放内存(外部调用)
//memx:所属内存块

原子哥裸奔怎么办呢,我看你已经添加 INTX_DISABLE();和INTX_ENABLE();了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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