본문 바로가기

ESP32

ESP32 FreeRTOS 튜토리얼 가이드 6부작 2

반응형

 

ESP32 FreeRTOS 튜토리얼 가이드 6부작 2

 

FreeRTOS를 사용하여 ESP32에서 실시간 애플리케이션을 구축하는 방법을 배워보세요. 태스크 생성, 우선순위 처리, 메모리 관리, 태스크 간 통신에 관한 실용적인 튜토리얼을 살펴보세요. 각 예제는 실제 하드웨어에서 테스트되어 멀티태스킹을 숙달하고 ESP32의 듀얼 코어 성능을 최대한 활용할 수 있도록 도와줍니다. 

 

ESP32 FreeRTOS(1부): FreeRTOS 및 작업 관리 소개

ESP32 FreeRTOS(2부): 스케줄러 및 작업 관리 이해

ESP32 FreeRTOS(3부): 작업 우선순위 및 스택 관리 설명

ESP32 FreeRTOS(4부): 작업 간 통신 설명 | 큐, 세마포어 및 이벤트 그룹

ESP32 FreeRTOS(5부): 소프트웨어 타이머 및 작업 알림 설명

ESP32 FreeRTOS(6부): ESP-IDF에서 작업을 일시 중지, 재개 및 삭제하는 방법 

 

 

ESP-IDF를 사용하여 ESP32에서 FreeRTOS 스케줄러 이해하기

 

ESP-IDF를 활용한 ESP32 FreeRTOS 튜토리얼 시리즈의 2부 입니다 . 이전 파트 에서는 ​​FreeRTOS에서 여러 작업을 생성하고 관리하는 방법을 살펴보았습니다 . 각 작업이 독립적으로 실행되는 방식과 우선순위가 작업 실행에 미치는 영향을 살펴보았습니다.

 

이 부분에서는 이러한 작업의 실제 실행 방식을 제어하는 ​​핵심 기능인 FreeRTOS 스케줄러에 대해 알아보겠습니다 . 스케줄러는 어떤 작업이 CPU를 얼마나 오랫동안 사용할지 결정합니다. 작업 전환을 처리하고, 우선순위를 관리하며, ESP32의 듀얼 코어 프로세서 에서 원활한 멀티태스킹을 보장합니다 .

 

우리는 다음을 탐구할 것입니다:

 

  • ESP32에서 FreeRTOS 스케줄러가 작동하는 방식.
  • 다양한 작업 상태와 전환.
  • 컨텍스트 스위칭이란 무엇이고 어떻게 일어나는가.
  • 선점형 스케줄링 과 협력적 스케줄링 의 차이점.
  • ESP32의 두 코어에서 시간 분할이 어떻게 작동하는지 알아보겠습니다 .

 

이 튜토리얼을 따라가면 ESP32 FreeRTOS 스케줄러가 어떻게 백그라운드에서 여러 작업을 효율적으로 실행하는지 명확하게 알 수 있을 것입니다.

 

 

ESP-IDF를 사용하여 ESP32에서 FreeRTOS 스케줄러 이해하기

 

목차

  • ESP32의 FreeRTOS 스케줄러란 무엇인가요?
  • ESP32에서 FreeRTOS 작업 상태 이해
  • FreeRTOS에서의 컨텍스트 전환(ESP-IDF)
  • FreeRTOS의 선점형 스케줄링과 협력형 스케줄링
  • ESP32 듀얼 코어에서의 타임 슬라이싱
  • ESP32에서 FreeRTOS 스케줄러가 실행되는 방식
  • FreeRTOS 스케줄러 디버깅 및 모니터링
  • 결론

 

ESP32의 FreeRTOS 스케줄러란 무엇인가요?

 

FreeRTOS 스케줄러 는 FreeRTOS 운영 체제의 핵심 부분입니다. 프로그램에서 생성된 모든 작업을 관리하고 특정 시점에 어떤 작업을 실행할지 결정합니다. 간단히 말해, 스케줄러는 ESP32의 작업 관리자 역할을 합니다.

 

FreeRTOS의 각 작업은 특정 우선순위 와 CPU 시간을 할당받습니다. 스케줄러는 어떤 작업이 실행 준비가 되었고 어떤 작업이 대기 중인지 지속적으로 확인합니다. 그런 다음 우선순위와 시스템 타이밍을 기반으로 다음에 실행할 작업을 선택합니다.

 

스케줄러가 없다면 모든 작업이 동시에 실행될 것이고, CPU는 어떤 작업을 먼저 처리해야 할지 알 수 없을 것입니다. 따라서 스케줄러는 ESP32의 멀티태스킹에 질서와 제어력을 부여합니다.

 

