ESP32 FreeRTOS 튜토리얼 가이드 6부작 1
FreeRTOS를 사용하여 ESP32에서 실시간 애플리케이션을 구축하는 방법을 배워보세요. 태스크 생성, 우선순위 처리, 메모리 관리, 태스크 간 통신에 관한 실용적인 튜토리얼을 살펴보세요. 각 예제는 실제 하드웨어에서 테스트되어 멀티태스킹을 숙달하고 ESP32의 듀얼 코어 성능을 최대한 활용할 수 있도록 도와줍니다.
ESP32 FreeRTOS(1부): FreeRTOS 및 작업 관리 소개
ESP32 FreeRTOS(2부): 스케줄러 및 작업 관리 이해
ESP32 FreeRTOS(3부): 작업 우선순위 및 스택 관리 설명
ESP32 FreeRTOS(4부): 작업 간 통신 설명 | 큐, 세마포어 및 이벤트 그룹
ESP32 FreeRTOS(5부): 소프트웨어 타이머 및 작업 알림 설명
ESP32 FreeRTOS(6부): ESP-IDF에서 작업을 일시 중지, 재개 및 삭제하는 방법
ESP32 기반 FreeRTOS 소개
이 튜토리얼 시리즈에서는 ESP-IDF를 사용하여 ESP32에서 FreeRTOS를 사용하는 방법을 기본부터 살펴보겠습니다. FreeRTOS는 마이크로컨트롤러에서 멀티태스킹을 지원하는 실시간 운영 체제로, CPU를 점유하지 않고 여러 작업을 동시에 실행할 수 있습니다.
ESP32 RTOS 시리즈의 첫 번째 튜토리얼에서는 FreeRTOS의 핵심 개념을 다루고, ESP32에서 FreeRTOS가 유용한 이유를 설명하며, 간단한 LED 점멸 작업을 시연합니다. 이 글을 마치면 ESP-IDF에서 FreeRTOS 프로젝트의 작업, 지연, 그리고 구조를 확실히 이해하게 될 것입니다.

ESP32 기반 FreeRTOS 소개
목차
FreeRTOS란 무엇인가요?
ESP32에서 FreeRTOS를 사용하는 이유는 무엇입니까?
FreeRTOS의 핵심 개념
FreeRTOS의 작업 이해
ESP32에서 FreeRTOS 작업 생성
FreeRTOS 스케줄러 이해
작업 우선 순위 및 스택 크기
결론
FreeRTOS란 무엇인가요?
FreeRTOS는 ESP32를 포함한 마이크로컨트롤러용으로 설계된 경량 실시간 운영 체제(RTOS)입니다. 마이크로컨트롤러가 서로 방해하지 않고 여러 개의 독립적인 작업을 동시에 실행할 수 있도록 합니다.
FreeRTOS는 우선순위 및 시간 요건 에 따라 작업을 스케줄링하여 중요한 작업이 정시에 실행되도록 보장합니다. 이는 센서 판독, 액추에이터 제어, Wi-Fi 또는 블루투스 통신 등 여러 프로세스를 동시에 실행해야 하는 IoT 프로젝트, 로봇 공학, 임베디드 시스템에 유용합니다.
실시간 운영 체제 이해
실시간 운영체제(RTOS) 는 작업 실행에 대한 결정론적 동작을 보장하는 운영체제입니다. 즉, 작업이 정해진 시간 내에 예측 가능하게 실행된다는 것을 의미하며, 이는 타이밍이 중요한 애플리케이션에 매우 중요합니다.

