공부/STM32

🛠️ Interrupt 우선순위 및 생성 방법 🛠️

projectlim 2025. 3. 6. 19:15
728x90
반응형
SMALL

 

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 우선순위는 시스템의 실시간성이나 효율성을 보장하는 중요한 요소입니다. 위에서 설명한 대로, 우선순위 설정을 잘못하면 시스템 성능에 큰 영향을 미칠 수 있으므로 적절한 우선순위 관리가 필수적입니다. 😊

궁금한 점이나 더 알고 싶은 부분이 있으면 댓글로 남겨주세요!

728x90
반응형
LIST