FreeRTOS에서 스케줄러의 역할

 

스케줄러의 주요 역할은 시스템 내 모든 작업의 ​​실행 흐름을 제어하는 ​​것입니다. 우선순위가 가장 높은 준비 완료 작업이 항상 CPU 시간을 확보하도록 보장합니다. 우선순위가 더 높은 새 작업이 준비되면 스케줄러는 즉시 해당 작업으로 전환합니다. 이 과정을 컨텍스트 스위칭 이라고 합니다 .

 

스케줄러는 작업 지연 , 차단 , 일시 중단 도 처리합니다 . 작업이 지연이나 이벤트를 기다리면 스케줄러는 해당 작업을 일시 중지하고 적절한 상태로 전환합니다. 동시에 실행 준비가 된 다른 작업에 CPU를 할당합니다.

 

간단히 말해서 스케줄러는 다음과 같습니다.

  • 모든 활성 작업과 대기 작업을 추적합니다.
  • 우선순위와 상태에 따라 다음 작업을 선택합니다.
  • 작업 간 전환이 원활합니다.
  • 사용자 개입 없이 CPU 활용도를 극대화합니다.

 

ESP32 에서는 스케줄러가 두 코어 모두에서 실행되어 진정한 병렬 작업 실행을 가능하게 합니다 . 이것이 ESP32 FreeRTOS 시스템을 실시간 애플리케이션에 강력하게 만드는 이유입니다.

 

 

 

FreeRTOS 스케줄러가 준비된 작업을 선택하고 이를 ESP32의 Core 0 및 Core 1에 전송하는 모습을 보여주는 다이어그램. 준비, 차단 및 일시 중단 작업 상태와 틱 타이머가 포함되어 있습니다.

 

ESP32 프로젝트에서 작업 스케줄링이 중요한 이유

 

모든 멀티태스킹 시스템, 특히 ESP32에서는 작업 스케줄링이 매우 중요합니다. 대부분의 임베디드 프로젝트는 센서 판독, Wi-Fi 통신, 데이터 표시 등 여러 작업이 동시에 실행됩니다. 이러한 모든 작업이 단일 루프에서 실행되면 시스템이 느려지고 응답이 느려집니다.

 

FreeRTOS 스케줄러를 사용하면 각 작업에 특정 역할과 우선순위를 할당할 수 있습니다 . 예를 들어, Wi-Fi 처리는 더 높은 우선순위로 실행되고 LED 깜박임은 더 낮은 우선순위로 유지될 수 있습니다. 이렇게 하면 시스템이 사용 중일 때에도 중요한 작업이 항상 CPU 시간을 확보할 수 있습니다.

 

적절한 스케줄링은 실시간 성능을 향상시키고 , 지연 시간을 줄이며 , 전력을 절약합니다 . 준비된 작업이 없으면 스케줄러는 CPU를 유휴 상태로 전환하여 전력을 절약합니다. 이는 IoT 기기에 중요한 요소입니다.

 

ESP32에서 FreeRTOS 작업 상태 이해

 

FreeRTOS 작업은 실행 중에 여러 상태를 거칩니다 . 이러한 작업 상태를 이해하면 효율적인 ESP32 애플리케이션을 설계하는 데 도움이 됩니다. 각 작업은 언제든지 준비 , 실행 중 , 차단됨 또는 일시 중단됨 상태 에 있을 수 있습니다 . 스케줄러는 이러한 상태를 사용하여 다음에 실행할 작업을 결정합니다.

 

준비 상태

 

작업은 실행 준비가 되었지만 CPU 할당을 기다리는 상태인 준비 상태 입니다. 모든 작업은 생성 후 이 상태에서 시작됩니다. 스케줄러는 준비된 작업을 추적하고 우선순위 에 따라 하나를 선택합니다 . 여러 작업의 우선순위가 같은 경우, 타임 슬라이싱을 통해 각 작업이 짧은 시간 동안 차례로 실행될 수 있습니다.

 

실행 상태

 

스케줄러가 작업에 CPU 시간을 할당하면 작업은 실행 상태가 됩니다. 코어당 한 번에 하나의 작업만 실행될 수 있습니다.

 

작업은 실행되는 동안 다음이 발생할 때까지 코드를 실행합니다.

 

  • 시간 슬라이스가 끝나거나
  • 더 높은 우선순위의 작업이 준비되거나
  • 작업이 스스로를 차단하거나 중단합니다.

 

ESP32는 두 개의 코어를 사용하므로 각 코어에서 하나의 작업을 동시에 실행할 수 있습니다. 이를 통해 진정한 병렬 실행이 가능해져 멀티태스킹 애플리케이션의 성능이 향상됩니다.

 

