FreeRTOS

FreeRTOS 기본 개념과 구현 방법

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

FreeRTOS 기본 개념

FreeRTOS는 실시간 운영체제(RTOS)로, 임베디드 시스템에서 태스크(Task) 관리, 시간 제어, 동기화 등의 기능을 제공합니다. FreeRTOS는 경량화되어 있으며, 다양한 마이크로컨트롤러에서 사용할 수 있어, 실시간 시스템 설계에 적합합니다.

CMSIS-RTOS는 ARM Cortex-M 계열 마이크로컨트롤러를 위한 표준화된 RTOS API를 제공합니다. CMSIS-RTOS v1은 FreeRTOS와 같은 다양한 RTOS를 위한 추상화 계층을 제공하여 호환성과 이식성을 높입니다.


FreeRTOS의 핵심 요소

1. Task (태스크)

개념

태스크는 FreeRTOS에서 실행되는 독립적인 코드 실행 단위입니다. 각각의 태스크는 고유한 스택과 상태를 가지며, 운영체제 스케줄러에 의해 관리됩니다. 태스크는 우선순위에 따라 실행 순서가 결정됩니다.

주요 특징

  • 태스크는 xTaskCreate API를 사용해 생성합니다.
  • 태스크 간 우선순위를 설정하여, 더 높은 우선순위의 태스크가 먼저 실행됩니다.
  • 태스크는 실행, 대기, 중단 등의 상태를 가집니다.

구현 예제

#include "FreeRTOS.h"
#include "task.h"

void Task1(void *pvParameters) {
    while (1) {
        // Task 1 실행 코드
        vTaskDelay(pdMS_TO_TICKS(1000)); // 1초 대기
    }
}

void Task2(void *pvParameters) {
    while (1) {
        // Task 2 실행 코드
        vTaskDelay(pdMS_TO_TICKS(500)); // 0.5초 대기
    }
}

int main(void) {
    xTaskCreate(Task1, "Task1", 128, NULL, 1, NULL);
    xTaskCreate(Task2, "Task2", 128, NULL, 2, NULL);
    vTaskStartScheduler();

    while (1); // 실행 불가 상태
}

2. Queue (큐)

개념

큐는 태스크 간 데이터를 안전하게 전송하기 위해 사용됩니다. 큐는 FIFO(First In, First Out) 구조로 데이터를 관리하며, 동기화와 데이터 공유 문제를 해결합니다.

주요 특징

  • xQueueCreate로 큐 생성
  • xQueueSendxQueueReceive로 데이터 송수신

구현 예제

#include "FreeRTOS.h"
#include "queue.h"

QueueHandle_t xQueue;

void SenderTask(void *pvParameters) {
    int dataToSend = 100;
    while (1) {
        xQueueSend(xQueue, &dataToSend, portMAX_DELAY);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void ReceiverTask(void *pvParameters) {
    int receivedData;
    while (1) {
        if (xQueueReceive(xQueue, &receivedData, portMAX_DELAY) == pdPASS) {
            // 데이터 처리
        }
    }
}

int main(void) {
    xQueue = xQueueCreate(5, sizeof(int));
    xTaskCreate(SenderTask, "Sender", 128, NULL, 1, NULL);
    xTaskCreate(ReceiverTask, "Receiver", 128, NULL, 2, NULL);
    vTaskStartScheduler();

    while (1);
}

3. Semaphore (세마포어)

개념

세마포어는 태스크 간의 동기화에 사용됩니다. FreeRTOS에서는 이진 세마포어와 카운팅 세마포어를 제공합니다.

주요 특징

  • 리소스 접근 제어에 사용
  • xSemaphoreGivexSemaphoreTake로 세마포어 관리

구현 예제

#include "FreeRTOS.h"
#include "semphr.h"

SemaphoreHandle_t xSemaphore;

void TaskWithSemaphore(void *pvParameters) {
    while (1) {
        if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdPASS) {
            // 공유 리소스 사용
            xSemaphoreGive(xSemaphore);
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

int main(void) {
    xSemaphore = xSemaphoreCreateBinary();
    xSemaphoreGive(xSemaphore);

    xTaskCreate(TaskWithSemaphore, "Task1", 128, NULL, 1, NULL);
    vTaskStartScheduler();

    while (1);
}

4. Mutex (뮤텍스)

개념

뮤텍스는 리소스를 잠금(Lock)하여 단일 태스크가 안전하게 사용하도록 보장합니다. 세마포어와 유사하지만, 우선순위 역전 문제를 해결합니다.

주요 특징

  • 리소스 보호에 최적화
  • xSemaphoreCreateMutex로 생성

구현 예제

#include "FreeRTOS.h"
#include "semphr.h"

SemaphoreHandle_t xMutex;

void TaskWithMutex(void *pvParameters) {
    while (1) {
        if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdPASS) {
            // 리소스 사용
            xSemaphoreGive(xMutex);
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

int main(void) {
    xMutex = xSemaphoreCreateMutex();

    xTaskCreate(TaskWithMutex, "Task1", 128, NULL, 1, NULL);
    xTaskCreate(TaskWithMutex, "Task2", 128, NULL, 2, NULL);
    vTaskStartScheduler();

    while (1);
}

5. 실시간 운영체제의 우선순위와 시간 관리

개념

우선순위는 태스크 실행 순서를 결정하며, 시간 관리는 태스크 간 정확한 실행 간격을 보장합니다. FreeRTOS는 타이머 틱을 사용해 시간을 관리합니다.

주요 기능

  • vTaskDelay: 태스크 지연
  • xTaskGetTickCount: 현재 틱 획득
  • 우선순위 설정으로 실시간 응답 보장

구현 예제

void TaskWithPriority(void *pvParameters) {
    while (1) {
        // 태스크 실행 코드
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

int main(void) {
    xTaskCreate(TaskWithPriority, "HighPriorityTask", 128, NULL, 3, NULL);
    xTaskCreate(TaskWithPriority, "LowPriorityTask", 128, NULL, 1, NULL);
    vTaskStartScheduler();

    while (1);
}

결론

FreeRTOS는 임베디드 시스템에서 필수적인 실시간 운영체제 기능을 제공합니다. 태스크, 큐, 세마포어, 뮤텍스 등의 핵심 요소를 이해하고 활용하면, 효율적인 실시간 시스템을 설계할 수 있습니다. CMSIS-RTOS v1과 FreeRTOS를 결합하여 더 나은 호환성과 성능을 얻을 수 있습니다.

반응형