임계 영역은 외부 요인에 의해 방해받지 않고 태스크 전환도 이뤄지지 않는 경우에 사용했다.
그런데 세마포어는 조금 더 하위 개념이다.
공유 자원(공용 함수 등)을 여러 태스크가 동시에 접근하여 사용할 수 없도록 하는 기능이다.
아직 지금 지식 수준에서는 실제 코딩에서 세마포어만 사용할 것 같다.
좀 더 배워야 할 것 같다.
세마포어는 여러 태스크가 공유 자원을 나눠서 처리하는 방식을 다루는 것이다.
세마포어에는 2가지 방식이 있다.
내가 속한 회사에서는 서보 제어기를 설계하는 데 복잡한 프로그램이 필요하지 않다.
그래서 Binary Semaphore 정도로만 사용하고 있다.
보통 서보 모터 드라이브를 설계한다면, 태스크 간 데이터 교환이 잦거나 하지 않기 때문에 굳이 필요 없다고 본다.
물론 하나의 MCU에서 여러 축 모터를 제어한다면 얘기가 달라질 수 있곘지만.
각 태스크가 공유 자원에 접근하는 것은 운영체제의 허락을 맡아야 한다.
아래 그림을 보면서 개념을 이해해보자.
위와 같은 순서로 세마포어가 동작한다.
열쇠를 받아서(Take) 공유 자원의 자물쇠를 열고 사용한 다음, 사용이 끝나면 열쇠로 잠그고 열쇠를 반납한다(Give).
그렇다면, 코드를 작성할 떈 어떻게 해야 할까?
아래의 코드를 보자.
아래와 같이 코드를 작성한다면, TaskA 함수는 매 실행 주기마다 세마포어 열쇠를 얻으면, 작성된 코드대로 실행될 것이다.
그렇다면, Counting Semaphore는 어떨까?
xSemaphoreCreateCounting(gHandler, gCount) 를 사용하여 선언한다.
gCount의 값이 10이라면, 동시에 10개의 태스크가 공유자원에 접근 가능하다.
예를 들어, 현재 10 개의 태스크가 공유 자원에 접근하고 있다고 가정해보자.
이 중 하나의 태스크가 작업을 마쳐서 열쇠를 반납(Give)한다면 열쇠 1개가 남는다.
이 때, 대기 중인 태스크가 있다면 열쇠 1개를 받아서 공유 자원에 접근할 것이다.
freeRTOS에서는 Take와 Give라는 개념을 사용한다.
다른 RTOS 시스템에서는 Pend와 Post라는 용어를 사용한다.
TI의 RTOS인 sys/bios에서는 Pend와 Post로 부른다.
Counting Semaphore의 특징은 다음과 같다.
※ 뮤텍스의 개념도 있지만, 내가 사용할 일이 없을 것 같아서 넘어간다.
서보 드라이버에서 실시간성 구현 방법 (0) | 2023.01.29 |
---|---|
구조체와 포인터 사용 예시 (0) | 2023.01.29 |
RTOS 개념 정리 (2) - 임계 영역 (1) | 2023.01.28 |
RTOS 개념 정리 (1) - Task (2) | 2023.01.28 |
RTOS 맛보기 (5) - Task 생성하기(최종 실습) (0) | 2023.01.27 |