블럭 및 일시 중단 상태

 

작업은 이벤트나 지연이 완료될 때까지 기다릴 때 차단 상태 로 전환됩니다. 예를 들어, 작업은 큐 메시지 , 세마포어 또는 타이머를 기다리는 동안 차단될 수 있습니다 . 차단된 작업은 CPU 시간을 소모하지 않습니다.

 

일시 중지 상태는 유사하지만, 작업은 명시적으로 재개될 때까지 비활성 상태로 유지됩니다. vTaskSuspend()를 사용하여 작업을 일시 중지하고 vTaskResume()로 재개할 수 있습니다. 이러한 상태는 작업을 효율적으로 관리하고 CPU 낭비를 방지하는 데 도움이 됩니다.

 

작업 상태 간 전환

 

작업은 실행 중에 상태 간에 이동하는 경우가 많습니다.

 

예를 들면 다음과 같습니다.

  • 준비된 작업은 스케줄러 가 선택하면 실행 상태로 전환됩니다 .
  • 실행 중인 작업은 리소스 를 기다리는 경우 차단 상태 로 전환됩니다 .
  • 중단된 작업은 재개 되면 준비 상태가 됩니다 .

 

 

 

ESP32에서 FreeRTOS 작업 상태 전환을 보여주는 다이어그램입니다. 화살표는 스케줄러가 작업을 선택할 때 준비됨에서 실행 중으로, 리소스를 기다릴 때는 실행 중에서 차단됨으로, 재개될 때는 일시 중단됨에서 준비됨으로 전환됩니다.

 

이러한 전환을 이해하면 반응성이 뛰어나고 안정적인 ESP32 FreeRTOS 시스템을 설계하는 데 도움이 됩니다 . 우선순위가 높은 작업은 필요할 때 CPU 시간을 확보하고, 우선순위가 낮은 작업은 효율적으로 대기하도록 보장합니다.

 

FreeRTOS에서의 컨텍스트 스위칭(ESP-IDF)

 

FreeRTOS에서는 여러 작업이 CPU를 공유합니다. 스케줄러는 각 작업의 실행 시점과 일시 정지 시점을 관리합니다. CPU 실행을 한 작업에서 다른 작업으로 전환하는 동작을 컨텍스트 스위칭 이라고 합니다. 이는 ESP32에서 멀티태스킹을 가능하게 하는 핵심 메커니즘입니다 .

 

컨텍스트 스위칭이란 무엇인가요?

 

컨텍스트 스위칭은 다음과 같은 과정입니다.

  1. 실행 중인 작업의 현재 상태(컨텍스트)를 저장하고
  2. 다음에 실행할 작업의 이전에 저장된 컨텍스트를 복원합니다 .

 

이 "컨텍스트"에는 일반적으로 다음이 포함됩니다.

  • CPU 레지스터(일반용 및 특수용)
  • 스택 포인터(SP)
  • 프로그램 카운터(PC)
  • 프로세서 상태 레지스터
  • 부동 소수점 레지스터(사용되는 경우)

 

스케줄러가 작업을 전환할 때, 각 작업은 마치 일시 중지된 적이 없는 것처럼 정확히 중단된 지점에서 다시 시작될 수 있도록 보장합니다.

 

컨텍스트 전환이 없다면 여러 작업이 서로의 CPU 상태를 덮어쓰게 되어 데이터가 손상되고 시스템이 충돌하게 됩니다.

 

FreeRTOS가 작업 컨텍스트를 저장하고 복원하는 방법

 

FreeRTOS는 컨텍스트 전환 프로세스 전체를 자동화합니다.

 

단계별로 진행되는 내용은 다음과 같습니다.

  1. 틱 인터럽트 또는 이벤트는 스케줄러를 트리거합니다(예: 타이머 틱 또는 작업이 준비됨).
  2. 현재 작업의 컨텍스트 (레지스터, 스택 포인터, 프로그램 카운터)가 스택에 푸시 됩니다 .
  3. 스케줄러는 우선순위와 상태에 따라 다음에 준비될 작업을 선택합니다.
  4. 다음 작업의 컨텍스트가 스택에서 팝되어 CPU 레지스터에 복원됩니다.
  5. CPU는 해당 작업의 저장된 프로그램 카운터에서 실행을 재개합니다.

 

듀얼 코어(코어 0과 코어 1)를 탑재한 ESP32 에서 FreeRTOS는 코어당 하나씩 별도의 스케줄러를 유지합니다 . 각 코어는 독립적으로 작업을 전환할 수 있으며, pinned-to-core = tskNO_AFFINITY 로 명시적으로 설정하지 않는 한 작업은 특정 코어에 고정됩니다 .

 

