[FreeRTOS] 뮤텍스

seopppio·2024년 11월 4일

FreeRTOS

목록 보기
8/14

우선 순위 역전


1. T3가 어떤 임계구역(Critical Section)에 들어가서, 테스크 진행 중이다가, 우선순위가 높은 Task1이 Ready가 되어서, 선점하여 태스크1이 작동 됨
2. 태스크1에서도 임계구역에 진입을 하고 싶어서 P연산 하지만, 이미 Task3에서 임계구역에 있어서, 테스크1이 Blocked 된다.
3. Task3가 마저 실행되다가 또 Task2에 선점 된다.

T1이 T2보다 우선순위가 높은데, T1이 아닌, T2가 선점하게 된다

  1. T2가 다 쓰고 Yield하면 T3가 다시 선점하고, 이후 Give하여 임계구역 빠져나가면 휴면하고 있던 T1이 깨어나서 T1이 진행

이 과정은 분명 문제가 있다 -> 이것을 어떻게 해결할까?

->Task3의 우선 순위를 임시적으로 높이면 해결이 가능하다!!


Task3가 임계구역을 빠져나가면, Task1이 실행되도록 한다
-> 우선 순위 역전 현상 막았음

뮤텍스 잠금과 뮤텍스 잠금 해제로 구현한다
세마포 Take -> 뮤텍스 잠금
세마포 Give -> 뮤텍스 잠금 해제

우선 순위 상속

임시로 테스크가 우선 순위가 올라갔다가, 다시 낮아진다
-> 역전 예방하는 우선 순위 상속 예방 메커니즘구현

우선 순위 상속/천정

  • 우선 순위 상속 : T1의 우선 순위를 그대로 승계
  • 우선 순위 천정 : 뮤텍스에 우선순위를 저장해두었다가, 우선순위가 필요한 태스크에 할당
    (미리 뮤텍스의 우선순위가 매우 높은 것을 하나 미리 설정해둔다.)

    FreeRTOS는 천정이 아닌, 상속 기법을 지원한다. but 둘 다 기억해두자

Mutex(Mutual Exclusion Semaphore)

뮤텍스 : 세마포 기술 기반, 상호 배제용으로 특별히 디자인 해둔 것, 우선순위전도 문제를 해결할 수 있다

즉, 상호 배제용 바이너리 세마포라고 생각해도 된다

  • xSemaphoreCreateMutex() = 뮤텍스 생성
  • xSemaphoreTake() = P연산, 잠금
  • xSemaphoreGive() = V연산, 잠금 해제

상호배제를 고려한 디바이스 드라이버

FreeRTOS는 디바이스 드라이브를 사용하지 않는다

Application 입장에서는 HardWare가 뭔지 관심 없다.
Application에서 일관된 방법으로 호출하면, 내부적으로 VFS에서 각기 다른 디바이스 드라이버를 호출하여 HardWare를 사용한다

Application은 디바이스 드라이버하고 별개된 격리된 방법으로 개발이 가능하다

디바이스 드라이버를 RTOS에 담고 있다면

장점 : 테스크 어플리케이션과 디바이스 드라이버를 분리가 가능하다
단점 : 개발자가 더 많은 지식을 가지고 있어야 한다

상호배제를 고려한 IO 장치 드라이버 예

ADC 하드웨어가 T1과 T2에서 서로 다른 목적을 위해 사용된다
-> 임계구역이 만들어진다 -> 상호배제가 필요하다

각 드라이버들이 같은 하드웨어를 접근하려고 한다 -> 동시 접근 이슈 생김

각 상위 디바이스 드라이버가 하위 디바이스 드라이버인 ADC 드라이버를 접근하면서 임계구역이 생긴다

-> 상호배제를 활용해서 해결

  • 디바이스드라이버가 없는 FreeRTOS에서도, 각기 다른 테스크가 I2C같은 기능을 사용하려고 접근하고자 하면, 임계구역을 꼭 위와 같이 설정해주자

FreeRTOS에서의 디바이스 드라이버

  1. 펌웨어 방식으로 코딩
  2. 임계구역을 확인
  3. 상호배제 후 사용

0개의 댓글