[카테고리:] 미분류

  • FreeRTOS 스케줄링 기법 총정리

    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 선점형 스케줄링 시나리오

    1. 태스크 A (우선순위 1)가 실행 중
    2. 태스크 B (우선순위 2)가 준비 상태로 전환
    3. 스케줄러가 태스크 A를 선점하고 태스크 B 실행
    4. 태스크 B가 블록되면 태스크 A가 다시 실행

    6.2 라운드 로빈 스케줄링 시나리오

    동일한 우선순위를 가진 태스크 X, Y, Z가 있을 때:

    1. 태스크 X가 시간 슬롯 동안 실행
    2. 틱 인터럽트 발생 시 태스크 Y로 전환
    3. 태스크 Y 실행 후 태스크 Z로 전환
    4. 태스크 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