Interrupt는 시스템에서 중요한 이벤트가 발생했을 때 프로세서의 작업을 중단하고 즉시 처리하는 방식입니다. 하지만 여러 개의 Interrupt가 동시에 발생할 수 있기 때문에, 우선순위를 설정해야 합니다. 이 포스팅에서는 Interrupt의 우선순위와 Interrupt를 생성하는 방법에 대해 설명하겠습니다. 🚀
📈 Interrupt 우선순위란?
Interrupt 우선순위는 시스템에서 여러 개의 Interrupt가 동시에 발생할 때, 어떤 Interrupt를 먼저 처리할 것인지 결정하는 순서입니다. 각 Interrupt는 우선순위가 설정되어 있으며, 우선순위가 높은 Interrupt가 먼저 처리됩니다.
Interrupt 우선순위의 설정은 주로 하드웨어와 소프트웨어에서 모두 다룰 수 있습니다. 하드웨어에서 우선순위를 설정할 수 있지만, 소프트웨어에서 직접 우선순위를 지정하기도 합니다.
🧠 Interrupt 우선순위 설정 방식
우선순위는 보통 번호로 지정되며, 숫자가 낮을수록 우선순위가 높다는 규칙을 가집니다.
- 우선순위 높은 Interrupt: 번호가 작은 값
- 우선순위 낮은 Interrupt: 번호가 큰 값
예를 들어, 우선순위 0인 Interrupt가 발생하면, 우선순위 1이나 2보다 먼저 처리됩니다. 이는 Interrupt 컨트롤러가 우선순위에 따라 처리 순서를 결정하기 때문입니다.
🔄 Interrupt 우선순위 예시
우선순위 Interrupt 유형 처리 순서
우선순위 0 | 타이머 1, 중요한 하드웨어 오류 처리 | 가장 먼저 처리됨 |
우선순위 1 | 사용자 입력 (키보드, 버튼 등) | 두 번째로 처리됨 |
우선순위 2 | 통신(예: UART, SPI) 오류 처리 | 마지막에 처리됨 |
🛑 Interrupt 우선순위 관리
- Nesting: 일부 시스템에서는 Interrupt Nesting을 허용하여, 우선순위가 더 높은 Interrupt가 발생하면 현재 실행 중인 Interrupt를 중단하고, 더 높은 우선순위의 Interrupt를 처리할 수 있게 합니다.
- Masking: 우선순위가 낮은 Interrupt를 일시적으로 mask(차단)하여 우선순위가 높은 Interrupt를 처리할 수 있도록 합니다. 예를 들어, 타이머가 우선순위가 높고, 사용자 입력은 우선순위가 낮다면 타이머 Interrupt가 발생할 때 사용자 입력 Interrupt를 차단할 수 있습니다.
🏗️ Interrupt 생성하기
Interrupt를 생성하는 방법은 사용하는 하드웨어와 소프트웨어 환경에 따라 다릅니다. 하지만 일반적인 마이크로컨트롤러에서 Interrupt를 설정하는 방법을 설명하겠습니다.
1️⃣ Interrupt 서비스 루틴 (ISR) 정의
**Interrupt Service Routine (ISR)**은 Interrupt가 발생했을 때 실행되는 코드입니다. ISR은 일반적으로 짧고 빠른 코드여야 하며, 주요 작업은 Interrupt 발생 원인 처리입니다. ISR 내부에서는 복잡한 작업을 피하고, 중요한 상태 변경만 처리하도록 합니다.
// 예시: 타이머 Interrupt 서비스 루틴
void __interrupt() Timer_ISR() {
// 타이머 오버플로우 발생 시 처리 코드
clear_interrupt_flag(); // Interrupt 플래그 초기화
}
2️⃣ Interrupt 활성화 및 우선순위 설정
Interrupt를 활성화하려면, Interrupt 컨트롤러를 설정하고, 우선순위를 지정해야 합니다. 예를 들어, AVR 마이크로컨트롤러에서 Interrupt를 설정하는 방법은 다음과 같습니다.
// 예시: AVR 마이크로컨트롤러에서 Interrupt 활성화
sei(); // 전역 Interrupt 활성화
// 특정 Interrupt 우선순위 설정
set_interrupt_priority(0); // 우선순위 0으로 설정
이 코드에서는 sei() 명령어를 통해 전역 Interrupt를 활성화하고, set_interrupt_priority() 함수로 우선순위를 설정합니다.
3️⃣ Interrupt 발생 조건 설정
각 Interrupt는 특정 조건에 의해 발생합니다. 예를 들어, 타이머가 오버플로우할 때, 핀 변화가 있을 때 등 다양한 조건에서 Interrupt가 발생하도록 설정할 수 있습니다.
// 예시: 외부 핀에서 Falling Edge를 감지하여 Interrupt 발생
EICRA |= (1 << ISC01) | (1 << ISC00); // 핀에서 Falling Edge 발생 시 Interrupt
📊 Interrupt 우선순위 및 처리 순서 시각화
Interrupt 타입 우선순위 처리 순서 발생 조건
타이머 | 0 | 첫 번째로 처리됨 | 타이머 오버플로우 발생 |
사용자 입력 | 1 | 두 번째로 처리됨 | 버튼 클릭 또는 키보드 입력 |
통신 오류 | 2 | 마지막으로 처리됨 | UART 또는 SPI 통신 오류 발생 |
⚖️ Interrupt 우선순위와 성능 고려 사항
- 우선순위가 높은 Interrupt를 자주 처리하면, 시스템의 전체 성능이 저하될 수 있습니다. 따라서 각 Interrupt에 대해 적절한 우선순위를 설정하고, ISR에서 수행해야 할 작업의 양을 최소화하는 것이 중요합니다.
- Interrupt 관리가 제대로 이루어지지 않으면, 성능 저하나 우선순위 역전 문제가 발생할 수 있습니다. 따라서 우선순위 설정과 관리가 신중히 이루어져야 합니다.
Interrupt 우선순위는 시스템의 실시간성이나 효율성을 보장하는 중요한 요소입니다. 위에서 설명한 대로, 우선순위 설정을 잘못하면 시스템 성능에 큰 영향을 미칠 수 있으므로 적절한 우선순위 관리가 필수적입니다. 😊
궁금한 점이나 더 알고 싶은 부분이 있으면 댓글로 남겨주세요!
'공부 > STM32' 카테고리의 다른 글
🌟 STM32CubeMX 활용 가이드 🌟 (0) | 2025.03.08 |
---|---|
🛠️ 임베디드 시스템이란? 무엇이 다를까? 🤔 (3) | 2025.03.08 |
⚡️ Falling Edge vs Interrupt: 차이점과 개념 이해하기 ⚡️ (0) | 2025.03.06 |
🌟TMCM/TMCL을 아십니까? (0) | 2024.10.11 |
🔧 STM32F429ZI 이진계산기 코드 리뷰: 펜딩 비트, ISR, 인터럽트 (0) | 2024.10.10 |