지난번에 SysTick을 사용하여 usDelay를 구현해보았다. 관련 내용은 아래 포스트를 참고하면 된다.
https://swiftcam.tistory.com/145?category=783715
오늘은 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형 문자열을 출력할 때 소요시간의 차이는 거의 없다.
이상 끝.
'엔지니어링 > 임베디드' 카테고리의 다른 글
AHRS - 상보 필터(Complementary Filter) (0) | 2020.03.27 |
---|---|
IMU MEMS 센서 MPU6050 살펴보기 2 - 가속도 센서 (7) | 2020.03.22 |
[STM32] sysTick 을 이용한 usDelay 함수 만들기 (4) | 2020.03.09 |
[STM32] UART로 실수형(float) 출력하기 (0) | 2020.03.06 |
[STM32] printf를 시리얼로 출력하기 (2) | 2020.03.06 |
댓글