Data Watchpoint and Trace. 외부 장비 없이 시간을 재는 가장 정확한 자다.
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
uint32_t t0 = DWT->CYCCNT;
do_work();
uint32_t cycles = DWT->CYCCNT - t0; /* 80MHz 면 1사이클 = 12.5ns */
무엇에 쓰나
함수 실행 시간 측정 평균이 아니라 최댓값을 기록하는 것이 중요하다
인터럽트 지연 측정 ISR 진입 시점에 카운터를 읽어 비교
프로파일링 주기적으로 PC 를 샘플링해 어디가 느린지 본다
워치포인트 같은 유닛이 제공한다
주의
- 카운터는 32비트라 80MHz 에서 약 53초에 한 바퀴 돈다. 뺄셈으로 쓰면 한 주기 안에서는 정확하다
- 측정 코드 자체가 몇 사이클을 쓴다 — 짧은 구간을 잴 때는 그 오버헤드를 빼야 한다
- 디버거 연결 여부에 따라 동작이 달라질 수 있어 자유 실행 상태에서 실측한다