FreeRTOS는 ESP32의 CPU 코어에 걸쳐 여러 작업을 효율적으로 스케줄링하여 관리합니다.
RTOS의 주요 특징:
- 멀티태스킹: 단일 CPU에서 여러 작업을 "동시에" 실행합니다.
- 작업 우선순위: 중요한 작업이 먼저 실행되도록 작업에 우선순위를 지정합니다.
- 시간 관리: 정확한 지연 및 타이머를 사용하여 작업 실행을 제어합니다.
- 리소스 공유: 세마포어와 뮤텍스를 사용하여 작업 간 충돌을 방지합니다.
예시 비유:
ESP32를 작은 사무실이라고 생각해 보세요. 일반적인 프로그램은 한 번에 하나의 작업을 처리하는 단일 작업자와 같습니다. FreeRTOS는 여러 작업자(작업)가 동시에 작업하고 효율적으로 조정하여 가장 중요한 작업이 먼저 완료되도록 합니다.
FreeRTOS가 마이크로컨트롤러에서 작동하는 방식
ESP32와 같은 마이크로컨트롤러에서 FreeRTOS는 CPU에서 작업을 스케줄링하는 방식으로 작동합니다. ESP32는 코어가 몇 개뿐이지만, FreeRTOS는 마치 여러 작업이 동시에 실행되는 것처럼 보이게 합니다.
간단히 설명하면 다음과 같습니다.
- 작업은 독립적인 기능으로 정의됩니다 .
- FreeRTOS는 작업의 상태(실행 중, 준비, 차단)를 나타내는 작업 목록을 유지 관리합니다.
- 스케줄러는 우선순위와 타이밍에 따라 어떤 작업이 어느 순간에 실행될지 결정합니다.
- 지연 및 대기 메커니즘을 사용하면 CPU를 차단하지 않고도 작업을 일시 중지하여 다른 작업을 실행할 수 있습니다.
ESP32에서는 FreeRTOS가 이미 ESP-IDF에 통합되어 있으므로, app_main()에서 태스크를 생성하면 FreeRTOS가 자동으로 스케줄링과 멀티태스킹을 관리합니다. 이를 통해 저수준 타이밍 관리에 신경 쓰지 않고 기능적 태스크 작성에 집중할 수 있습니다..
ESP32에서 FreeRTOS를 사용하는 이유는 무엇입니까?
ESP32는 내장형 Wi-Fi 및 블루투스를 갖춘 강력한 마이크로컨트롤러로, IoT 및 임베디드 애플리케이션에 이상적입니다. 그러나 프로젝트가 복잡해질수록 모든 것이 while(1) 루프 내에서 순차적으로 실행되는 기존의 "슈퍼 루프" 접근 방식은 금방 복잡해지고 관리하기 어려워질 수 있습니다.
여기서 FreeRTOS가 등장합니다. FreeRTOS는 여러 작업을 동시에 처리할 수 있는 체계적이고 효율적인 방법을 제공하여 애플리케이션의 각 부분이 다른 부분을 방해하지 않고 원활하게 실행되도록 보장합니다.
IoT 및 임베디드 프로젝트의 장점
FreeRTOS는 실제 IoT 및 임베디드 시스템에 적합한 여러 가지 주요 장점을 제공합니다.
1. 진정한 멀티태스킹
센서 읽기, 클라우드로 데이터 전송, 디스플레이 업데이트 등 여러 작업을 서로 차단하지 않고 병렬로 실행합니다.
2. 더 나은 코드 구성
모든 기능을 단일 루프에 넣는 대신, 각 기능을 독립적인 작업으로 분리하세요. 이렇게 하면 코드가 모듈화 되고, 읽기 쉽고, 유지 관리가 간편해집니다.
3. 정밀한 타이밍 제어
다른 작업을 차단하는 바쁜 루프나 delay() 함수에 의존하지 않고, vTaskDelay() 또는 타이머를 사용하여 작업의 타이밍을 정확하게 제어하십시오.
4. 향상된 반응성
우선순위가 높은 작업(예: 안전 점검, 인터럽트 또는 중요 센서)은 즉시 실행할 수 있고, 우선순위가 낮은 작업은 대기하여 시간에 민감한 작업이 지연되는 일이 없습니다.
5. 확장성
프로젝트가 성장함에 따라 새로운 기능을 추가하는 것이 더 쉬워집니다. 기존 코드 로직을 다시 작성할 필요 없이 새 작업을 생성하고 우선순위를 조정할 수 있습니다.
이러한 이점 때문에 FreeRTOS는 여러 주변 장치, 센서 및 통신 프로토콜이 원활하게 함께 작동해야 하는 IoT 장치에 특히 유용합니다.
ESP-IDF에 내장된 FreeRTOS 지원
ESP32를 사용하는 가장 큰 장점 중 하나는 FreeRTOS에 Espressif의 공식 개발 프레임워크 인 ESP-IDF가 사전 통합되어 있다는 것입니다.
- FreeRTOS를 별도로 다운로드하거나 구성할 필요가 없습니다. 이는 핵심 시스템의 일부입니다.
- xTaskCreate() 함수를 사용해 ESP-IDF 프로젝트에서 작업을 생성하면 해당 작업은 FreeRTOS에서 자동으로 예약되고 관리됩니다.
- ESP-IDF는 또한 작업 성능, 스택 사용량, 시스템 동작을 모니터링하기 위한 추가 FreeRTOS API와 디버깅 도구를 제공합니다.
이러한 기본 제공 지원 덕분에 타사 RTOS를 통합하는 것에 대해 걱정하지 않고도 작업 정의, 우선순위 설정, 대기열이나 세마포어 활용 등 애플리케이션 로직에 직접 집중할 수 있습니다.
FreeRTOS의 핵심 개념
ESP32에서 FreeRTOS로 코딩을 시작하기 전에 몇 가지 기본 개념을 이해하는 것이 중요합니다. 이는 FreeRTOS가 실시간으로 여러 작업을 효율적으로 관리하는 방식의 핵심을 이룹니다.
작업 - 생성 및 일정 예약
FreeRTOS에서 작업은 병렬로 실행되는 독립적인 함수와 같으며, 각각 특정 작업을 수행합니다. 예를 들어, 센서 데이터를 읽는 작업, 클라우드로 데이터를 전송하는 작업, LED를 제어하는 작업이 있을 수 있습니다.
ESP-IDF에서 xTaskCreate() 또는 xTaskCreatePinnedToCore() 함수를 사용하여 태스크를 생성합니다. 각 태스크에는 다음이 포함됩니다:
- Priority 우선순위는 다른 작업과 비교하여 언제, 얼마나 자주 실행할지를 결정합니다.
- Stack size 스택 크기는 메모리 사용량을 정의합니다.
- Task Function 작업의 동작을 정의하는 작업 함수입니다.
FreeRTOS는 선점형 스케줄러를 사용하여 어떤 작업을 실행할지 결정합니다. 우선순위가 가장 높은 작업에는 항상 CPU 시간이 할당됩니다. 두 작업의 우선순위가 같으면 스케줄러는 라운드 로빈 방식으로 두 작업 사이를 전환합니다.
이 멀티태스킹 메커니즘을 사용하면 ESP32가 차단하지 않고 여러 작업을 처리할 수 있으므로 애플리케이션이 더 원활하고 반응성이 높아집니다.
Delay — vTaskDelay 및 vTaskDelayUntil
일반적인 아두이노 스타일 루프에서 delay()를 사용하면 CPU를 완전히 차단하여 다른 모든 코드의 실행을 중지시킵니다. FreeRTOS에서는 vTaskDelay() 및 vTaskDelayUntil()을 사용하여 이 문제를 해결합니다.
- vTaskDelay(ticks)
특정 틱 수 (ESP32에서는 일반적으로 1틱 = 1ms) 동안 작업을 일시 중단합니다. 이 작업이 대기하는 동안 다른 작업은 자유롭게 실행될 수 있습니다.
- vTaskDelayUntil()
지연이 언제 호출되었는지와 관계없이 고정된 주기 간격으로 작업을 실행하려는 경우 유용합니다. 특히 센서 샘플링이나 실시간 제어 루프와 같은 애플리케이션에서 정확한 타이밍을 유지하는 데 도움이 됩니다.
Queue - 작업 커뮤니케이션
여러 작업이 동시에 실행될 때 데이터를 공유해야 하는 경우가 많습니다. FreeRTOS는 작업 간에 데이터를 안전하고 효율적으로 전달하는 방법으로 큐를 제공합니다.
예를 들어, 다음과 같은 것이 있습니다.
- 새로운 판독값을 대기열에 넣는 센서 작업입니다.
- 큐에서 해당 값을 읽어 클라우드로 전송하는 통신 작업입니다.
큐는 선입선출(FIFO first-in-first-out ) 버퍼처럼 작동합니다. 데이터가 순서대로 전달되도록 보장하고, 작업이 공유 변수에 직접 접근할 때 발생할 수 있는 경쟁 상태를 방지합니다.
ESP-IDF에서는 xQueueCreate()를 사용하여 큐를 생성한 후, xQueueSend() 또는 xQueueReceive()를 통해 데이터를 전송할 수 있습니다. 큐는 차단(blocking)도 지원하므로, 작업은 새 데이터가 도착할 때까지 대기할 수 있습니다.
세마포어 및 뮤텍스 — 리소스 관리
여러 작업이 공유 리소스 (예: UART 포트, I²C 버스 또는 공유 변수)를 사용해야 하는 경우 충돌 및 데이터 손상의 위험이 있습니다. FreeRTOS는 이를 관리하기 위해 세마포어와 뮤텍스를 제공합니다.
- 이진 세마포어는
신호 전달 메커니즘처럼 작동합니다. 한 작업은 세마포어를 "주고", 다른 작업은 세마포어를 "받을" 수 있습니다. 이는 작업을 동기화하거나 이벤트 발생을 알리는 데 유용합니다(예: ISR이 작업에 알림을 보내는 경우).
- 뮤텍스(상호 배제)는
공유 리소스를 보호하는 데 사용됩니다. 한 번에 한 작업만 뮤텍스를 점유할 수 있습니다. 다른 작업이 뮤텍스를 점유하려고 하면 뮤텍스가 해제될 때까지 기다립니다.
세마포어와 뮤텍스를 사용하면 공유 리소스에 안전하게 액세스 할 수 있으므로 데이터 손상을 방지하고 ESP32에서 원활한 멀티태스킹이 보장됩니다.
FreeRTOS의 작업 이해
FreeRTOS 에서 태스크는 메인 애플리케이션 내부에서 실행되는 작고 독립적인 프로그램입니다. 각 태스크는 특정 작업을 수행합니다. 예를 들어 LED 깜박임, 센서 읽기, Wi-Fi를 통한 데이터 전송 등이 있습니다.
FreeRTOS는 ESP32가 여러 작업을 동시에 처리할 수 있도록 합니다. 이를 멀티태스킹이라고 합니다. 지연 시간을 포함하는 긴 루프 하나를 작성하는 대신, 코드를 여러 개의 작은 작업으로 나누어 서로 방해하지 않고 함께 실행합니다.
FreeRTOS의 모든 작업은 자체 스택, 우선순위, 상태를 갖습니다. 스케줄러는 이러한 작업을 관리하고 특정 시점에 어떤 작업을 실행할지 결정합니다. 작업 간 전환이 매우 빠르기 때문에 모든 작업이 동시에 실행되는 것처럼 보입니다.

