임베디드 용어 사전
C 함정

재진입

실행 도중 다시 불려도 결과가 망가지지 않는 성질. 정적 상태나 공유 버퍼가 있으면 재진입 안전하지 않다.

인터럽트가 있는 환경에서는 모든 함수가 두 번 겹쳐 불릴 수 있다고 봐야 한다.

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 이 같은 락을 잡으려 하면 데드락이 된다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 임베디드 C 함정 — 컴파일은 되는데 틀린 것들