그라운드 임베디드 유튜브 구독

노트 / RTOS

펌웨어RTOS6 / 8

우선순위 역전: 낮은 태스크가 높은 태스크를 막을 때

낮은 태스크가 잡은 뮤텍스 때문에 높은 태스크가 멈추고, 그 사이 중간 태스크가 CPU를 차지합니다. 화성 탐사선도 겪은 문제.

GROUND EMBEDDED · 정리 노트RTOS 06우선순위 역전01시나리오02해결: 우선순위상속03설계로 피하기

시나리오

  1. L(낮음)이 SPI 뮤텍스를 잡음
  2. H(높음)가 깨어나 같은 뮤텍스를 기다리며 Blocked
  3. M(중간)이 깨어남. L보다 높으니 L을 선점
  4. M이 오래 실행되는 동안 L은 뮤텍스를 못 돌려주고, H는 M 때문에 무기한 기다림

H는 M과 아무 관계가 없는데도 M에게 막힙니다. 1997년 화성 패스파인더가 이 문제로 반복 리셋되었습니다.

해결: 우선순위 상속

H가 L이 가진 뮤텍스를 기다리는 동안, L의 우선순위를 H만큼 잠시 올립니다. 그러면 M이 L을 선점하지 못하고, L은 빨리 일을 끝내 뮤텍스를 돌려줍니다. FreeRTOS의 뮤텍스(xSemaphoreCreateMutex)에는 이 기능이 들어 있지만, 이진 세마포어에는 없습니다. 자원 보호에는 반드시 뮤텍스를 씁니다.

설계로 피하기

  • 뮤텍스를 잡고 있는 구간을 짧게
  • 공유 자원을 담당 태스크 하나에 맡기고 나머지는 큐로 요청
  • 우선순위 천장 프로토콜: 자원을 잡으면 그 자원을 쓰는 가장 높은 태스크 우선순위로 즉시 올림