STM32 DWT 사이클 카운터로 코드 실행 시간 측정하기
'ARM Cortex-M 기반의 STM32 개발을 하다 보면, "내 코드가 얼마나 빠르게 실행될까?"라는 궁금증이 생길 때가 있습니다. 특히, 최적화를 고민할 때는 코드 블록 단위의 정밀한 실행 시간 측정이 필요하죠. 이때 사용할 수 있는 강력한 기능이 바로 DWT 사이클 카운터(Data Watchpoint and Trace Cycle Counter)입니다.
이 기능을 쓰면 코드 실행 시간을 '클럭 사이클 단위'로 측정할 수 있어 마이크로초 수준까지 정확한 분석이 가능합니다. 하지만 DWT는 기본적으로 꺼져 있기 때문에 직접 설정해 줘야 쓸 수 있습니다.
지금부터 한 줄씩 따라하면서 STM32에서 실행 시간을 측정하는 방법을 알아볼게요. 끝까지 읽으면 코드 성능을 분석하고 개선하는 데 어떤 식으로 이 기능을 활용할 수 있는지 명확하게 감이 올 겁니다.
DWT 사이클 카운터 활성화 방법
먼저 DWT를 사용하려면, 시스템에서 해당 기능을 활성화해야 합니다. STM32에서 기본적으로 이 기능은 비활성화되어 있기 때문에 수동으로 켜야 해요.
다음 코드를 STM32 프로젝트 초기화 부분에 넣어주세요:
// Enable DWT Cycle Counter ------------------------------------------------------
if (!(CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk))
{
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // Enable TRCENA
}
DWT->CYCCNT = 0; // Reset cycle counter
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // Enable cycle counter
// -------------------------------------------------------------------------------
여기서 중요한 건 TRCENA 비트를 켜줘야 사이클 카운터가 동작한다는 점이에요. 안 그러면 CYCCNT는 그냥 0만 반환하게 됩니다.
실행 시간 측정 코드 예시
이제 본격적으로 실행 시간을 측정해 볼까요?
uint32_t start = DWT->CYCCNT;
// 측정할 코드
uint32_t end = DWT->CYCCNT;
uint32_t cycles = end - start;
위 코드에서 cycles는 CPU가 해당 코드 블록을 실행하는 동안 몇 번 클럭이 돌았는지를 나타냅니다. 즉, 얼마나 바쁘게 일했는지를 보여주는 지표죠.
사이클을 시간으로 바꾸는 공식
사이클 수만 가지고는 감이 안 오죠? 그래서 이걸 실제 시간으로 바꿔줘야 합니다.
예를 들어 CPU가 100MHz로 동작하고 있고, 100,000 사이클이 걸렸다면:

즉, cycles는 CPU 클럭 주기 수이기 때문에, 해당 값을 CPU 클럭 속도로 나누면 실제 시간을 얻을 수 있습니다.
이걸 코드로 나타내면 다음과 같습니다:
uint32_t cpu_clock_hz = 100000000;
// convert the cycle to time (seconds).
float execution_time_sec = (float)cycles / cpu_clock_hz;
// convert to milliseconds.
float execution_time_ms = execution_time_sec * 1000.0f;
printf("Execution time in cycles: %u, time: %f ms\n", cycles, execution_time_ms);
이렇게 하면 초 단위는 물론 밀리초, 마이크로초 단위로도 손쉽게 확인할 수 있어요.
실전 예시: 코드 최적화 전후 비교
제가 실제로 경험한 일이에요. UART로 데이터를 송신하는 루틴을 작성했는데, 너무 느리다는 느낌이 들더라고요. 그래서 DWT를 이용해 HAL_UART_Transmit 함수의 실행 시간을 측정해 봤습니다. 측정해 보니 무려 1.2ms나 걸리더라고요. 이후 DMA 방식으로 전환했더니 0.3ms로 줄었죠.
덕분에 "느낌"이 아닌 "데이터"로 문제를 확인하고 개선할 수 있었습니다.
마무리하며
- DWT 사이클 카운터는 STM32에서 매우 정밀한 성능 분석 도구입니다.
- 코드 블록의 실행 시간을 마이크로초까지 정확히 측정할 수 있죠.
- CPU 클럭 속도만 안다면 언제든 시간 단위로 변환할 수 있어요.
- 실제 프로젝트에서 병목 지점을 찾고 성능을 향상시키는 데 큰 도움이 됩니다.
혹시 지금 성능에 의심이 가는 코드가 있다면, 바로 측정해 보세요. 생각보다 더 많은 인사이트를 얻을 수 있을 거예요.