컨텍스트 전환은 언제 발생합니까?

 

FreeRTOS는 여러 가지 경우에 컨텍스트 전환을 수행합니다.

  • 선점: 우선순위가 높은 작업이 실행될 준비가 됩니다.
  • 시간 분할: 우선순위가 같은 두 작업이 라운드 로빈 방식으로 CPU 시간을 공유합니다.
  • 차단: 작업이 이벤트, 지연 또는 세마포어를 기다립니다.
  • ISR 양보: 인터럽트 핸들러가 우선순위가 높은 작업의 차단을 해제합니다.

 

ESP32의 컨텍스트 전환 오버헤드

 

컨텍스트 전환은 "무료"가 아닙니다. 레지스터를 저장/복원하고 스택을 업데이트하는 데 CPU 사이클을 소모합니다.

  • 각 스위치는 몇 마이크로초의 지연 시간을 발생시킵니다(클럭 주파수에 따라 다름).
  • 매우 빈번한 전환은 오버헤드로 인해 성능 저하를 초래할 수 있습니다.
  • 하지만 FreeRTOS는 이를 최소한으로 유지하기 위해 최적화되어 있습니다 . 특히 ESP-IDF의 효율적인 ISR 및 틱 처리를 통해 더욱 그렇습니다.

 

성능 최적화를 위한 팁:

  • 작업 코드를 짧고 효율적으로 유지하세요 .
  • 불필요한 차단(예: 긴 vTaskDelay() 호출)을 피하십시오.
  • 과도한 선점을 피하려면 적절한 우선순위를 사용하세요.
  • 스케줄러 경합을 줄이려면 중요한 작업을 특정 코어에 고정하는 것을 고려하세요 .

 

컨텍스트 전환의 타임라인 예

 

예를 들어, 세 가지 작업이 있다고 가정해 보겠습니다.

 

Task Priority Description
Task A 2 Sensor Reading
Task B 1 UART Communication
Task C 3 Control Loop

 

예시 시나리오:

  1. 작업 C (우선순위 3)가 먼저 실행됩니다.
  2. 이벤트(예: 센서 데이터 준비)를 기다리는 동안 차단됩니다.
  3. 작업 A (우선순위 2)가 가장 높은 준비 작업이 됨 → 스케줄러가 컨텍스트를 전환함.
  4. 몇 번의 틱 후, 작업 C가 차단을 해제하고 작업 A를 선점합니다.
  5. 스케줄러는 작업 C로 다시 컨텍스트 전환을 수행합니다.

 

ESP32에서 FreeRTOS의 다양한 트리거를 사용하여 컨텍스트를 전환합니다.

 

이 다이어그램은 FreeRTOS가 ESP32에서 컨텍스트 스위칭을 관리하는 방식을 보여줍니다. 각 색상 막대는 코어 0 또는 코어 1에서 실행되는 작업을 나타냅니다. 세로 점선으로 표시된 부분은 틱 인터럽트, 우선순위가 높은 작업 또는 작업 블로킹에 의해 트리거되는 컨텍스트 스위칭 지점을 나타냅니다. 안쪽 상자는 스위칭 중 작업의 저장된 CPU 상태(PC, SP, 레지스터)를 보여줍니다.

 

FreeRTOS의 선점형 스케줄링과 협력형 스케줄링

 

FreeRTOS는 선점형(Preemptive) 과 협력형(Cooperative)의 두 가지 주요 스케줄링 방식을 지원합니다 . 이 두 방식은 스케줄러가 다음에 실행할 작업을 결정하는 방식을 결정합니다. 효율적인 ESP32 멀티태스킹 애플리케이션을 구축하려면 이 두 방식의 차이점을 이해하는 것이 필수적입니다 .

 

ESP32에서 선점형 스케줄링이 작동하는 방식

 

선점형 스케줄링 에서는 스케줄러가 실행 중인 작업을 중단시킬 수 있습니다. 우선순위가 높은 작업이 준비되면 즉시 우선순위가 높은 작업으로 전환합니다. 이를 통해 중요한 작업이 항상 정시에 실행되도록 보장합니다.

 

ESP32에서는 선점형 스케줄링이 두 코어 모두에서 작동합니다. 우선순위가 낮은 작업이 실행 중이더라도 스케줄러는 우선순위가 높은 작업을 위해 해당 작업을 선점 할 수 있습니다. 이는 FreeRTOS의 기본 스케줄링 방식이며 실시간 애플리케이션 에 이상적입니다 .

 

