상세 컨텐츠

본문 제목

RTOS 개념 정리 (3) - 세마포어

펌웨어 설계

by Zin9 2023. 1. 28. 20:05

본문

728x90

 

 

RTOS 개념 정리 (2) - 임계 영역

RTOS 개념 정리 (1) - Task RTOS 맛보기를 마치고, 기본 개념을 정리하고자 한다. 태스크(Task) 태스크의 개념에 대해 알아보자. 그림 1을 보면, 3개의 태스크가 순차적으로 실행되고 있다. 정해진 시간(

zin9.tistory.com

 

임계 영역은 외부 요인에 의해 방해받지 않고 태스크 전환도 이뤄지지 않는 경우에 사용했다.

그런데 세마포어는 조금 더 하위 개념이다.

공유 자원(공용 함수 등)을 여러 태스크가 동시에 접근하여 사용할 수 없도록 하는 기능이다.

아직 지금 지식 수준에서는 실제 코딩에서 세마포어만 사용할 것 같다.

좀 더 배워야 할 것 같다.

 

 

세마포어는 여러 태스크가 공유 자원을 나눠서 처리하는 방식을 다루는 것이다.

 

세마포어에는 2가지 방식이 있다.

  1. Binary Semaphore - 하나의 공유 자원에 대한 독점적 사용
                                     태스크~태스크, 태스크~인터럽트 사이의 동기화
  2. Counting Semaphore - 하나의 이벤트에 대한 다수의 발생 처리
                                          하나의 공유자원에 대한 다수 태스크의 샤용

 

내가 속한 회사에서는 서보 제어기를 설계하는 데 복잡한 프로그램이 필요하지 않다.

그래서 Binary Semaphore 정도로만 사용하고 있다.

보통 서보 모터 드라이브를 설계한다면, 태스크 간 데이터 교환이 잦거나 하지 않기 때문에 굳이 필요 없다고 본다.

물론 하나의 MCU에서 여러 축 모터를 제어한다면 얘기가 달라질 수 있곘지만.

 

 

 

각 태스크가 공유 자원에 접근하는 것은 운영체제의 허락을 맡아야 한다.

아래 그림을 보면서 개념을 이해해보자.

 

 

위와 같은 순서로 세마포어가 동작한다.

열쇠를 받아서(Take) 공유 자원의 자물쇠를 열고 사용한 다음, 사용이 끝나면 열쇠로 잠그고 열쇠를 반납한다(Give).

 

그렇다면, 코드를 작성할 떈 어떻게 해야 할까?

 

아래의 코드를 보자.

  1. main 함수 바깥에 세마포어 키를 선언한다.
  2. OS 초기화 함수 전에 세마포어 키를 생성한다.
  3. 생성된 세마포어 키를 반납한다(GIve).
  4. 태스크에서 세마포어가 필요한 코드에 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의 특징은 다음과 같다.

  • 카운트 값은 최대 사용 가능한 값으로 초기화 한다.
  • 태스크가 세마포어(열쇠)를 획득하면 카운트가 1 만큼 감소한다.
  • 카운트 값이 0이 되면, 더이상 세마포어(열쇠)를 획득할 수 없다.
  • 세마포어(열쇠)를 사용 중인 태스크가 세마포어(열쇠)를 반납하면, 카운트가 1 만큼 증가한다.

 

※ 뮤텍스의 개념도 있지만, 내가 사용할 일이 없을 것 같아서 넘어간다.

728x90

관련글 더보기