실시간 운영 체제(RTOS) 환경에서 발생하는 버그는 재현이 어렵고 타이밍에 민감한 경우가 많습니다. 특히 스택 오버플로우(Stack Overflow)나 우선순위 역전(Priority Inversion)은 시스템을 완전히 멈추게 만드는 치명적인 원인이 됩니다.
이번 포스팅에서는 CMSIS-RTOS v2 및 네이티브 API를 활용하여 시스템 상태를 모니터링하고, 자주 발생하는 3가지 핵심 문제를 해결하는 디버깅 기법을 정리해 보겠습니다.

1. 실시간 태스크 상태 모니터링 기법
시스템이 의도대로 동작하지 않을 때는 현재 태스크들이 어떤 상태에 있는지 파악하는 것이 급선무입니다.
1.1 vTaskList를 활용한 상태 요약
vTaskList API를 사용하면 모든 태스크의 상태(Running, Ready, Blocked 등)와 스택 여유 공간을 한눈에 확인할 수 있습니다.
void Print_System_Status(void) {
char buffer[512];
// 태스크 명칭, 상태, 우선순위, 남은 스택 등을 문자열로 변환
vTaskList(buffer);
printf("Name State Priority Stack Num\n");
printf("%s\n", buffer);
}
1.2 런타임 통계 (Run-time Stats)
특정 태스크가 CPU를 과점하고 있지는 않은지 확인하려면 vTaskGetRunTimeStats를 활용하세요. 각 태스크의 CPU 점유율을 백분율로 확인할 수 있어 성능 최적화에 필수적입니다.
2. 치명적 오류: 스택 오버플로우 탐지 및 방지
임베디드 개발자를 가장 괴롭히는 문제 중 하나가 바로 스택 부족입니다.
스택 오버플로우 훅(Hook) 활성화
FreeRTOSConfig.h에서 아래 설정을 활성화하면, 스택 오버플로우 발생 시 즉시 특정 함수가 호출됩니다.
#define configCHECK_FOR_STACK_OVERFLOW 2 // 2단계 검사 (가장 강력)
// 오버플로우 발생 시 호출될 콜백 함수
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
// 로그 기록 또는 안전한 상태로 시스템 정지
printf("FATAL: Stack Overflow in [%s]\n", pcTaskName);
while(1);
}
3. 자주 발생하는 문제와 해결 전략
3.1 우선순위 역전 (Priority Inversion)
- 문제: 낮은 우선순위 태스크가 세마포어를 쥐고 있어, 높은 우선순위 태스크가 실행되지 못하는 현상입니다.
- 해결: 뮤텍스(Mutex)를 사용하세요. FreeRTOS의 뮤텍스는 우선순위 상속(Priority Inheritance) 기능을 지원하여, 공유 리소스를 점유한 태스크의 우선순위를 일시적으로 높여 문제를 해결합니다.
3.2 메모리 부족 (Heap Memory)
- 문제: osThreadNew나 osQueueNew 호출 시 실패(NULL 반환)하는 경우입니다.
- 해결:
- xPortGetFreeHeapSize()로 남은 힙 메모리를 주기적으로 체크하세요.
- 가능하다면 정적 할당(Static Allocation)을 사용하여 런타임 메모리 부족 위험을 사전에 차단하세요.
4. 디버깅 효율을 높이는 팁
- Assert 활용: configASSERT 매크로를 정의하여 함수 반환값이나 포인터 유효성을 실시간으로 검증하세요.
- 타임아웃 설정: 모든 블로킹 함수(osMessageQueueGet 등)에는 osWaitForever 대신 적절한 타임아웃을 설정하여 시스템 데드락을 방지하세요.
- Trace 도구 활용: Segger SystemView나 Percepio Tracealyzer 같은 도구를 사용하면 태스크 전환 과정을 시각적으로 분석할 수 있습니다.
결론
FreeRTOS 디버깅의 핵심은 "보이지 않는 것을 보이게 만드는 것"입니다. vTaskList와 StackOverflowHook만 적절히 사용해도 디버깅 시간의 절반 이상을 단축할 수 있습니다. 오늘 소개한 기법들을 여러분의 프로젝트에 적용하여 더 견고한 시스템을 설계해 보세요!
도움이 되셨나요? 디버깅 중 해결되지 않는 특이한 현상이 있다면 댓글로 공유해 주세요. 함께 고민해 보겠습니다!
'Firmware & RTOS > FreeRTOS & Real-time Scheduling' 카테고리의 다른 글
| FreeRTOS IoT 프로젝트: STM32 기반 온습도 모니터링 시스템 구현 가이드 (0) | 2025.01.18 |
|---|---|
| CMSIS-RTOS v1 vs v2 차이점 완벽 정리: FreeRTOS 마이그레이션 가이드 (0) | 2025.01.18 |
| FreeRTOS 이벤트 그룹(Event Group) 완벽 가이드: 다중 태스크 동기화 (CMSIS-RTOS v2) (0) | 2025.01.17 |
| FreeRTOS 저전력 최적화 가이드: Idle Task와 Tickless Idle 모드 활용법 (0) | 2025.01.16 |
| FreeRTOS 소프트웨어 타이머 완벽 가이드: osTimerNew 사용법 및 예제 (CMSIS-RTOS v2) (0) | 2025.01.15 |