협력 스케줄링을 사용하는 경우

 

협력 스케줄링에서는 작업이 자발적으로 제어권을 양도할 때까지 실행됩니다. 스케줄러는 실행 중인 작업을 강제로 중지시키지 않습니다. 작업은 taskYIELD()와 같은 함수를 호출하거나 지연/이벤트를 기다려 다른 작업이 실행되도록 해야 합니다.

 

협력 스케줄링은 더 간단하며 컨텍스트 전환 오버헤드를 줄입니다. 작업의 실행 시간이 예측 가능하고 타이밍이 중요하지 않은 애플리케이션에 적합합니다. 그러나 한 개의 장기 실행 작업이 양보하지 않으면 다른 작업을 차단할 수 있습니다.

 

특징 선점형 스케줄링 협력적 스케줄링
작업 전환 스케줄러는 실행 중인 작업을 언제든지 중단할 수 있습니다. 작업은 자발적으로 제어권을 넘길 때까지 실행됩니다.
민감도 높음 - 중요한 작업이 CPU를 즉시 할당받습니다. 중간 - 시간 내에 작업이 완료되는 데 따라 다름
컨텍스트 전환 더 빈번함; CPU 오버헤드가 약간 더 높음 덜 빈번함; CPU 오버헤드 감소
복잡성 관리하기가 약간 더 복잡함 더 간단하고 쉽게 구현 가능
사용 사례 타이밍이 중요한 실시간 애플리케이션 엄격한 타이밍 없이 간단하고 예측 가능한 시스템
ESP32 듀얼 코어 지원 두 코어 모두에서 효율적으로 작동합니다. 두 코어에서 작동하지만 작업에 의존하여 결과를 얻습니다.
     
작업 차단 위험 낮음 - 높은 우선순위 작업이 낮은 우선순위 작업보다 우선합니다. 높음 - 장기 실행 작업 하나가 다른 작업을 차단할 수 있음

 

 

애플리케이션에 맞는 올바른 스케줄링 모드 선택

 

선제적 스케줄링과 협력적 스케줄링 중 어떤 것을 선택할지는 ESP32 프로젝트에 따라 달라집니다.

  • 작업에 중요한 타이밍 요구 사항이 있는 경우 선제적 스케줄링을 사용합니다 .
  • 예측 가능한 작업 실행을 통해 보다 간단한 시스템에 협력 스케줄링을 활용하세요 .
  • 결정할 때 작업 우선순위 , CPU 사용량, 실시간 제약 조건을 고려하세요 .
  • 대부분의 ESP32 FreeRTOS 애플리케이션의 경우 선점형 스케줄링이 더 나은 응답성을 제공합니다.

 

ESP32 듀얼 코어에서의 타임 슬라이싱

 

FreeRTOS는 동일한 우선순위를 가진 여러 작업이 CPU 시간을 공평하게 공유할 수 있도록 합니다. 이 과정을 타임 슬라이싱 이라고 합니다 . 타임 슬라이싱은 단일 작업이 CPU를 독점하지 않도록 하여 ESP32 멀티태스킹 성능을 향상시킵니다 .

 

FreeRTOS에서 시간 분할이 작동하는 방식

 

FreeRTOS는 CPU 시간을 틱(tick) 이라고 하는 짧고 규칙적인 간격으로 나눕니다 . 각 틱은 하드웨어 타이머 인터럽트 에 의해 생성되며 , 일반적으로 구성 상수로 정의된 빈도로 발생합니다.

 

#define configTICK_RATE_HZ 1000 // 1ms per tick

 

여러 작업이 동일한 우선순위를 갖는 경우 스케줄러는 다음을 수행합니다.

  1. 틱 간격 동안 실행할 작업 하나를 선택합니다.
  2. 틱 인터럽트 후, 타임 슬라이싱이 활성화된 경우( ) 동일한 우선순위의 다음 준비 작업configUSE_TIME_SLICING = 1 으로 이동합니다 .
  3. 이 과정은 라운드 로빈 방식 으로 계속되어 모든 작업이 동일한 CPU 시간을 얻도록 보장합니다.

선점이 활성화되면 이는 자동으로 발생합니다 ( configUSE_PREEMPTION = 1).

 

예: 우선순위가 동일한 작업

 

세 가지 작업이 있다고 가정해 보겠습니다.

 

우선순위 기능
작업 A 2 네트워크 패킷 처리
작업 B 2 프로세스 센서 데이터
작업 C 2 디스플레이 업데이트

 

 

모든 작업의 ​​우선순위는 2입니다 .

 

실행 패턴(단일 코어):

 

