STM32+FreeRTOS의 printf 리디렉션 인쇄 난잡 문제 해결

1821 단어 단편기FreeRTOS
본 내용은 정점 원자 STM32F103 시리즈 개발판 개발 디버깅을 바탕으로 한다.
FreeRTOS가 도입된 후 임무 스케줄링이 생겨 프린트 사이에 서로 끼어들어 난잡한 상황이 벌어졌다.인쇄는 다음과 같습니다.
LED Running!
Task test tTask test wo!
Task tethree!
st one!
Task test tTask test wo!
Task tethree!
st one!
LED Running!
Task test tTask test wo!
Task tethree!
st one!
Task test tTask test wo!
Task tethree!
st one!
Task test tTask test wo!
Task tethree!
st one!
LED Running!

코드는 다음과 같습니다.
#pragma import(__use_no_semihosting)             
//                           
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//  _sys_exit()              
_sys_exit(int x) 
{ 
	x = x; 
} 
//   fputc   
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//    ,        
    USART1->DR = (u8) ch;     
	return ch;
}
#endif 

이 문제를 해결하기 위해서 printf가 방향을 바꿀 때 직접 인쇄하지 않고 u8 대기열에 저장한 다음 우선순위가 1인 인쇄 작업을 해서 이 대기열의 데이터를 인쇄합니다.코드는 다음과 같습니다.

//   fputc   
int fputc(int ch, FILE *f)
{      
    //               
    //            
    PrintQueue_InQueue((u8) ch);
	return ch;
}
//     ,              
void Print_Task(void* pvParameters)
{   
    //     
    u8 ch = 0xFF;
    //
    while(1)
    {
        if(PrintQueue_OutQueue(&ch) == PrintQueue_OK)
        {    
            USART1_SendByte(ch);
        }
    }
}

이 처리를 추가한 인쇄는 다음과 같이 정상적으로 복구됩니다.
LED Running!
Task test two!
Task test three!
Task test one!
Task test two!
Task test three!
Task test one!
Task test two!
Task test three!
Task test one!
LED Running!
Task test two!
Task test three!
Task test one!
Task test two!
Task test three!
Task test one!
LED Running!
Task test two!
Task test three!
Task test one!
Task test two!
Task test three!

이로써 인쇄 혼란 문제는 기본적으로 해결된 셈이다.

좋은 웹페이지 즐겨찾기