lwip stm32 异常分析



最近在做一个项目,通过网口将ad芯片采集的ad参数上传到上位机,stm32 作为服务器端,要求频率比较高,必须要到1k。

使用定时器作为时间的flag,然后周期性的采集AD参数,并且发送到上位机。但是,会出现以下问题

LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)",
                pcb->unsent_oversize == 0);

百度搜索了这个问题,文章如下

http://www.firebbs.cn/forum.php?mod=viewthread&tid=14012&extra=page=1

但是通过仿真,该文章所修改部分,根本未被调用,所以,这不是解决该问题的办法。


通过对程序的仿真,未发现代码上的逻辑问题,但是pcb->unsent ==NULL 和 pcb->unsent_oversize ==0,竟然不相等,所以猜测是发生了

数据竞争。根本不是LWIP的问题。所以,检查程序,最后发现,在时钟 timer.c中,发送时间计算部分

				time_area++;
				if(time_area>50)
				{
				  TimeReady_flag =1;//此标志为发送标志
				  time_area =0;
				}

TimeReady_flag在timer中运行的时候,也可能也在正好进行判断TimeReada_flag==1? send(); ,所以说,应该为改时间标志加上锁,我在这就在if()加了判断标志

time_area++;
if(time_area>50)
{
if(TimeReady_flag ==0) //如果未发送的话,等待下一次
{
TimeReady_flag =1;
time_area =0;
}
}

虽然这样可能会发送的没那么及时,但是对于TCP来说,不太容易出现丢包的现象,能保证数据的正常传出,问题解决

程序的逻辑性和严谨性对一个程序员来说很重要,浪费了我2天时间,重新移植了2.00的LWIP,发现问题不是出在这。谨记谨记!!

TIP: LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)",
                pcb->unsent_oversize == 0);

该调试信息是后面的条件不成立时,打印。也就是pcb->unsent_oversize != 0  打印前面的信息


你可能感兴趣的:(stm32)