Firmware & RTOS/FreeRTOS & Real-time Scheduling

FreeRTOS 핵심 개념 완벽 정리: Task, Queue, Semaphore, Mutex 활용법

임베디드 친구 2025. 1. 11. 11:13
728x90
반응형

임베디드 시스템의 복잡도가 높아지면서 실시간성(Real-Time)을 보장하는 RTOS(Real-Time Operating System)의 중요성이 더욱 커지고 있습니다. 그중에서도 FreeRTOS는 가볍고 강력한 기능으로 전 세계 임베디드 개발자들이 가장 많이 사용하는 운영체제입니다.

이번 포스팅에서는 FreeRTOS의 핵심 5가지 요소인 Task, Queue, Semaphore, Mutex, 시간 관리의 개념을 살펴보고, 실제 구현 예제를 통해 실전 활용법을 정리해 보겠습니다.

Generated by Gemini AI.


1. Task (태스크): 독립적인 실행 단위

태스크는 FreeRTOS에서 실행되는 가장 기본적인 코드 실행 단위입니다. 멀티태스킹 환경에서 각 태스크는 스케줄러에 의해 관리되며, 마치 여러 프로그램이 동시에 돌아가는 것과 같은 효과를 줍니다.

  • 독립성: 각 태스크는 자신만의 스택(Stack)과 상태를 가집니다.
  • 우선순위: xTaskCreate 시 지정한 우선순위에 따라 스케줄러가 실행 순서를 결정합니다.

핵심 코드 예시

C
 
// 태스크 핸들 정의
void vTaskFunction(void *pvParameters) {
    for (;;) {
        // 코드 실행
        vTaskDelay(pdMS_TO_TICKS(1000)); // 1초 대기 (Blocked 상태 전환)
    }
}

// 태스크 생성 (함수, 이름, 스택크기, 파라미터, 우선순위, 핸들)
xTaskCreate(vTaskFunction, "Task1", 128, NULL, 1, NULL);

2. Queue (큐): 태스크 간 안전한 데이터 통신

태스크 간에 데이터를 주고받을 때 전역 변수를 사용하면 데이터 오염이 발생할 수 있습니다. Queue(큐)는 FIFO(First In, First Out) 구조로 태스크 간 데이터를 안전하게 전송(Inter-task Communication)하는 통로 역할을 합니다.

  • 동기화 보장: 데이터가 들어오거나 나갈 때까지 태스크를 대기 상태(Wait)로 만들 수 있습니다.
  • 데이터 보호: OS 레벨에서 임계 영역을 보호하여 데이터 무결성을 유지합니다.

3. Semaphore & Mutex (세마포어와 뮤텍스): 동기화와 자원 보호

많은 초보 개발자가 혼동하는 두 개념의 차이를 명확히 이해하는 것이 중요합니다.

3.1 Semaphore (세마포어)

주로 이벤트 알림(Signaling)이나 동기화에 사용됩니다. 예를 들어, 인터럽트가 발생했음을 특정 태스크에 알릴 때 사용합니다.

  • Binary Semaphore: 0과 1의 상태만 가짐.
  • Counting Semaphore: 여러 개의 리소스 수량을 관리할 때 사용.

3.2 Mutex (뮤텍스)

공유 리소스(예: UART, I2C, SPI)를 단일 태스크가 독점하도록 보호할 때 사용합니다.

  • 우선순위 상속(Priority Inheritance): 낮은 우선순위 태스크가 뮤텍스를 쥐고 있을 때 높은 우선순위 태스크가 요청하면, 하위 태스크의 우선순위를 일시적으로 높여 우선순위 역전 현상을 방지합니다.
구분 Semaphore Mutex
주요 용도 태스크 간 동기화, 이벤트 신호 공유 리소스 배타적 접근 보호
소유권 없음 (누구나 Give 가능) 소유권 있음 (Take한 태스크만 Give 가능)

4. 실시간 시간 관리 (Time Management)

FreeRTOS는 시스템 틱(System Tick)을 사용하여 시간을 관리합니다.

  • vTaskDelay: 지정된 시간 동안 태스크를 Blocked 상태로 만들어 다른 태스크가 실행될 수 있게 합니다.
  • vTaskDelayUntil: 절대적인 주기를 보장해야 하는 주기적인 제어 루프에 적합합니다.

5. CMSIS-RTOS v1과의 결합

ARM Cortex-M 계열을 사용한다면 CMSIS-RTOS 추상화 계층을 사용하는 경우가 많습니다.

  • 이식성: 코드를 한 번 작성하면 FreeRTOS가 아닌 다른 RTOS(예: RTX)로 변경해도 API를 그대로 사용할 수 있습니다.
  • 표준화: osThreadCreate, osMessagePut 등 직관적인 표준 API를 제공합니다.

결론: 효율적인 실시간 시스템 설계를 위하여

FreeRTOS의 핵심 요소인 Task, Queue, Semaphore, Mutex를 적재적소에 활용하면 시스템의 응답성과 안정성을 획기적으로 높일 수 있습니다. 본인의 프로젝트 특성에 맞춰 우선순위를 설계하고 적절한 동기화 도구를 선택해 보시기 바랍니다.

반응형