Tick 0 → Task A
Tick 1 → Task B
Tick 2 → Task C
Tick 3 → Task A
Tick 4 → Task B
...

 

 

우선순위는 동일하지만, 각 프로세스는 공평하게 실행 시간을 할당받습니다. 이를 통해 CPU 사용량의 반응성과 공정성이 보장됩니다.

 

두 코어(코어 0 및 코어 1)에서의 작업 실행

 

ESP32에는 두 개의 CPU 코어가 있습니다 . FreeRTOS는 각 코어에서 동시에 하나의 작업을 실행할 수 있습니다. 를 사용하여 특정 코어에 작업을 할당할 수 있습니다 xTaskCreatePinnedToCore().

 

각 코어의 작업은 독립적으로 실행되지만, 스케줄러는 각 코어의 우선순위와 시간 분할을 계속 처리합니다 . 이를 통해 진정한 병렬 실행이 가능해지고 ESP32 애플리케이션의 멀티태스킹 성능이 향상됩니다.

 

예:

우선 순위 고정된 코어
작업 A 2 코어 0
작업 B 2 코어 1
작업 C 2 코어 0
과제 D 1 코어 1

 

 

이 설정에서는:

  • 작업 A 와 작업 C 사이의 코어 0 슬라이스 (동일한 우선 순위 = 2).
  • 코어 1은 작업 B (우선순위 2)와 작업 D (우선순위 1)를 실행하는데, 작업 B는 우선순위가 더 높아 작업 D를 우선시합니다.

 

이를 통해 진정한 병렬 처리가 가능합니다 . 즉, Core 0과 Core 1이 서로 다른 작업을 동시에 실행합니다 .

 

틱 속도 설정 및 작업 타이밍에 미치는 영향

 

틱 속도는 스케줄러가 실행되는 빈도를 결정합니다. 이는 FreeRTOSConfig.h 파일에서 configTICK_RATE_HZ를 사용하여 정의됩니다.

 

틱 속도가 높을수록 작업이 더 자주 전환됩니다. 이는 응답성을 향상시키지만 컨텍스트 전환 오버헤드를 증가시킵니다 . 틱 속도가 낮을수록 오버헤드는 감소하지만 작업 반응 시간이 느려질 수 있습니다 .

 

틱율 틱 지속 시간 일반적인 사용 사례 영향
1000Hz 1밀리초 높은 응답성(예: 제어 루프, 빠른 I/O) 더 많은 컨텍스트 전환, 더 높은 CPU 오버헤드
100Hz 10밀리초 일반 응용 프로그램 균형 잡힌 성능
10Hz 100밀리초 저전력, 느린 시스템 오버헤드 감소, 반응성 저하

 

 

이 다이어그램은 FreeRTOS가 ESP32의 듀얼 코어에 동일한 우선순위의 작업을 어떻게 스케줄링하는지 보여줍니다.

 

 

ESP32 듀얼 코어 프로세서에서의 FreeRTOS 시간 분할

 

각 색상 블록은 코어에서 실행되는 작업을 나타냅니다. 수직 점선은 스케줄러가 시간 분할을 수행하는 틱 인터럽트를 나타냅니다 . 코어 0과 코어 1은 각각 독립적으로 작업을 실행하여 진정한 병렬 멀티태스킹을 구현합니다 .

 

ESP32에서 FreeRTOS 스케줄러가 실행되는 방식

 

FreeRTOS 스케줄러는 백그라운드에서 지속적으로 실행됩니다. 틱 인터럽트를 사용하여 작업 상태를 확인하고 실행을 관리합니다. 스케줄러는 우선순위, 상태 및 코어 할당을 기반으로 어떤 작업을 실행할지 결정합니다 .

 

틱 인터럽트 및 작업 전환

 

틱 인터럽트는 에 정의된 주기로 발생합니다 configTICK_RATE_HZ. 각 틱을 통해 스케줄러는 작업 상태를 업데이트하고 필요한 경우 컨텍스트 전환을 수행할 수 있습니다 . 우선순위가 더 높은 작업이 준비되면 스케줄러는 실행 중인 작업을 즉시 선점합니다. 이를 통해 중요한 작업이 에 따라 CPU 시간을 할당받도록 보장합니다 .

 

듀얼 코어에서의 우선순위 기반 스케줄링

 

ESP32에는 두 개의 코어가 있으며 , 각 코어는 독립적으로 작업을 실행할 수 있습니다. FreeRTOS는 각 코어에 우선순위 기반 스케줄링을 사용합니다 . 를 사용하여 특정 코어에 작업을 할당할 수 있습니다 xTaskCreatePinnedToCore(). 스케줄러는 두 코어 모두에서 준비된 작업을 확인하고 각 코어에서 우선순위가 가장 높은 작업을 실행합니다 . 이를 통해 효율적인 멀티태스킹 과 CPU 활용도를 높일 수 있습니다.

 

