在使用ESP8266不断向TCP服务器请求数据过程中,stm32随机性的死机

在使用ESP8266不断向TCP服务器请求数据过程中,stm32随机性的死机

问题描述:在使用ESP8266不断向TCP服务器请求数据过程中,发现程序会突然进入死机状态,且进入死机状态的时间具有很大的不确定性。

解决过程:经过不断地测试,终于找到了死机时程序运行的位置,并找到了解决方案。
首先找到了,程序进入死机是由于中断函数引起的。由于某些不明原因,程序进入中断服务程序的标志位一直处于有效状态,无法正常清除标志。故CPU一直进入中断服务函数工作,从而导致主程序死机。解决方法,只需要在中断函数中添加异常情况时清除中断标志的代码即可。
解决方案如下
原中断服务函数

void USART2_IRQHandler(void)
{
    
    
	u8 res;	    
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
	{
    
    	 
		res =USART_ReceiveData(USART2);		
		if(USART2_RX_STA<USART2_MAX_RECV_LEN)		//还可以接收数据
		{
    
    
			TIM_SetCounter(TIM4,0);//计数器清空        				 
			if(USART2_RX_STA==0)TIM4_Set(1);	 	//使能定时器4的中断 
			USART2_RX_BUF[USART2_RX_STA++]=res;		//记录接收到的值	 
		}else 
		{
    
    
			USART2_RX_STA|=1<<15;					//强制标记接收完成
		} 
	}  	
}   

改进后的中断服务函数

void USART2_IRQHandler(void)
{
    
    
	u8 res;	    
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
	{
    
    	 
        USART_ClearITPendingBit(USART2,USART_IT_RXNE); //收的地方可能会遇到相同问题,同样需要清标志。
		res =USART_ReceiveData(USART2);		
		if(USART2_RX_STA<USART2_MAX_RECV_LEN)		//还可以接收数据
		{
    
    
			TIM_SetCounter(TIM4,0);//计数器清空        				 
			if(USART2_RX_STA==0)TIM4_Set(1);	 	//使能定时器4的中断 
			USART2_RX_BUF[USART2_RX_STA++]=res;		//记录接收到的值	 
		}else 
		{
    
    
			USART2_RX_STA|=1<<15;					//强制标记接收完成
		} 
	}  	
    if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET)  //发的地方清标志
    {
    
    
          USART_ClearFlag(USART2,USART_FLAG_ORE);
          USART_ReceiveData(USART2);
    }
}   

猜你喜欢

转载自blog.csdn.net/Bobbo666/article/details/108895415