Firmware & RTOS/FreeRTOS & Real-time Scheduling

FreeRTOS 저전력 최적화 가이드: Idle Task와 Tickless Idle 모드 활용법

임베디드 친구 2025. 1. 16. 08:46
반응형

임베디드 소프트웨어 개발자에게 '저전력(Low Power)'은 성능만큼이나 중요한 과제입니다. 특히 배터리로 구동되는 IoT 기기에서는 CPU가 쉬는 시간을 얼마나 잘 활용하느냐가 제품의 경쟁력을 결정합니다.

이번 포스팅에서는 FreeRTOS(CMSIS-RTOS v2) 환경에서 CPU 유휴 시간을 관리하는 Idle Task의 역할과, 전력 소비를 획기적으로 줄여주는 Tickless Idle 모드 설정법을 알아보겠습니다.

Generated by Gemini AI.


1. Idle Task의 역할: 시스템의 '안전장치'이자 '휴식처'

Idle Task는 FreeRTOS 커널이 생성하는 우선순위가 가장 낮은(0순위) 태스크입니다. 실행 가능한 다른 태스크가 없을 때 시스템은 자동으로 이 태스크를 수행합니다.

핵심 역할

  • 자원 회수: vTaskDelete() 함수로 삭제된 태스크가 점유했던 메모리(Stack, TCB)를 해제하고 시스템으로 반환합니다.
  • 전력 관리: CPU가 할 일이 없을 때 전력 소비를 줄이는 코드를 실행하는 최적의 장소입니다.
  • 상태 감시: Watchdog 타이머를 리셋하거나 시스템 통계를 수집하는 용도로도 활용됩니다.

2. Idle Hook을 활용한 간단한 저전력 진입

가장 기본적인 방법은 Idle Hook 함수를 사용하는 것입니다. CPU가 유휴 상태일 때 vApplicationIdleHook() 내에서 Cortex-M의 __WFI() 명령어를 실행하면, 인터럽트가 발생하기 전까지 CPU는 저전력 대기 상태로 들어갑니다.

C
 
// CMSIS-RTOS v2 기반 Idle Hook 예제
void vApplicationIdleHook(void) {
    // 1. 단순 저전력 모드 진입 (Wait For Interrupt)
    // 인터럽트 발생 전까지 CPU 코어 클럭을 정지시킵니다.
    __WFI(); 
}

3. 전력 최적화의 꽃: Tickless Idle 모드

기본적인 RTOS는 1ms마다 발생하는 Systick 인터럽트 때문에 CPU가 저전력 모드에 깊게 들어가지 못하고 계속 깨어나게 됩니다. 이를 해결하는 것이 바로 Tickless Idle 모드입니다.

동작 원리

시스템이 장시간(예: 100ms 이상) 유휴 상태일 것이 예상되면, 시스템 타이머 인터럽트를 일시 중지하고 예상된 시간만큼 타이머를 재설정하여 불필요한 깨어남을 방지합니다.

활성화 방법 (FreeRTOSConfig.h)

C
 
/* Tickless Idle 모드 활성화 */
#define configUSE_TICKLESS_IDLE    1

/* 사용자가 직접 저전력 진입 로직을 짜고 싶을 때 (Optional) */
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP    2 
  • configUSE_TICKLESS_IDLE: 1로 설정하면 커널이 자동으로 저전력 진입을 관리합니다.
  • WFI 적용: 별도 설정이 없으면 기본적으로 __WFI()를 호출하며, 필요한 경우 vPortSuppressTicksAndSleep()을 구현하여 Deep Sleep 모드로 커스터마이징할 수 있습니다.

4. CMSIS-RTOS v2 설정 및 전력 최적화 팁

임베디드 소프트웨어 개발자로서 실무에서 바로 적용 가능한 전력 최적화 팁을 정리해 드립니다.

  1. 인터럽트 기반 설계: 주기적으로 폴링(Polling)하는 루프를 없애고, 이벤트가 발생했을 때만 세마포어나 큐로 태스크를 깨우도록 설계하세요.
  2. Unused I/O 관리: 사용하지 않는 핀은 아날로그 모드나 High-Z 상태로 두어 누설 전류를 차단합니다.
  3. DMA 활용: 데이터 전송 시 CPU가 개입하지 않도록 DMA를 사용하면, 전송 도중에도 CPU는 Sleep 모드를 유지할 수 있습니다.
  4. 클럭 최적화: 작업이 없을 때는 시스템 클럭 주파수를 낮추는 것도 큰 도움이 됩니다.

결론

저전력 MCU 환경에서 Idle TaskTickless Idle은 선택이 아닌 필수입니다. 단순히 코드만 작성하는 것이 아니라, 하드웨어의 저전력 모드(Sleep, Stop, Standby) 특성을 이해하고 RTOS와 연동하는 것이 임베디드 개발자의 핵심 역량입니다.

이번 포스팅에서 다룬 설정들을 통해 여러분의 프로젝트 배터리 효율을 극대화해 보시기 바랍니다!


도움이 되셨다면 공감과 댓글 부탁드립니다! 여러분은 저전력 설계를 위해 어떤 트릭을 사용하시나요?

반응형