본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/임베디드

[STM32] printf 함수의 수행시간 측정

by 베니스상인 2020. 3. 18.

지난번에 SysTick을 사용하여 usDelay를 구현해보았다. 관련 내용은 아래 포스트를 참고하면 된다.

 

 

https://swiftcam.tistory.com/145?category=783715

 

[STM32] sysTick 을 이용한 usDelay 함수 만들기

STM32CubeIDE에서는 기본적으로 1ms단위로 입력이 가능한 msDelay를 제공한다. 그러나 가끔 시간을 측정하거나 1ms보다 작은 delay를 사용하고자 한다면 msDelay를 사용할 수 없다. us 단위의 delay를 만드는 방법..

swiftcam.tistory.com

 

 

오늘은 UART로 printf를 출력할 경우 수행시간을 측정하고 usDelay를 이용하여 수행시간을 단축한 결과와 비교하고자 한다.

 

 

1. printf의 함수의 수행시간 측정(Integer, Float)

 

 

 UART로 printf를 출력하는 함수는 아래와 같다. 

 

int _write(int file, char* p, int len)
{
for(int i=0; i<len; i++)
{
LL_USART_TransmitData8(USART6, *(p+i));
LL_mDelay(1);
}
return len;
}

 

 

1byte 전송할 때마다 1ms를 쉬도록 되어 있다. 

 

먼저,  integer타입 변수을 아래와 같이 출력할 때 시간을 측정하였다. 문자15개를 보내지만 중간에 2개의 공백과 /n/r을 포함하면 19개 data를 보내게 된다. 

 

아래 코드에서 GPIO는 오실로스코프로 펄스를 측정하기 위해 실행하는 것이며, 수행시간은 약 1us 정도로 측정에 영향을 주지 않을 만큼 미비한 수준이다. 

 

 

 

 

터미널에는 아래와 같은 문자가 출력된다.

 

 

 

 

integer타입의 변수를 printf로 출력할 때 소요시간을 측정해보니 19개의 UART로 data를 전송할 때 약 19.2ms가 소요된다. 그러면 문자 1개당 소요시간은 약 1.01ms이다. 1ms의 delay를 준것만큼 소요되는 것 같다.  

 

 

 

 

 

시간을 100us로 줄이게 되면 19개 문자를 전송할 때 약 1.95ms이 된다. 문자 1개당 약 0.102ms이 소요된다. 

 

 

 

 

시간을 50us까지 줄이게 되면 아래와 같이 문자가 정상적으로 출력되지 않는다.

 

 

 

다음은 1ms의 딜레이로 float형을 printf 출력할 때 시간을 측정해보았다. 코드는 아래와 같이 간단한 샘플코드로 출력했다.

 

 

 

터미널에 출력되는 화면은 아래와 같다. 15개 문자를 출력했지만 실제로 터미널에 찍히는 문자는 총 29개로 확인되었다. 

 

 

 

29개 문자를 float형으로 출력할 때 소요시간은 약 30.5ms이 측정되었다. 문자 1개당 소요시간은 약 1.05ms으로 integer를 출력할 때와 거의 비슷한 수준이다. 

 

 

 

 

 

UART 출력함수의 delay를 100us로 수정하고 측정했을 때 결과이다. 29개 문자를 출력할 때 소요시간은 약 3.23ms로 문자 1개당 소요시간은 약 0.11ms이다. 

 

 

 

시간을 50us로 더 줄이게 되면 정상적으로 출력하지 못한다.

 

 

 

2. 결론

- usDelay 함수를 이용하여 UART 데이터 전송시 delay를 100us까지 줄일 수 있다. 

- 수행시간 단축 후 1개의 문자열을 출력할 때 소요되는 시간은 약 110us이다.

- integer형 문자열과 float형 문자열을 출력할 때 소요시간의 차이는 거의 없다.

 

이상 끝.

728x90

댓글