우선순위와 선점: 급한 일이 먼저
선점형 스케줄러는 더 높은 우선순위 태스크가 준비되는 즉시 CPU를 넘깁니다. 우선순위를 정하는 기준.
선점형 스케줄링
FreeRTOS 기본 동작은 "Ready 상태인 태스크 중 가장 높은 우선순위를 실행"입니다. 낮은 태스크가 실행 중이어도 높은 태스크가 깨어나면 즉시 바뀝니다. 같은 우선순위끼리는 틱마다 번갈아 실행(라운드 로빈)합니다.
우선순위 정하는 기준
마감이 짧고 엄격한 것일수록 높게 줍니다(비율 단조 스케줄링의 직관).
| 태스크 | 주기 / 마감 | 우선순위 |
|---|---|---|
| 모터 속도 제어 | 1ms | 높음 |
| IMU 읽기 | 5ms | 중상 |
| CAN 통신 | 10ms | 중 |
| 화면 갱신 | 50ms | 낮음 |
| 로그 저장 | 여유 | 가장 낮음 |
"중요한 것"이 아니라 "늦으면 안 되는 것"이 높은 우선순위입니다. 화면이 중요해 보여도 50ms 늦어도 문제가 없습니다.
인터럽트와의 관계
인터럽트는 어떤 태스크보다도 먼저 실행됩니다. 전류 제어처럼 10kHz 이상 루프는 태스크가 아니라 인터럽트에서 돌리고, 태스크는 그 위의 느린 루프를 맡깁니다.
굶주림
높은 우선순위 태스크가 Blocked로 가지 않고 계속 돌면 아래 태스크는 영원히 실행되지 않습니다. 모든 태스크에는 기다리는 지점(delay, 큐 대기)이 있어야 합니다.