FreeRTOS에서 task의 state는 4가지로 구성되어 있다. Scheduler는 각 task가 어떤 state에 있는지 기록함으로써 이를 관리한다.
1. Ready
task가 생성되면, 해당 task는 자동으로 Ready State
로 진입한다. Ready State에서 task는 scheduler에게 언제나 실행(run)될 준비가 되었음을 의미한다.
2. Running
- Scheduler는 더 높은 priority의 다른 task가 없다면, Ready State에 있는 task를 Running State
로 옮긴다. 해당 task는 processor에 의해 수행되는 동안 Running State에 존재한다.
- processor가 하나의 core만 갖고 있다면(single core), 특정 시간에 Running State에 있는 task는 오직 1개 뿐이다.
- 각 tick마다 필요에 따라 Ready State와 Running State 양방향으로 전환이 가능하다.
3. Blocked
Running State에서 Blocking API function이 호출되면 Blocked State
로 state가 전환된다. Blocking API function의 예시로는 queue, semaphore의 대기상태나 vTaskDelay()
같은 경우가 있다.
Blocked State에 있는 task는 processor에서 수행되지 않으며, Running State로 전환될 수 없다. Blocked State에 있는 task는 unblocking event가 발생할때까지 Blocked State에 갇혀 있다. unblocking event로는 delay timer 만료, semaphore release 등이 있다.
4. Suspended
FreeRTOS에서는 vTaskSuspend()
를 통해 task가 다른 state들에서 Suspended State
로 진입할 수 있다. Suspended State에서도 Blocked State와 마찬가지로 Running State로 들어갈 수 없다.
Suspended State에서는 vTaskResume()
함수를 통해서만 Ready State로 돌아갈 수 있다. 따라서 Blocked State와 다르게, timer에 의존하고 싶지 않을 경우, 일종의 sleep mode에 진입하도록 할 수 있다.
Reference
Introduction to RTOS Part 3 - Task Scheduling | Digi-Key Electronics - YouTube
'Embedded > RTOS' 카테고리의 다른 글
ESP-IDF에서 FreeRTOS Task로 ESP32 LED Blinking하기 (0) | 2022.01.04 |
---|
댓글