지노랩 /JinoLab
FreeRTOS Task 우선순위 vs. 하드웨어(인터럽트) 우선순위 본문
“값이 작으면 높은 건가? 낮은 건가?”
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)
- 태스크 우선순위는 커널 내부 Ready 리스트 정렬·선점(Pre-emption)을 결정합니다.
- 인터럽트 우선순위는 NVIC 하드웨어 레벨에서 동시 인터럽트 발생 시 처리 순서를 결정합니다.
- 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 핸들러로 살펴보는 컨텍스트 스위치 내부 구조
'임베디드 시스템 > RTOS' 카테고리의 다른 글
FreeRTOS 인터럽트 우선순위 설정 제대로 이해하기 (2) | 2025.06.27 |
---|---|
FreeRTOS 하드웨어 인터럽트 우선순위 정리 (2) | 2025.06.26 |
FreeRTOS Task 삭제, 정말 필요할까? (0) | 2025.06.25 |
FreeRTOS 동기화 & 상호배제 완전 정복 (0) | 2025.06.25 |
FreeRTOS 메모리 매니지먼트 한눈에 보기 (0) | 2025.06.24 |