이번 시간에는 Task에 이어 임계 영역(Critical Section)에 대해 알아보자.
왜 임계 영역이 필요하고 사용하는 이유는 무엇일까?
임계 영역은 어떠한 외부 요인에 의해서도 방해받지 않는 영역을 의미한다.
임계 영역의 특징을 알아보자.
이러한 임계 영역을 어떨 때 사용할까?
먼저 다음과 같은 상황을 가정해보자.
만약 외부 인터럽트의 발생과 태스크 A의 UART 데이터 전송 타이밍이 겹친다면 어떻게 될까?
두 태스크는 UART 통신 함수를 동시에 불러올 것이다.
이 떄, UART 통신 함수의 호출 전후로 임계 영역 진입 및 진출 코드를 작성한다면?
이러한 함수 호출로 인한 충돌은 방지된다.
코드를 보면서 분석해보자.
SendMessage라는 공용 함수가 있고, myTask2라는 태스크 함수가 있다.
이 태스크 함수가 매 주기 마다 실행된다고 가정해보자.
메시지를 UART 통신으로 전송하는데 만약 우선 순위가 더 높은 태스크 실행이 요청된다면?
아마 데이터 전송이 비정상적으로 될 가능성이 있다.
태스크의 우선 순위를 무시하고 코드 실행을 정상적으로 할 수 있도록 도와주는 것이 임계 영역과 관련된 코드이다.
taskENTER_CRITICAL()으로 임계 영역으로 진입하고, taskEXIT_CRITICAL()으로 임계 영역에서 빠져나온다.
하지만, 이러한 임계 영역의 진입 및 탈출이 절대적인 것은 아니다.
모든 인터럽트를 무시하진 않지만, 거의 모든 인터럽트를 무시한다.
가장 중요한 인터럽트는 무시할 수 없기 때문이다.
구조체와 포인터 사용 예시 (0) | 2023.01.29 |
---|---|
RTOS 개념 정리 (3) - 세마포어 (1) | 2023.01.28 |
RTOS 개념 정리 (1) - Task (2) | 2023.01.28 |
RTOS 맛보기 (5) - Task 생성하기(최종 실습) (0) | 2023.01.27 |
RTOS 맛보기 (4) - 인터럽트로 문자열 출력하기 (0) | 2023.01.26 |