인터럽트가 있는 환경에서는 모든 함수가 두 번 겹쳐 불릴 수 있다고 봐야 한다.
char buf[32]; /* 공유 버퍼 */
void log_value(int v) {
sprintf(buf, "%d", v); /* 메인이 여기까지 왔을 때 */
send(buf); /* ISR 이 같은 함수를 부르면 buf 가 덮인다 */
}
ISR 에서 피해야 할 것들
printf 계열 내부 버퍼와 정적 상태를 공유한다
malloc/free 힙 자료구조가 깨질 수 있다
strtok · time 내부 정적 상태를 갖는다
공유 전역을 쓰는 함수
재진입 안전하게 만드는 법
정적·전역 상태를 없앤다 결과를 호출자가 준 버퍼에 쓴다
필요하면 임계 구역으로 감싼다 단, ISR 지연이 늘어난다
ISR 은 플래그만 세우고 미룬다 가장 확실한 해법
스레드 안전과 다르다
재진입 안전은 같은 스레드에서 중첩 호출까지 포함한다. 락으로 보호한 함수는 스레드 안전하지만, ISR 이 같은 락을 잡으려 하면 데드락이 된다.