FreeRTOS는 실시간 운영체제(RTOS)로서 다양한 스케줄링 기법을 제공하여 임베디드 시스템에서 효율적인 멀티태스킹을 가능하게 합니다[1][2]. 본 문서에서는 FreeRTOS에서 사용되는 스케줄링 기법들을 체계적으로 정리하겠습니다.
1. FreeRTOS 스케줄링 개요
FreeRTOS 스케줄러는 특정 시간에 실행해야 하는 태스크를 결정하는 커널의 핵심 구성 요소입니다[3]. 스케줄러는 태스크 수명 동안 여러 번 태스크를 일시 중단했다가 나중에 다시 시작할 수 있으며, 이를 통해 멀티태스킹 환경을 구현합니다[1][2].
태스크 상태
FreeRTOS에서 각 태스크는 다음 4가지 상태 중 하나를 가집니다[4][5]:
- Running: 현재 프로세서에서 실행 중인 상태
- Ready: 실행 준비가 완료된 상태로, 스케줄러에 의해 선택되기를 대기
- Blocked: 특정 이벤트(세마포어, 큐, 지연 등)를 기다리는 상태
- Suspended: 명시적으로 일시 중단된 상태
2. 스케줄링 모드
FreeRTOS는 두 가지 주요 스케줄링 모드를 지원합니다[6][7].
2.1 선점형 스케줄링 (Preemptive Scheduling)
선점형 스케줄링에서는 우선순위가 높은 태스크가 준비 상태가 되면 현재 실행 중인 낮은 우선순위 태스크를 즉시 선점합니다[2][6]. 이는 우선순위가 높은 태스크의 빠른 처리를 가능하게 하지만, 실행 시간 예측이 어렵고 오버헤드가 다소 존재합니다[8].
설정 방법:
#define configUSE_PREEMPTION 1
2.2 협력형 스케줄링 (Cooperative Scheduling)
협력형 스케줄링에서는 현재 실행 중인 태스크가 자발적으로 CPU 사용권을 양보할 때만 태스크 전환이 발생합니다[6][7]. 태스크는 taskYIELD()
함수를 호출하거나 블록 상태로 진입할 때만 다른 태스크로 전환됩니다[6].
설정 방법:
#define configUSE_PREEMPTION 0
3. 주요 스케줄링 알고리즘
3.1 우선순위 기반 스케줄링 (Priority-Based Scheduling)
FreeRTOS의 기본 스케줄링 방식으로, 항상 실행 가능한 태스크 중 가장 높은 우선순위를 가진 태스크가 실행됩니다[2][9]. 우선순위는 숫자가 높을수록 높은 우선순위를 의미하며, configMAX_PRIORITIES
까지 설정 가능합니다[10].
특징:
- 높은 우선순위 태스크가 낮은 우선순위 태스크를 선점
- 실시간 응답성 보장
- 우선순위 역전 문제 발생 가능 (우선순위 상속으로 해결)[10]
3.2 라운드 로빈 스케줄링 (Round Robin Scheduling)
동일한 우선순위를 가진 태스크들 간에 CPU 시간을 공평하게 분배하는 방식입니다[2][9]. 각 태스크는 정해진 시간 슬롯(time slice) 동안 실행되며, 시간이 만료되면 다음 태스크로 전환됩니다[11].
특징:
- 동일 우선순위 태스크들의 공평한 시간 분배
- 타임 슬라이싱을 통한 순환적 실행
- 시간 슬롯은 시스템 틱 인터럽트 주기와 연관[2]
3.3 시간 슬라이싱 (Time Slicing)
시간 슬라이싱은 라운드 로빈 스케줄링의 핵심 메커니즘으로, 동일한 우선순위의 태스크들이 정해진 시간 간격으로 CPU를 공유하는 방식입니다[11][12].
설정 방법:
#define configUSE_TIME_SLICING 1 // 활성화
#define configUSE_TIME_SLICING 0 // 비활성화
4. 복합 스케줄링 정책
4.1 우선순위 기반 선점형 + 시간 슬라이싱
FreeRTOS의 가장 일반적인 스케줄링 정책으로, 다음과 같은 특성을 가집니다[2][11]:
- 고정 우선순위: 태스크의 우선순위는 스케줄러에 의해 변경되지 않음
- 선점형: 높은 우선순위 태스크가 낮은 우선순위 태스크를 즉시 선점
- 시간 슬라이싱: 동일 우선순위 태스크들 간의 라운드 로빈 스케줄링
설정:
#define configUSE_PREEMPTION 1
#define configUSE_TIME_SLICING 1
4.2 FIFO 스케줄링
동일한 우선순위 태스크들이 선입선출(First In, First Out) 방식으로 실행되는 정책입니다[7][13]. 시간 슬라이싱을 비활성화하면 FIFO 방식으로 동작합니다.
설정:
#define configUSE_PREEMPTION 1
#define configUSE_TIME_SLICING 0
5. 스케줄링 설정 옵션
5.1 주요 설정 매개변수
FreeRTOSConfig.h 파일에서 다음 매개변수들을 통해 스케줄링 동작을 제어할 수 있습니다[14][15]:
// 선점형/협력형 모드 선택
#define configUSE_PREEMPTION 1
// 시간 슬라이싱 활성화/비활성화
#define configUSE_TIME_SLICING 1
// 시스템 틱 주파수 (Hz)
#define configTICK_RATE_HZ 1000
// 최대 우선순위 수
#define configMAX_PRIORITIES 5
// Tickless Idle 모드 (전력 절약)
#define configUSE_TICKLESS_IDLE 0
5.2 틱 인터럽트 설정
시스템 틱 인터럽트는 스케줄링의 기본 시간 단위를 제공합니다[16][17]. 틱 주파수는 configTICK_RATE_HZ
로 설정되며, 일반적으로 1000Hz(1ms)를 사용합니다[16].
시간 계산:
- 시간 슬롯 = 1 / configTICK_RATE_HZ
- 예: configTICK_RATE_HZ = 1000 → 시간 슬롯 = 1ms
6. 스케줄링 동작 예시
6.1 선점형 스케줄링 시나리오
- 태스크 A (우선순위 1)가 실행 중
- 태스크 B (우선순위 2)가 준비 상태로 전환
- 스케줄러가 태스크 A를 선점하고 태스크 B 실행
- 태스크 B가 블록되면 태스크 A가 다시 실행
6.2 라운드 로빈 스케줄링 시나리오
동일한 우선순위를 가진 태스크 X, Y, Z가 있을 때:
- 태스크 X가 시간 슬롯 동안 실행
- 틱 인터럽트 발생 시 태스크 Y로 전환
- 태스크 Y 실행 후 태스크 Z로 전환
- 태스크 Z 실행 후 다시 태스크 X로 순환
7. 스케줄링 최적화 고려사항
7.1 우선순위 설계
- 높은 우선순위: 실시간성이 중요한 태스크
- 중간 우선순위: 일반적인 애플리케이션 태스크
- 낮은 우선순위: 백그라운드 작업, 아이들 태스크
7.2 성능 최적화
- 적절한 틱 주파수 선택 (너무 높으면 오버헤드 증가)
- 태스크 간 우선순위 적절한 분배
- 블로킹 함수 활용으로 CPU 양보 유도[18]
- 임계 섹션 최소화
8. 제한사항 및 주의사항
8.1 협력형 스케줄링의 한계
협력형 스케줄링은 태스크가 자발적으로 CPU를 양보해야 하므로, 잘못 설계된 태스크가 시스템 전체를 블록시킬 수 있습니다[19]. 특히 네트워크 스택과 같은 실시간 처리가 필요한 경우 문제가 될 수 있습니다[19].
8.2 틱 주파수의 제약
FreeRTOS의 최대 틱 주파수는 일반적으로 1kHz로 제한되므로, 더 높은 주파수의 작업이 필요한 경우 별도의 타이머 인터럽트나 DMA를 활용해야 합니다[16].
결론
FreeRTOS는 다양한 스케줄링 기법을 제공하여 임베디드 시스템의 요구사항에 맞는 유연한 태스크 관리를 가능하게 합니다[20]. 선점형과 협력형 스케줄링, 우선순위 기반 스케줄링, 라운드 로빈 스케줄링 등을 조합하여 애플리케이션의 특성에 최적화된 시스템을 구축할 수 있습니다[9][11]. 적절한 설정과 설계를 통해 실시간성과 효율성을 모두 만족하는 시스템 개발이 가능합니다.
출처
[1] 3.[FreeRTOS] RTOS Task 스케쥴링 – 네이버블로그 https://blog.naver.com/sohnet/222632767509
[2] FreeRTOS 커널 – 개발자 가이드 – 태스크 관리 : 네이버 블로그 https://blog.naver.com/fdew/221309577019
[3] 5.STM32 FreeRTOS – preemptive, non-preemptive 설정하기 https://ydongdong.tistory.com/38
[4] [FreeRTOS] Task States – Poin – 티스토리 https://poinsystem.tistory.com/7
[5] Tasks — SimpleLink™ Low Power F3 SDK Proprietary RF User’s … https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/8.20.00.119/exports/docs/proprietary-rf/proprietary-rf-users-guide/freertos/tasks.html
[6] 4.4 Scheduling https://onlinedocs.microchip.com/oxy/GUID-F3CEAE3B-C3C1-4B92-B031-4E07B8ACCD81-en-US-3/GUID-8168CDDB-395F-41BE-B761-00E84F2B5D26.html
[7] PowerPoint Presentation https://homel.vsb.cz/~sta048/mcu/presentation/posrc/en/en_posrc_2_scheduler.pdf
[8] [PDF] 8. RTOS https://kimdictor.kr/files/2021-arduino-seminar/2021-arduino-8.pdf
[9] Task Scheduling in FreeRTOS – OceanLabz https://www.oceanlabz.in/task-scheduling-in-freertos/
[10] [FreeRTOS 정리] 完. 총집본 https://velog.io/@embeddedjune/FreeRTOS-%EC%A0%95%EB%A6%AC-%E5%AE%8C.-%EC%B4%9D%EC%A7%91%EB%B3%B8
[11] FreeRTOS Scheduler: Learn to Configure Scheduling Algorithm https://microcontrollerslab.com/freertos-scheduler-learn-to-configure-scheduling-algorithm/
[12] FreeRTOS – Task Management – WakaraNai – 티스토리 https://wakaranaiyo.tistory.com/347
[13] FIFO scheduling implementation – FreeRTOS Community Forums https://forums.freertos.org/t/fifo-scheduling-implementation/12714
[14] 커널 구성(FreeRTOSConfig.h) – FreeRTOS – AWS Documentation https://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/freertos-config.html
[15] Preemption in FreeRTOS – Stack Overflow https://stackoverflow.com/questions/39940487/preemption-in-freertos
[16] FreeRTOS Tick 관련 문의 드립니다. – 인프런 | 커뮤니티 질문&답변 https://www.inflearn.com/community/questions/658326/freertos-tick-%EA%B4%80%EB%A0%A8-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4
[17] FreeRTOS AVR 포트 – 우리들의 이야기 – 이지플로우 – Daum 카페 https://m.cafe.daum.net/easyflow/F13G/53
[18] FreeRTOS – 1. 태스크 생성과 운용 https://ahystroy.tistory.com/88
[19] Does FreeRTOS-Plus-TCP support cooperative scheduling? https://forums.freertos.org/t/does-freertos-plus-tcp-support-cooperative-scheduling/21394
[20] FreeRTOS 소개 – 거니의 프로그래밍 이야기 – 티스토리 https://pslab.tistory.com/entry/FreeRTOS-%EC%86%8C%EA%B0%9C
[21] RTOS의 태스크 스케줄링 메커니즘 탐구 – infobeste – 티스토리 https://positive-impactor.tistory.com/1241
[22] How both tasks will schedule in free RTOS – Kernel https://forums.freertos.org/t/how-both-tasks-will-schedule-in-free-rtos/16643
[23] FreeRTOS scheduling (single-core, AMP and SMP) https://www.freertos.org/single-core-amp-smp-rtos-scheduling.html
[24] Preemptive Scheduling and Task Priorities – FreeRTOS https://www.freertos.org/FreeRTOS_Support_Forum_Archive/February_2017/freertos_Preemptive_Scheduling_and_Task_Priorities_34689477j.html
[25] FreeRTOS – pre-emptive or not? – EEVblog https://www.eevblog.com/forum/microcontrollers/freertos-pre-emptive-or-not/
[26] Scheduling in FreeRTOS_ Pre-emptive vs Co-operative | PDF – Scribd https://www.scribd.com/document/829998262/Scheduling-in-FreeRTOS-Pre-emptive-vs-Co-operative
[27] [PDF] FreeRTOS – 사용자 가이드 https://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/freertos-ug.pdf
[28] FreeRTOS – 힙 메모리 관리 – 상두’s – 티스토리 https://gomsik.tistory.com/78
[29] FreeRTOS 커널 기초 https://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/dev-guide-freertos-kernel.html
[30] 8. Free RTOS – Heap Memory Management, 메모리 관리 https://vuzwa.tistory.com/entry/8-Free-RTOS-Heap-Memory-Management-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC
[31] In the case of “configUSE_TIME_SLICING==0” – Kernel https://forums.freertos.org/t/in-the-case-of-configuse-time-slicing-0/7744
[32] [FreeRTOS] Task의 Stack 최적의 사이즈 설정 – 개발새발 – 티스토리 https://kfdd6630.tistory.com/entry/FreeRTOS-Task%EC%9D%98-Stack-%EC%B5%9C%EC%A0%81%EC%9D%98-%EC%82%AC%EC%9D%B4%EC%A6%88-%EC%84%A4%EC%A0%95
[33] TIL-FreeRTOS(02) https://velog.io/@cheesam31/TIL-FreeRTOS02
[34] [FreeRTOS] FreeRTOS란? – 개발새발 – 티스토리 https://kfdd6630.tistory.com/entry/FreeRTOS-FreeRTOS%EB%9E%80
[35] TIL-FreeRTOS(01) https://prod.velog.io/@cheesam31/TIL-FreeRTOS
[36] configUSE_TIME_SLICING – FreeRTOS https://www.freertos.org/FreeRTOS_Support_Forum_Archive/December_2013/freertos_configUSE_TIME_SLICING_278999daj.html
[37] [FreeRTOS] Task – velog https://velog.io/@seoppppio/FreeRTOS-Task
답글 남기기