FreeRTOS Reference
FreeRTOS 실시간 OS 레퍼런스
FreeRTOS Reference 소개
FreeRTOS API 레퍼런스는 임베디드 시스템 개발에서 자주 사용하는 FreeRTOS 커널 함수를 빠르게 검색할 수 있는 치트 시트입니다. 태스크 관리(xTaskCreate, vTaskDelete, vTaskDelay, vTaskDelayUntil), 큐를 통한 태스크 간 통신(xQueueCreate, xQueueSend, xQueueReceive), 바이너리 및 카운팅 세마포어, 우선순위 상속이 포함된 뮤텍스, 소프트웨어 타이머, 그리고 pvPortMalloc과 vPortFree를 사용한 힙 메모리 관리까지 여섯 가지 핵심 영역을 다룹니다.
FreeRTOS는 ARM Cortex-M, RISC-V, ESP32, STM32, AVR 등 수백 종의 마이크로컨트롤러에서 동작하는 세계 최다 배포 실시간 운영체제입니다. 펌웨어 엔지니어, 임베디드 시스템 개발자, IoT 제품 팀이 결정론적 멀티태스킹 애플리케이션을 구축하는 데 FreeRTOS를 사용합니다. 인터럽트 서비스 루틴(ISR) 작성, 큐를 이용한 생산자-소비자 패턴 구현, uxTaskGetStackHighWaterMark를 통한 스택 오버플로 진단 시 이 레퍼런스가 특히 유용합니다.
항목은 태스크, 큐, 세마포어, 뮤텍스, 타이머, 메모리 여섯 카테고리로 구성되며, 각 함수마다 프로토타입, 설명, 바로 붙여넣을 수 있는 C 코드 예제를 제공합니다. vTaskDelayUntil을 이용한 주기적 태스크, xSemaphoreGiveFromISR을 이용한 ISR 안전 신호 전달, 재귀 뮤텍스 중첩, 타이머 콜백 패턴, xPortGetFreeHeapSize를 이용한 힙 모니터링 등 실무 시나리오를 모두 포함합니다.
주요 기능
- 태스크 수명주기 API: xTaskCreate, vTaskDelete, vTaskDelay, vTaskDelayUntil, vTaskPrioritySet
- 큐 API: xQueueCreate, xQueueSend, xQueueReceive, xQueuePeek, uxQueueMessagesWaiting
- 세마포어 API: xSemaphoreCreateBinary, xSemaphoreCreateCounting, xSemaphoreGive, xSemaphoreTake, xSemaphoreGiveFromISR
- 뮤텍스 API: 우선순위 상속을 포함한 xSemaphoreCreateMutex, xSemaphoreCreateRecursiveMutex, xSemaphoreTakeRecursive
- 소프트웨어 타이머 API: xTimerCreate, xTimerStart, xTimerStop, xTimerChangePeriod
- 힙 메모리 API: pvPortMalloc, vPortFree, xPortGetFreeHeapSize, uxTaskGetStackHighWaterMark, configTOTAL_HEAP_SIZE
- ISR 안전 변형 함수를 별도로 구분하여 인터럽트 컨텍스트에서의 잘못된 사용 방지
- 모든 항목에 실무 C 코드 예제 포함 — 펌웨어 프로젝트에 바로 붙여넣기 가능
자주 묻는 질문
FreeRTOS란 무엇이고, 이 레퍼런스는 누가 사용하나요?
FreeRTOS는 마이크로컨트롤러용 오픈소스 실시간 운영체제 커널입니다. 이 레퍼런스는 전체 FreeRTOS 문서를 열지 않고도 API 함수명, 파라미터 순서, 사용 패턴을 빠르게 찾아야 하는 임베디드 펌웨어 엔지니어, IoT 개발자, 전자공학 취미 개발자가 사용합니다.
vTaskDelay와 vTaskDelayUntil의 차이는 무엇인가요?
vTaskDelay는 호출 시점으로부터 상대적인 틱 수만큼 태스크를 정지시키므로, 처리 시간이 누적되면 주기가 밀립니다. vTaskDelayUntil은 절대 틱 카운트에 도달할 때까지 정지하므로 정확한 주기를 유지합니다. 제어 루프처럼 정밀한 주기가 필요할 때는 vTaskDelayUntil을 사용해야 합니다.
FreeRTOS에서 뮤텍스와 세마포어는 언제 구분해서 사용해야 하나요?
공유 자원을 보호할 때는 우선순위 역전을 방지하는 우선순위 상속이 포함된 뮤텍스(xSemaphoreCreateMutex)를 사용하세요. 태스크 간 또는 ISR에서 태스크로 신호를 보낼 때처럼 소유권 개념이 필요 없는 경우에는 바이너리 세마포어를 사용하세요.
ISR에서 세마포어를 안전하게 사용하려면 어떻게 해야 하나요?
xSemaphoreGive 대신 ISR 안전 변형인 xSemaphoreGiveFromISR을 사용하세요. BaseType_t 변수를 전달하고 마지막에 portYIELD_FROM_ISR을 호출하여 우선순위가 높은 태스크가 활성화되면 컨텍스트 전환을 요청하세요.
configTOTAL_HEAP_SIZE는 무엇을 제어하나요?
FreeRTOSConfig.h에서 정의하는 configTOTAL_HEAP_SIZE는 pvPortMalloc이 메모리를 할당하는 힙 영역의 전체 크기를 설정합니다. pvPortMalloc이 NULL을 반환하면 힙이 모두 소진된 것입니다. xPortGetFreeHeapSize를 사용하면 런타임에 남은 힙 크기를 확인할 수 있습니다.
FreeRTOS에서 스택 오버플로를 어떻게 탐지하나요?
태스크 내에서 uxTaskGetStackHighWaterMark(NULL)을 호출하면 남은 스택 워드의 최솟값을 얻을 수 있습니다. 값이 0에 가깝다면 스택 오버플로 직전임을 의미합니다. FreeRTOSConfig.h에서 configCHECK_FOR_STACK_OVERFLOW를 1 또는 2로 설정하면 런타임 스택 오버플로 훅을 활성화할 수 있습니다.
pdMS_TO_TICKS와 틱 값 직접 사용의 차이는 무엇인가요?
pdMS_TO_TICKS는 밀리초 단위 시간을 configTICK_RATE_HZ 설정에 맞는 FreeRTOS 틱 수로 변환합니다. 포터빌리티를 위해 항상 pdMS_TO_TICKS를 사용하세요. FreeRTOSConfig.h에서 틱 속도를 변경해도 pdMS_TO_TICKS로 지정한 딜레이는 자동으로 올바르게 조정됩니다.
고정 주기로 실행되는 FreeRTOS 태스크를 만들 수 있나요?
가능합니다. 태스크 본문을 무한 루프로 감싸고 vTaskDelayUntil에 틱 단위 고정 주기를 전달하세요. 루프 전에 xTaskGetTickCount로 xLastWakeTime을 초기화하면, 각 반복에 걸린 시간과 관계없이 일정한 주파수로 태스크가 실행됩니다.