지노랩 /JinoLab

FreeRTOS Task 우선순위 vs. 하드웨어(인터럽트) 우선순위 본문

임베디드 시스템/RTOS

FreeRTOS Task 우선순위 vs. 하드웨어(인터럽트) 우선순위

지노랩/JinoLab 2025. 6. 26. 09:02

“값이 작으면 높은 건가? 낮은 건가?”
RTOS를 처음 접하면 한 시스템 안에 ‘두 종류’의 우선순위가 존재한다는 사실이 꽤 혼란스럽습니다.
이 글에서는 FreeRTOS 태스크 우선순위ARM Cortex-M 인터럽트 우선순위를 한눈에 비교해 정리합니다.


1. RTOS 태스크 우선순위

항목 설명

대상 태스크(Task) = 사용자 공간에서 실행되는 C 함수(스레드)
실행 모드 Thread Mode (비특권 또는 특권)
스케줄러 FreeRTOS 커널
값의 의미 숫자가 클수록 ‘더 높은(priority) 우선순위’예) pri 3 > pri 1
범위 0 ~ (configMAX_PRIORITIES – 1)

📝 Tip : 같은 우선순위를 갖는 태스크는 Round-Robin(타임 슬라이스) 방식으로 CPU를 번갈아 사용합니다.


2. 하드웨어(인터럽트) 우선순위

항목 설명

대상 외부·내부 인터럽트 & 시스템 예외(UART, ADC, SysTick, PendSV 등)
실행 모드 Handler Mode (무조건 특권)
컨트롤러 NVIC(ARM Nested Vector Interrupt Controller)
값의 의미 숫자가 작을수록 ‘더 높은(priority) 우선순위’(Cortex-M 규칙)
폭(bit) MCU마다 3~4비트 주로 사용(ex. 4bit → 0 ~ 15 단계)

⚠️ FreeRTOS 우선순위와 반대 이므로 값 비교 시 반드시 구분해야 합니다.


3. 왜 두 체계가 ‘동시에’ 필요할까?

▒  Application Space (Thread Mode)
 ├─ Task A (pri 2)
 ├─ Task B (pri 1)
 └─ Idle Task (pri 0)
▒  Kernel / ISR Space (Handler Mode)
 ├─ Timer IRQ (NVIC pri 5)
 ├─ UART RX IRQ (NVIC pri 2)
 └─ SysTick IRQ (NVIC pri 15)
  1. 태스크 우선순위는 커널 내부 Ready 리스트 정렬·선점(Pre-emption)을 결정합니다.
  2. 인터럽트 우선순위는 NVIC 하드웨어 레벨에서 동시 인터럽트 발생 시 처리 순서를 결정합니다.
  3. PendSV / SysTick 역시 인터럽트이므로 NVIC 우선순위가 가장 낮게(큰 값) 설정되어야 RTOS 태스크보다 뒤로 밀리지 않습니다.

4. 혼동을 피하는 실전 규칙

체크리스트 이유

RTOS API (xTaskCreate)에 적는 값은 ‘높을수록 급함’ FreeRTOS 규칙
NVIC_SetPriority()에 넣는 값은 ‘낮을수록 급함’ Cortex-M 규칙
FreeRTOS 내부에서 사용되는 SysTick / PendSV 우선순위는 항상 최하위(예: 15) 로 유지 커널 선점을 위해
ISR 안에서 FreeRTOS API 호출 시, configMAX_SYSCALL_INTERRUPT_PRIORITY 보다 우선순위 숫자가 커야 크리티컬 섹션 보호

5. 요약 한 줄

“태스크 priority는 숫자가 클수록 높다 & 인터럽트 priority는 숫자가 작을수록 높다.”
이 두 축을 명확히 분리해 놓으면, 커널 동작·인터럽트 선점·임계영역 설정이 훨씬 수월해집니다.


📚 더 읽어보기

  • Arm Cortex-M NVIC 프라이어리티 가이드
  • FreeRTOS Config 매크로 완전 정복
  • PendSV 핸들러로 살펴보는 컨텍스트 스위치 내부 구조