STM32+FreeRTOS의 printf 리디렉션 인쇄 난잡 문제 해결
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!
이로써 인쇄 혼란 문제는 기본적으로 해결된 셈이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 출력 포인터 변수 주소(16진수)텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.