그라운드 임베디드 유튜브 구독

노트 / RTOS

펌웨어RTOS2 / 8

태스크와 스케줄러

작업을 각자의 무한 루프를 가진 태스크로 나누고, 스케줄러가 CPU 시간을 나눠 줍니다. 태스크 상태와 틱의 개념.

GROUND EMBEDDED · 정리 노트RTOS 02태스크와 스케줄러 1void imu_task(void *arg) { 2 for (;;) { 3 read_imu(); 4 vTaskDelay(pdMS_TO_TICKS(1));// 1m…

태스크

태스크는 자기만의 스택을 가진 무한 루프 함수입니다.

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 예외가 이 일을 합니다.

태스크 나누기

센서 읽기, 제어, 통신, 화면, 로그처럼 주기와 마감이 다른 일끼리 나눕니다. 너무 잘게 나누면 태스크 간 통신이 오히려 복잡해집니다.