칩 제조사와 무관하게 모든 Cortex-M 에 있는 타이머라 이식성이 좋다.
SysTick_Config(SystemCoreClock / 1000u); /* 1ms 마다 인터럽트 */
volatile uint32_t ms_ticks;
void SysTick_Handler(void) { ms_ticks++; }
무엇에 쓰나
- 시간 기준 —
now_ms()의 근거 - RTOS 틱 — 스케줄러가 태스크를 교체하는 주기
- 간단한 지연 — 다만 바쁜 대기 지연은 되도록 피한다
24비트라는 제약
최대 계수값이 약 1,677만이다. 클럭이 빠르면 한 주기가 짧아 긴 시간을 직접 못 잰다. 긴 시간은 인터럽트 횟수를 세어 확장한다.
시간 비교는 뺄셈으로
if ((uint32_t)(now_ms() - start) >= timeout) { } /* 오버플로에도 안전 */
if (now_ms() >= start + timeout) { } /* 오버플로에서 깨진다 */
부호 없는 뺄셈이 순환을 흡수한다. 임베디드 시간 비교의 관용구다.