임베디드 용어 사전
구조·RTOS

태스크

RTOS가 독립적으로 실행하는 단위. 각자 자기 스택을 갖고, 스케줄러가 우선순위에 따라 교체한다.

RTOS 를 쓰는 이유가 이것이다 — 각 작업이 자기 실행 문맥을 갖는다.

베어메탈   스택 하나. 함수가 끝나야 다음으로 간다
RTOS      태스크마다 스택. 중간에 멈췄다가 나중에 이어서 실행된다

그래서 태스크 안에서는 블로킹해도 된다.

void sensor_task(void *arg) {
    for (;;) {
        int v = read_sensor();
        xQueueSend(q, &v, portMAX_DELAY);   /* 기다려도 다른 태스크는 돈다 */
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

대가

RAM       태스크마다 스택이 필요하다. 개수가 곧 메모리다
복잡도     공유 데이터 보호·우선순위 설계·데드락 가능성이 생긴다
디버깅     "지금 어느 태스크였나" 를 늘 따져야 한다

스택 크기를 어떻게 정하나

시작은 넉넉히 잡고, 워터마크(사용한 최대 깊이)를 측정해 줄인다. 스택을 정해진 패턴으로 채워 두고 얼마나 덮였는지 보는 방법이 표준이다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — RTOS — 선점과 블로킹을 되찾는다