volatile, const, static
최적화를 막는 volatile, 값을 고정하는 const, 범위와 수명을 바꾸는 static. 임베디드에서 가장 자주 묻는 키워드 세 개.
volatile
컴파일러는 "이 변수는 내 코드 말고는 아무도 안 바꾼다"고 가정하고 읽기를 생략합니다. 하드웨어 레지스터나 인터럽트에서 바꾸는 플래그는 그 가정이 틀립니다.
volatile uint8_t rx_done = 0; // ISR에서 1로 바뀜
while (!rx_done) { } // volatile이 없으면 무한 루프가 될 수 있음
volatile은 매번 메모리에서 읽게 할 뿐, 여러 바이트 값을 한 번에 읽는 원자성까지 보장하지는 않습니다.
const
값을 바꿀 수 없다고 약속합니다. 큰 룩업 테이블에 const를 붙이면 RAM이 아니라 Flash에 놓여 RAM을 아낍니다. 함수 인자에 붙이면 "이 버퍼는 읽기만 한다"는 문서 역할도 합니다.
static
- 함수 밖 변수와 함수에 붙이면: 이 파일 안에서만 보입니다. 모듈 내부를 숨기는 도구입니다.
- 함수 안 변수에 붙이면: 함수가 끝나도 값이 남습니다. 호출 횟수를 세거나 이전 값을 기억할 때 씁니다.