ESP32에서 FreeRTOS의 작업 이해하기
생각해 보면 다음과 같습니다.
- 각 작업은 하나의 일에 집중하는 근로자와 같습니다.
- 스케줄러는 다음에 어떤 작업자가 작업을 수행해야 하는지 결정하는 관리자입니다.
- 각 작업은 서로 간섭하지 않습니다. 단지 CPU를 사용할 차례를 기다릴 뿐입니다.
애플리케이션을 여러 작업으로 나누면 애플리케이션이 더 체계적이고 , 반응성이 뛰어나며 , 실시간 처리가 가능해집니다.
ESP32에서 FreeRTOS 작업 생성
ESP-IDF 기반 FreeRTOS 에서 작업은 FreeRTOS 스케줄러에서 실행되는 작고 독립적인 함수입니다. 각 작업은 하나의 작업(예: LED 깜박임, 센서 읽기, Wi-Fi를 통한 데이터 전송)을 수행합니다.
ESP-IDF는 기본적으로 FreeRTOS를 실행하므로 모든 API를 직접 사용할 수 있습니다. 여러 작업을 생성하면 코드를 체계적으로 정리하고 지연을 방지하며 ESP32 프로젝트의 응답성과 확장성을 높이는 데 도움이 됩니다.
xTaskCreate() 함수
작업을 생성하는 주요 API입니다 xTaskCreate(). FreeRTOS 커널에 작업을 등록하고 스택 크기, 우선순위, 작업 핸들과 같은 매개변수를 설정합니다.
구문은 다음과 같습니다.
BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode, // Task function
const char * const pcName, // Task name (for debugging)
const uint32_t usStackDepth, // Stack size in words
void *pvParameters, // Optional parameters
UBaseType_t uxPriority, // Task priority
TaskHandle_t *pvCreatedTask // Task handle (optional)
);
함수가 pdPASS를 반환하면 작업이 성공적으로 생성된 것입니다. 그렇지 않은 경우, 시스템의 힙 메모리가 부족하면 함수는 작업 생성에 실패합니다.
예 – 서로 다른 깜박임 속도를 가진 두 개의 LED 작업
두 개의 LED를 서로 다른 속도로 깜박이는 두 개의 FreeRTOS 작업을 만들어 보겠습니다. 이는 ESP32에서 ESP-IDF 프레임워크를 사용하여 진정한 멀티태스킹을 구현하는 방법을 보여줍니다.
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define LED1 GPIO_NUM_2
#define LED2 GPIO_NUM_4
// ----- Task 1: Blink LED1 every 500 ms -----
void blink_task_1(void *pvParameters)
{
gpio_reset_pin(LED1);
gpio_set_direction(LED1, GPIO_MODE_OUTPUT);
while (1)
{
gpio_set_level(LED1, 1); // Turn LED ON
vTaskDelay(pdMS_TO_TICKS(500)); // Wait 500 ms
gpio_set_level(LED1, 0); // Turn LED OFF
vTaskDelay(pdMS_TO_TICKS(500)); // Wait 500 ms
}
}
// ----- Task 2: Blink LED2 every 200 ms -----
void blink_task_2(void *pvParameters)
{
gpio_reset_pin(LED2);
gpio_set_direction(LED2, GPIO_MODE_OUTPUT);
while (1)
{
gpio_set_level(LED2, 1); // Turn LED ON
vTaskDelay(pdMS_TO_TICKS(200)); // Wait 200 ms
gpio_set_level(LED2, 0); // Turn LED OFF
vTaskDelay(pdMS_TO_TICKS(200)); // Wait 200 ms
}
}
// ----- app_main: Entry point in ESP-IDF -----
void app_main(void)
{
printf("Starting FreeRTOS tasks...\n");
// Create both tasks
xTaskCreate(blink_task_1, "Blink1", 2048, NULL, 1, NULL);
xTaskCreate(blink_task_2, "Blink2", 2048, NULL, 1, NULL);
}
코드 분석
1. GPIO 설정
각 작업은 GPIO 핀을 구성하는 것으로 시작됩니다.
gpio_reset_pin(LED1);
gpio_set_direction(LED1, GPIO_MODE_OUTPUT);
이렇게 하면 LED 핀이 출력 준비가 됩니다. 태스크 내부에서 이 작업을 수행하면 각 태스크가 독립적이고 모듈화 됩니다.
2. 작업 수행을 위한 무한 루프
while(1) 루프는 각 작업이 영원히 실행되도록 보장합니다. 작업은 절대 반환하지 않으며, 대신 vTaskDelay()를 사용하여 다른 작업에 CPU 시간을 할당하기 위해 대기합니다.
while (1) {
gpio_set_level(LED1, 1);
vTaskDelay(pdMS_TO_TICKS(500));
gpio_set_level(LED1, 0);
vTaskDelay(pdMS_TO_TICKS(500));
}
각 지연은 pdMS_TO_TICKS()를 사용하여 밀리초를 RTOS 틱으로 변환합니다. 이는 FreeRTOSConfig.h에서 틱 속도가 변경되더라도 타이밍 정확도를 유지합니다.
3. 비차단 지연
vTaskDelay()는 비차단 지연 함수입니다. MCU의 delay()와 달리 CPU를 정지시키지 않고, 스케줄러에게 "이 태스크를 X 틱 동안 일시 중지하고 다른 태스크를 실행하라"고 지시합니다. 이는 FreeRTOS의 멀티태스킹 기반이 됩니다.
4. app_main()에서 작업 생성
모든 FreeRTOS 작업은 app_main 내부에서 시작됩니다.
xTaskCreate(blink_task_1, "Blink1", 2048, NULL, 1, NULL);
xTaskCreate(blink_task_2, "Blink2", 2048, NULL, 1, NULL);
각 작업은 다음을 수신합니다.
- 함수 이름 - 작업 코드에 대한 포인터
- 읽기 쉬운 이름 - 디버깅에 유용함
- 스택 크기 – 2048단어(~8KB)
- 매개변수 - 이 경우에는 없음
- 우선순위 - 둘 다 우선순위 1(동일 수준)입니다.
- 핸들 - 나중에 작업을 제어할 필요가 없으므로 NULL로 설정합니다.
두 작업의 우선순위가 같을 때 FreeRTOS는 CPU를 두 작업 사이에 시간 분할하여 두 LED가 독립적이고 부드럽게 깜박이도록 합니다.
작동 원리
FreeRTOS 스케줄러는 blink_task_1과 blink_task_2 사이에서 CPU 시간을 번갈아 가며 할당합니다. 한 태스크가 vTaskDelay()를 호출하면 차단 상태로 전환되며, 스케줄러는 즉시 다른 태스크로 전환합니다.
이러한 빠른 전환은 병렬 실행의 느낌을 주는데, 이는 ESP32에서 실시간 멀티태스킹의 특징입니다.
실행 결과 – FreeRTOS 작업 출력
아래 GIF는 ESP32에서 동시에 실행되는 두 가지 FreeRTOS 작업을 보여줍니다.
ESP32에 연결된 두 개의 LED가 서로 다른 속도로 깜박입니다. 이는 FreeRTOS 작업이 정상적으로 작동하고 있음을 의미합니다.
각 LED는 서로 다른 속도(하나는 느리고 하나는 빠름)로 깜박입니다. 이는 FreeRTOS 스케줄러가 CPU를 차단하지 않고도 작업 간에 효율적으로 전환하는 방법을 보여줍니다.
FreeRTOS 스케줄러 이해
FreeRTOS 스케줄러는 어떤 작업을 언제 실행할지 결정하는 시스템 요소입니다. 모든 활성 작업을 관리하고 효율적으로 전환합니다. 이를 통해 ESP32는 여러 작업을 마치 동시에 발생하는 것처럼 실행할 수 있습니다.
작업 상태
FreeRTOS의 각 작업은 여러 상태 중 하나일 수 있습니다.
- 실행 중: 현재 CPU를 사용 중인 작업입니다.
- 준비: 작업이 CPU 시간을 기다리고 있습니다.
- 차단됨: 작업이 지연이나 이벤트(세마포어 등)를 기다리고 있습니다.
- 일시 중지: 작업이 재개될 때까지 일시 중지됩니다.
- 삭제됨: 작업이 메모리에서 제거되었습니다.
스케줄러는 이러한 상태를 지속적으로 확인합니다. 준비 상태(Ready)인 작업만 실행합니다.
컨텍스트 전환
스케줄러는 실행 중인 작업이 변경될 때마다 컨텍스트 전환을 수행합니다 . 컨텍스트 전환 중에 FreeRTOS는 현재 작업의 데이터를 저장하고 메모리에서 다음 작업의 데이터를 불러옵니다. 이 과정은 매우 빠르게, 보통 수 밀리초 단위로 진행됩니다.
컨텍스트 스위칭을 통해 여러 작업이 서로 간섭하지 않고 동일한 CPU를 공유할 수 있습니다. 이것이 FreeRTOS가 진정한 멀티태스킹을 구현하는 이유입니다.
선점 스케줄링
FreeRTOS는 기본적으로 선점형 스케줄링을 사용합니다. 즉, 우선순위가 높은 작업이 우선순위가 낮은 작업을 언제든지 중단할 수 있습니다. 스케줄러는 즉시 더 중요한 작업으로 제어권을 전환합니다.
이러한 동작은 센서 읽기나 Wi-Fi 패킷 처리와 같이 시간이 중요한 작업이 항상 CPU 시간을 먼저 할당받도록 보장합니다. 우선순위가 낮은 작업은 우선순위가 높은 작업이 완료되면 자동으로 재개됩니다.
작업 우선순위
모든 작업에는 우선순위가 있습니다. 우선순위가 높을수록 중요도가 높습니다. 스케줄러는 항상 우선순위가 가장 높은 준비 작업을 실행합니다.
예를 들어:
- Wi -Fi 작업에는 우선순위 3가 있을 수 있습니다.
- 블링크 작업은 우선순위 1을 가질 수 있습니다.
둘 다 준비되면 스케줄러는 Wi-Fi 작업에 CPU 시간을 먼저 할당합니다. Wi-Fi 작업이 지연되거나 차단되면 blink 작업이 실행됩니다.
ESP-IDF에서 vTaskPrioritySet()을 사용하여 작업 우선순위를 조정할 수 있습니다.
스케줄러 시각화
아래 다이어그램은 FreeRTOS 스케줄러가 ESP32에서 여러 작업 간에 어떻게 전환하는지 보여줍니다.

