상세 컨텐츠

본문 제목

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

펌웨어 설계

by Zin9 2023. 1. 28. 18:30

본문

728x90

 

 

RTOS 개념 정리 (1) - Task

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

zin9.tistory.com

 

이번 시간에는 Task에 이어 임계 영역(Critical Section)에 대해 알아보자.

 

왜 임계 영역이 필요하고 사용하는 이유는 무엇일까?

 

임계 영역은 어떠한 외부 요인에 의해서도 방해받지 않는 영역을 의미한다.

임계 영역의 특징을 알아보자.

 

  1. 외부 인터럽트에 의해 중단되지 않는다.
  2. 태스크 전환이 일어나지 않는다.
  3. 여러 태스크 또는 인터럽트에 의해 공유된 자원에 대한 독점적 사용을 보장한다.
  4. Core의 관점에서 인터럽트를 금지한다.

 

이러한 임계 영역을 어떨 때 사용할까?

먼저 다음과 같은 상황을 가정해보자.

 

  • 태스크 A와 B는 모두 공용 함수로 UART 통신 함수를 사용한다.
  • 이 떄, 두 태스크는 공통된 UART 포트를 사용한다.
  • 태스크 A는 매 10[ms]마다 UART로 데이터를 전송한다.
  • 태스크 B는 외부 인터럽트 발생 시 UART로 데이터를 전송한다.

 

만약 외부 인터럽트의 발생과 태스크 A의 UART 데이터 전송 타이밍이 겹친다면 어떻게 될까?

두 태스크는 UART 통신 함수를 동시에 불러올 것이다.

이 떄, UART 통신 함수의 호출 전후로 임계 영역 진입 및 진출 코드를 작성한다면?

이러한 함수 호출로 인한 충돌은 방지된다.

 

 

 

코드를 보면서 분석해보자.

SendMessage라는 공용 함수가 있고, myTask2라는 태스크 함수가 있다.

이 태스크 함수가 매 주기 마다 실행된다고 가정해보자.

메시지를 UART 통신으로 전송하는데 만약 우선 순위가 더 높은 태스크 실행이 요청된다면?

아마 데이터 전송이 비정상적으로 될 가능성이 있다.

태스크의 우선 순위를 무시하고 코드 실행을 정상적으로 할 수 있도록 도와주는 것이 임계 영역과 관련된 코드이다.

taskENTER_CRITICAL()으로 임계 영역으로 진입하고, taskEXIT_CRITICAL()으로 임계 영역에서 빠져나온다.

 

 

하지만, 이러한 임계 영역의 진입 및 탈출이 절대적인 것은 아니다.

모든 인터럽트를 무시하진 않지만, 거의 모든 인터럽트를 무시한다.

가장 중요한 인터럽트는 무시할 수 없기 때문이다.

 

 

728x90

관련글 더보기