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

노트 / RTOS

펌웨어RTOS6 / 8

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

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

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

시나리오

H (높음)M (중간)L (낮음)H가 기다림L이 잠금H 깨어남M 실행L이 풂H 실행
우선순위 역전. H는 L이 쥔 뮤텍스를 기다리는데, M이 L을 밀어내 H가 M만큼 더 기다립니다.
  1. L(낮음)이 SPI 뮤텍스를 잡음
  2. H(높음)가 깨어나 같은 뮤텍스를 기다리며 Blocked
  3. M(중간)이 깨어남. L보다 높으니 L을 선점
  4. M이 오래 실행되는 동안 L은 뮤텍스를 못 돌려주고, H는 M 때문에 무기한 기다림

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

해결: 우선순위 상속

H (높음)M (중간)L (낮음)H가 기다림L이 잠금H 깨어남H 실행M 실행
우선순위 상속. L이 잠깐 H의 우선순위로 올라가 M에게 밀리지 않고 뮤텍스를 빨리 돌려줍니다.

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

설계로 피하기

  • 뮤텍스를 잡고 있는 구간을 짧게
  • 공유 자원을 담당 태스크 하나에 맡기고 나머지는 큐로 요청
  • 우선순위 천장 프로토콜: 자원을 잡으면 그 자원을 쓰는 가장 높은 태스크 우선순위로 즉시 올림
3D 실험실에서 직접 돌려 보기값을 바꾸며 이 노트의 원리를 확인합니다→영상으로 이어 보기RC카 만들기 시리즈 6편대기업 임베디드 개발자 Lego RC카 메이킹 시작합니다. 【RC카 개발1】FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →