태스크와 스케줄러
작업을 각자의 무한 루프를 가진 태스크로 나누고, 스케줄러가 CPU 시간을 나눠 줍니다. 태스크 상태와 틱의 개념.
태스크
태스크는 자기만의 스택을 가진 무한 루프 함수입니다.
void imu_task(void *arg) {
for (;;) {
read_imu();
vTaskDelay(pdMS_TO_TICKS(1)); // 1ms 동안 CPU를 양보
}
}
xTaskCreate(imu_task, "imu", 256, NULL, 3, NULL);
태스크 상태
| 상태 | 의미 |
|---|---|
| Running | 지금 CPU를 쓰는 중 (코어당 하나) |
| Ready | 실행할 수 있지만 차례를 기다림 |
| Blocked | 시간, 큐, 세마포어를 기다리며 잠듦 |
| Suspended | 명시적으로 멈춤 |
대부분의 시간 동안 태스크는 Blocked 상태여야 합니다. 아무 일도 없을 때 CPU를 붙잡고 도는 태스크가 있으면 낮은 우선순위 태스크가 굶습니다.
틱과 컨텍스트 전환
SysTick이 1ms마다 인터럽트를 걸어(틱) 스케줄러가 다음에 실행할 태스크를 고릅니다. 태스크를 바꿀 때는 현재 레지스터를 그 태스크 스택에 저장하고 다음 태스크의 레지스터를 복원합니다. Cortex-M에서는 PendSV 예외가 이 일을 합니다.
태스크 나누기
센서 읽기, 제어, 통신, 화면, 로그처럼 주기와 마감이 다른 일끼리 나눕니다. 너무 잘게 나누면 태스크 간 통신이 오히려 복잡해집니다.