RTOS 를 쓰는 이유가 이것이다 — 각 작업이 자기 실행 문맥을 갖는다.
베어메탈 스택 하나. 함수가 끝나야 다음으로 간다
RTOS 태스크마다 스택. 중간에 멈췄다가 나중에 이어서 실행된다
그래서 태스크 안에서는 블로킹해도 된다.
void sensor_task(void *arg) {
for (;;) {
int v = read_sensor();
xQueueSend(q, &v, portMAX_DELAY); /* 기다려도 다른 태스크는 돈다 */
vTaskDelay(pdMS_TO_TICKS(10));
}
}
대가
RAM 태스크마다 스택이 필요하다. 개수가 곧 메모리다
복잡도 공유 데이터 보호·우선순위 설계·데드락 가능성이 생긴다
디버깅 "지금 어느 태스크였나" 를 늘 따져야 한다
스택 크기를 어떻게 정하나
시작은 넉넉히 잡고, 워터마크(사용한 최대 깊이)를 측정해 줄인다. 스택을 정해진 패턴으로 채워 두고 얼마나 덮였는지 보는 방법이 표준이다.