메모리와 스택 관리
태스크마다 스택 크기를 정해야 하고, 넘치면 다른 태스크의 메모리를 망가뜨립니다. 스택 크기를 재고 넘침을 잡는 방법.
태스크마다 스택이 있다
xTaskCreate(..., 256, ...)의 256은 워드(4바이트) 단위라서 1KB입니다. 태스크가 10개면 스택만 10KB를 씁니다. 함수 호출 깊이, 지역 배열, printf(1KB 이상을 쓰는 경우 흔함)가 스택을 먹습니다.
얼마나 쓰는지 재기
UBaseType_t left = uxTaskGetStackHighWaterMark(NULL); // 남은 최소량(워드)
모든 기능을 최대로 돌려 본 뒤 남은 양을 보고, 사용량의 1.5~2배로 크기를 정합니다.
무료 전자책이 주제를 한 권으로 이어 읽기 (PDF 3권)→넘침 감지
#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)를 쓰면 힙 없이 컴파일 시점에 메모리를 확정할 수 있어서 안전 관련 제품에서 선호합니다.
영상으로 이어 보기RC카 만들기 시리즈 6편대기업 임베디드 개발자 Lego RC카 메이킹 시작합니다. 【RC카 개발1】FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →