이 전용 함수를 ISR(Interrupt Service Routine) 또는 Interrupt Handler라고 한다.
즉, 인터럽트는 프로그램의 실행 흐름과 독립된 시점에 발생하기 때문에 비동기 이벤트라고 한다.
긴 연산,
HAL_Delay(), 블로킹 통신, 과도한 로그 출력 등을 수행하면 다른 인터럽트와 메인 작업이 지연되기 때문
임베디드 시스템에서는 외부 신호와 내부 주변장치 이벤트를 처리하기 위해 인터럽트를 폭넓게 사용한다.
대표적인 예시는 다음과 같다.
| 인터럽트 소스 | 활용 예시 |
|---|---|
| GPIO/EXTI | 버튼 입력, 센서의 데이터 준비 신호 |
| Timer | 주기 작업, 시간 측정, PWM 주기 완료 |
| UART/SPI/I2C | 데이터 수신·송신 완료 |
| ADC/DMA | 변환 완료, 버퍼 절반 또는 전체 전송 완료 |
| RTC | 알람 또는 주기적 깨우기 |
| SysTick | 시스템 시간 기준 또는 RTOS 스케줄링 |
기본 원리는 같다. 이벤트가 발생하면 현재 흐름을 중단하고 지정된 처리 루틴을 실행한다.
차이는 주로 환경에 있다.
| 구분 | 범용 컴퓨터 | 임베디드 시스템 |
|---|---|---|
| 관리 주체 | 운영체제와 드라이버가 주로 관리 | 펌웨어가 직접 설정하는 경우가 많음 |
| 주요 목적 | 장치, 시스템 호출, 스케줄링 처리 | 핀, 타이머, 통신 등 하드웨어 이벤트 처리 |
| 제약 조건 | 비교적 풍부한 자원 | 제한된 메모리, 전력, 처리 성능 |
| 중요 지표 | 처리량과 시스템 안정성 | 응답 시간, 결정성, 전력 효율 |
| 설정 방식 | OS API와 드라이버 중심 | 레지스터, NVIC, CubeMX/HAL 중심 |
따라서 “임베디드 전용의 완전히 다른 인터럽트”가 존재하는 것은 아니다. 같은 개념을 더 하드웨어 중심적이고 시간 제약이 큰 환경에서 사용하는 것이다.
아래는 STM32CubeMX와 HAL을 사용해 PA0에 연결된 버튼의 Falling Edge(클릭)를 감지하는 예시다. 버튼은 PA0와 GND 사이에 연결하고 내부 Pull-up을 사용하는 상황을 가정한다. 실제 핀과 인터럽트 이름은 MCU 및 보드에 맞게 변경해야 한다.
스위치에는 바운스가 발생할 수 있으므로 실제 제품에서는 RC 필터, 슈미트 트리거 또는 소프트웨어 디바운싱을 고려해야 한다.
GPIO_EXTI0로 설정External Interrupt Mode with Falling edge trigger detection으로 선택Pull-up으로 설정EXTI line0 interrupt를 활성화void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
애플리케이션에서는 HAL 콜백에서 플래그만 설정하고, 실제 작업은 메인 루프에서 처리한다.
#include <stdbool.h>
volatile bool button_event = false;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
button_event = true;
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
if (button_event)
{
button_event = false;
// 시간이 오래 걸릴 수 있는 실제 작업은 여기에서 수행
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // NUCLEO-F446RE LD2
}
// 다른 작업 수행 또는 저전력 모드 진입
}
}
HAL_Delay()나 긴 반복문을 사용하지 않는다.bool 플래그 대신 카운터나 링 버퍼를 사용한다.// 버튼 상태 Polling 예시
while (1)
{
if (HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
// 간단한 디바운싱 예시
HAL_Delay(20);
}
}
| 비교 항목 | Interrupt | Polling |
|---|---|---|
| 이벤트 감지 | 하드웨어가 CPU에 알림 | CPU가 상태를 반복 확인 |
| 응답 속도 | 일반적으로 빠름 | 검사 주기에 좌우됨 |
| CPU 효율 | 이벤트가 없을 때 효율적 | 지속 검사 시 비효율적 |
| 구현 난이도 | 우선순위와 동시성 고려 필요 | 비교적 단순함 |
| 이벤트 누락 | 적절히 설정하면 짧은 이벤트 감지 가능 | 검사 주기보다 짧으면 누락 가능 |
| 전력 소비 | 저전력 모드와 결합하기 좋음 | Busy Polling은 전력 소비가 큼 |
| 디버깅 | 실행 순서가 비동기적이라 복잡할 수 있음 | 순차적이어서 비교적 쉬움 |
| 적합한 상황 | 비동기·긴급·저빈도 이벤트 | 단순 상태 확인, 매우 짧은 고정 주기 루프 |
※ 참고 사항