ESP32에서 FreeRTOS Scheduler가 작동하는 방식
작업 우선 순위 및 스택 크기
FreeRTOS에서 모든 작업에는 우선순위와 스택 크기라는 두 가지 중요한 매개변수가 있습니다. 이 매개변수는 작업의 실행 빈도와 메모리 사용량을 결정합니다. 두 매개변수를 모두 이해하면 안정적이고 효율적인 ESP32 애플리케이션을 만드는 데 도움이 됩니다.
작업 우선순위
우선순위는 작업의 시스템 중요도를 정의합니다. FreeRTOS는 우선순위에 정수 값을 사용하며 , 숫자가 높을수록 중요도가 높습니다. 기본적으로 우선순위 0은 가장 낮으며 상한은 없습니다(ESP-IDF는 일반적으로 최대 25단계까지 지원합니다).
스케줄러는 항상 실행 준비가 된 가장 높은 우선순위의 작업을 실행합니다. 두 작업의 우선순위가 같으면 스케줄러는 라운드 로빈 방식(공평하게 서로 할당)으로 두 작업 사이를 전환합니다.
예
- 작업 A (우선순위 2): 센서 데이터를 읽습니다.
- 작업 B (우선순위 1): LED를 깜박입니다.
둘 다 준비되면 작업 A가 먼저 실행됩니다. 작업 A가 차단되거나 지연되면 작업 B가 다음으로 실행됩니다.
올바른 우선순위를 설정하면 중요한 작업이 필요할 때 CPU 시간을 확보하고, 백그라운드 작업은 시스템이 비어 있을 때만 실행됩니다.
스택 크기
각 작업에는 스택 메모리 도 필요합니다. 스택은 작업이 변수, 반환 주소, 함수 호출을 저장하는 데 사용하는 전용 공간입니다. 스택이 너무 작으면 프로그램이 충돌하거나 예상치 못한 동작을 할 수 있습니다.
xTaskCreate()로 태스크를 생성할 때 스택 크기는 바이트가 아닌 워드로 정의합니다. ESP32(32비트 아키텍처)의 경우 1워드 = 4바이트입니다.
예
xTaskCreate(taskFunction, "TaskA", 2048, NULL, 2, NULL);
여기서 스택 크기는 2048워드(≈8KB) 입니다 . 이는 일반적으로 대부분의 소규모 작업에 충분하지만, 계산량이 많거나 지역 변수가 큰 작업에는 더 많은 크기가 필요할 수 있습니다.
다음을 사용하여 스택 사용량을 모니터링할 수 있습니다.
uxTaskGetStackHighWaterMark(taskHandle);
이를 통해 작업의 스택 공간이 부족해지는지 감지할 수 있습니다.
결론
이 튜토리얼에서는 ESP32 기반 FreeRTOS의 핵심 개념을 살펴보았습니다. 이제 태스크가 무엇이고, 태스크를 통해 프로그램이 여러 작업을 동시에 처리하는 방법을 이해하게 되었습니다. 또한 FreeRTOS 스케줄러가 이러한 태스크를 어떻게 관리하고, 컨텍스트 스위칭 과 선점형 스케줄링을 통해 태스크 간을 효율적으로 전환하는지 살펴보았습니다 .
작업 우선순위가 어떤 작업이 먼저 실행되는지에 어떤 영향을 미치는지, 그리고 스택 크기가 각 작업이 안전하게 작동하기에 충분한 메모리를 확보하는 데 어떻게 영향을 미치는지 알아보았습니다. 이러한 지식을 바탕으로 이제 FreeRTOS를 사용하여 안정적인 멀티태스킹 ESP32 애플리케이션을 개발할 수 있습니다.
이는 실시간 멀티태스킹을 향한 첫걸음이었습니다. 더욱 복잡하고 반응성이 뛰어난 시스템을 구축할 수 있는 기반을 마련하셨습니다.
다음 튜토리얼: 다음 튜토리얼에서는 FreeRTOS 스케줄러가 실제로 어떤 작업을 실행할지 결정하는 방법과 ESP32에서 실시간 성능을 위해 우선순위를 조정하는 방법을 살펴보겠습니다.
얘들은 무엇이든지 잘하는구나. 우리는 에고가 강한 민족에다가, 눈치를 보느라 헤매는 사이에 늘 쫓아가기 바쁘다. 인생은 살만한 곳이며, 즐거운 곳이라는 사실을 가장 먼저 배워야 한다.
튜토리얼의 원문은 다음 링크를 참고한다. 6부작을 잘 올린다. 배움을 멈추지 않는다. 바느질과 재봉틀 사용법을 익히기로 한다.
'ESP32' 카테고리의 다른 글
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 4 (1) | 2025.11.19 |
|---|---|
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 3 (0) | 2025.11.19 |
| ESP32 ADXL345 Accelerometer Interfacing (0) | 2025.11.18 |
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 2 (0) | 2025.11.18 |
| ESP-IDF vs Arduino 개발 환경 비교 (0) | 2025.11.18 |
| ESP32 종류와 선택 가이드 (1) | 2025.11.16 |
| Espressif SoC Product Portfolio (0) | 2025.11.16 |
| ESP-IDF VScode 설치 힘들 때 해결 방법 (0) | 2025.11.12 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.
귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.
캐어랩