스케줄러 동작의 실제 예

 

세 가지 작업이 있다고 상상해보세요.

  1. 작업 A – 높은 우선순위(센서 판독)
  2. 작업 B – 중간 우선순위(Wi-Fi 통신)
  3. 작업 C – 낮은 우선순위(LED 깜박임)

 

작업 A가 준비되면 스케줄러는 즉시 작업 B 또는 C를 선점합니다 . 작업 B는 작업 A가 차단되거나 지연될 때만 실행됩니다. 작업 C는 CPU 유휴 시간 동안 마지막으로 실행됩니다.

 

 

 

FreeRTOS 스케줄러가 중간 우선순위 작업을 높은 우선순위 작업으로 우선 처리하는 모습을 보여주는 타임라인입니다. 낮은 우선순위 작업은 유휴 시간에만 실행됩니다.

 

이 다이어그램은 FreeRTOS 스케줄러가 단일 코어에서 서로 다른 우선순위의 작업들을 관리하는 방식을 보여줍니다. 작업 B(중간 우선순위)가 먼저 실행됩니다. 작업 A(높은 우선순위)가 틱 2에서 준비 상태가 되면 즉시 작업 B를 선점합니다. 작업 A는 차단될 때까지 실행되다가 차단된 후 작업 B가 재개됩니다. 작업 C(낮은 우선순위)는 우선순위가 높은 작업들이 준비되지 않은 CPU 유휴 시간 동안만 실행됩니다.

 

수직 점선은 시스템 틱(tick)을 나타내며, 작업 전환 시점을 보여줍니다. 이 시각화는 FreeRTOS가 어떻게 우선순위가 높은 작업은 CPU 시간을 즉시 확보하고 우선순위가 낮은 작업은 상황에 따라 실행되는지 이해하는 데 도움이 됩니다.

 

FreeRTOS 스케줄러 디버깅 및 모니터링

 

ESP32에서 효율적인 멀티태스킹은 스케줄러의 원활한 실행에 달려 있습니다. 스케줄러 모니터링 및 디버깅은 작업이 올바르게 실행되고, 시스템 리소스가 충분하며, 애플리케이션의 응답성이 유지되도록 하는 데 매우 중요합니다.

 

적절한 모니터링이 없으면 타이밍 오류, CPU 과부하, 스택 오버플로 와 같은 문제가 눈에 띄지 않아 충돌이나 예측할 수 없는 동작이 발생할 가능성이 있습니다.

 

FreeRTOS Trace 또는 ESP-IDF 시스템 뷰 사용

 

FreeRTOS Trace와 ESP-IDF SystemView는 작업 실행을 시각화하는 강력한 도구입니다.

 

FreeRTOS 추적 :

  • 작업 생성, 삭제, 상태 변경 등의 이벤트를 기록합니다.
  • 각 작업에 소요된 시간과 컨텍스트 전환을 보여줍니다 .
  • 작업이 과도한 CPU 시간을 소모하는 병목 현상을 식별하는 데 도움이 됩니다 .

 

ESP-IDF 시스템뷰 :

  • ESP32에서 작업 실행의 실시간 타임라인을 제공합니다 .
  • 선점 이벤트 , 인터럽트, 틱 타이밍을 표시합니다 .
  • 듀얼 코어 ESP32의 두 코어를 자세히 검사할 수 있습니다.

 

실용적인 팁: 작업 타임라인을 시각화하면 CPU를 독점하는 작업 , 불필요하게 다른 작업을 차단하는 작업 또는 우선순위 문제로 인해 작업이 부족한 작업을 파악할 수 있습니다.

 

작업 런타임 및 스택 사용량 확인

 

FreeRTOS는 작업 상태를 모니터링하기 위한 기본 제공 기능을 제공합니다.

 

스택 사용 :uxTaskGetStackHighWaterMark(TaskHandle_t xTask);

  • 남은 최소 스택 공간을 반환합니다.
  • 스택 오버플 로 위험이 있는 작업을 감지하는 데 도움이 됩니다 .

 

작업 런타임 통계 :vTaskGetRunTimeStats(char *pcWriteBuffer);

  • 각 작업에 소모된 CPU 시간을 보여줍니다 .
  • 작업 실행의 균형을 맞추고 CPU를 많이 사용하는 부분을 식별하는 데 유용합니다.

 

