그라운드 임베디드 유튜브 구독

노트 / RTOS

펌웨어RTOS7 / 8

메모리와 스택 관리

태스크마다 스택 크기를 정해야 하고, 넘치면 다른 태스크의 메모리를 망가뜨립니다. 스택 크기를 재고 넘침을 잡는 방법.

GROUND EMBEDDED · 정리 노트RTOS 07메모리와 스택 관리 1UBaseType_t left = uxTaskGetStackHighWa…// 남은…

태스크마다 스택이 있다

xTaskCreate(..., 256, ...)의 256은 워드(4바이트) 단위라서 1KB입니다. 태스크가 10개면 스택만 10KB를 씁니다. 함수 호출 깊이, 지역 배열, printf(1KB 이상을 쓰는 경우 흔함)가 스택을 먹습니다.

얼마나 쓰는지 재기

UBaseType_t left = uxTaskGetStackHighWaterMark(NULL);   // 남은 최소량(워드)

모든 기능을 최대로 돌려 본 뒤 남은 양을 보고, 사용량의 1.5~2배로 크기를 정합니다.

넘침 감지

#define configCHECK_FOR_STACK_OVERFLOW 2
void vApplicationStackOverflowHook(TaskHandle_t t, char *name) { /* 기록 후 정지 */ }

방법 2는 스택 끝에 패턴을 써 두고 컨텍스트 전환 때마다 확인합니다. Cortex-M33 이상은 하드웨어 스택 한계 레지스터(PSPLIM)로 즉시 잡을 수 있습니다.

힙

FreeRTOS 객체(태스크, 큐, 세마포어)는 기본적으로 FreeRTOS 힙에서 만들어집니다.

힙 구현 특징
heap_1 할당만, 해제 없음. 시작 때 다 만들고 끝인 시스템에 가장 안전
heap_4 해제 가능, 인접 블록 합침. 범용

정적 할당 API(xTaskCreateStatic)를 쓰면 힙 없이 컴파일 시점에 메모리를 확정할 수 있어서 안전 관련 제품에서 선호합니다.