天线|RF射频
直播中

杨涛

8年用户 198经验值
私信 关注
[问答]

为什么在F4上采用TCP Server模式连续发送数据会被卡死?

参考发烧友F4开发板例程移植LWIP 裸跑,配置为TCP Server模式,向网络调试助手连续发送数据,速率大概在400KB/s左右,能实现通信,但是运行不了多长时间就会出现卡死的现象,通过串口调试助手打印出如下提示信息:
经常出现的错误提示为:Assertion "pbuf_take: invalid buf" failed at line 973 in ..LWIPlwip-1.4.1srccorepbuf.c
偶尔出现的提示为:Assertion "mem_free: legal memory" failed at line 323 in ..LWIPlwip-1.4.1srccoremem.c
Assertion "pbuf_free: p->ref > 0" failed at line 650 in ..LWIPlwip-1.4.1srccorepbuf.c
Assertion "tcp_write: arg == NULL (programmer violates API)" failed at line 382 in ..LWIPlwip-1.4.1srccoretcp_out.c
找了好久,不知道什么原因导致的,而且卡死的时间不规律,请教论坛大神,是有经验的,请给出指导意见!
问题更新:传输数据卡死后,ping命令还是可以通的,也就是能ping通,但是数据传不了了!

回帖(10)

周玲玲

2019-8-20 07:20:50
移植有问题,底层驱动或者配置参数的原因。目测很大可能性是底层驱动的原因
举报

许伟星

2019-8-20 07:32:13
请问,如果这样应该从哪些方面进行排查呢!我用的LAN8720!
举报

徐非姗

2019-8-20 07:50:17
内存申请和释放,加保护!
[AppleScript] 纯文本查看 复制代码
//释放内存(外部调用) //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);  }
举报

刘斯宁

2019-8-20 08:00:08
添加了中断保护,定义了四个函数如下:
#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 ..LWIPlwip-1.4.1srccorepbuf.c
请问是添加的方法不对吗?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分