예: 센서 판독 작업이 CPU 시간의 80%를 사용하는 반면 디스플레이 작업은 5%를 사용하는 경우 응답성을 유지하기 위해 우선순위를 조정하거나 코드를 최적화 해야 할 수 있습니다 .

 

작업 스케줄링 성능 최적화를 위한 팁

 

  • 작업을 짧고 효율적으로 유지하세요

작업 내에서 긴 루프나 지연을 피하세요.

긴 작업을 작은 단위로 나누어 다른 작업을 실행할 수 있도록 합니다.

 

  • 적절한 우선순위를 지정하세요

센서 판독이나 안전 점검과 같은 중요한 작업 → 높은 우선순위.

로깅이나 LED 업데이트와 같은 중요하지 않은 작업 → 우선순위가 낮음.

 

  • 시간 분할을 현명하게 활용하세요

동일한 우선순위의 작업에 대해서는 빈번한 컨텍스트 전환으로 인해 과도한 오버헤드가 발생하지 않도록 주의하세요.

 

  • 양보 없이 긴 차단 작업을 피하십시오.

vTaskDelay(), vTaskDelayUntil()을 사용하거나 세마포어에서 대기하십시오.

양보하지 않고 차단하면 다른 작업이 실행되지 않아 시스템이 느려집니다.

 

  • 틱 속도를 신중하게 조정하세요

더 높음 configTICK_RATE_HZ→ 반응성은 좋아지지만 컨텍스트 전환 오버헤드가 더 커짐.

낮은 틱율 → 오버헤드는 적지만 반응 시간은 느립니다.

 

  • SystemView/Trace를 사용하여 정기적으로 모니터링합니다.

미묘한 타이밍 문제를 일찍 감지합니다.

예상 시간 예산 내에서 작업이 실행되는지 확인하세요.

 

실제 사례

 

다음과 같은 프로젝트를 상상해 보세요.

  • 작업 A: 10ms마다 센서를 읽습니다(높은 우선순위).
  • 작업 B: Wi-Fi 데이터를 전송합니다(중간 우선순위).
  • 작업 C: LED 업데이트(우선순위 낮음).

 

SystemView로 모니터링하면 다음이 표시됩니다.

  • 작업 A가 B와 C보다 먼저 올바르게 작업을 수행합니다.
  • 작업 B가 너무 오랫동안 차단되는 경우가 있습니다. → Wi-Fi 패킷이 지연됩니다.
  • 작업 C는 CPU가 유휴 상태일 때 실행됩니다.

 

이를 통해 작업 B를 최적화하여 긴 작업을 더 작은 단위로 분할하거나 우선순위를 조정하여 성능을 개선할 수 있습니다.

 

 

ESP32에서 FreeRTOS 작업의 타임라인은 실행 블록, CPU 사용량, 스택 경고 및 선점 이벤트를 보여줍니다.

 

이 다이어그램은 FreeRTOS가 ESP32에서 다양한 우선순위의 작업을 스케줄링하는 방식과 모니터링 도구가 성능 문제를 식별하는 데 어떻게 도움이 되는지 보여줍니다. 각 레인은 작업을 나타냅니다. 작업 A (높은 우선순위, 센서 감지), 작업 B (중간 우선순위, Wi-Fi 통신), 작업 C (낮은 우선순위, LED 업데이트). 색상 블록은 각 작업이 실행 중인 시간을 나타냅니다.

 

CPU 사용량 막대는 각 작업이 소비한 프로세서 시간의 백분율을 나타내며, 스택 경고 아이콘은 스택 오버플로 위험이 있는 작업을 강조 표시합니다. 화살표는 작업 A가 작업 B를 중단하는 선점 이벤트를 나타냅니다. 작업 실행, CPU 사용량 및 스택 수준을 모니터링하면 시스템 성능을 최적화하고 충돌을 방지하는 데 도움이 됩니다.

 

결론

 

이 튜토리얼에서는 ESP-IDF를 사용하여 ESP32에서 FreeRTOS 스케줄러를 살펴보았습니다 . 작업 상태 , 컨텍스트 스위칭 , 선점형 스케줄링과 협력형 스케줄링 , 그리고 듀얼 코어에서의 타임 슬라이싱에 대해 다루었습니다 .

 

스케줄러를 이해하면 효율적이고 반응성이 뛰어난 ESP32 애플리케이션을 설계하는 데 도움이 됩니다 . 작업 우선순위를 관리하고 , CPU 사용량을 최적화하며, 중요한 작업이 정시에 실행되도록 할 수 있습니다 .

 

다음 부분에서는 FreeRTOS 작업 우선순위와 스택 관리에 대해 알아보겠습니다.

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