본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 6: 인터럽트와 폴링

by cogito21_cpp 2024. 8. 1.
반응형

인터럽트와 폴링의 개요

임베디드 시스템에서는 외부 이벤트를 처리하기 위해 인터럽트와 폴링을 사용합니다. 두 기법은 이벤트를 감지하고 처리하는 방법에서 차이가 있습니다.

1. 폴링 (Polling)

폴링은 주기적으로 특정 조건을 검사하여 이벤트를 감지하는 방법입니다. 루프를 통해 상태를 지속적으로 확인하며, 특정 조건이 만족되면 해당 작업을 수행합니다.

 

폴링의 장점

  • 구현이 간단합니다.
  • 모든 입력을 검사할 수 있습니다.

폴링의 단점

  • CPU 자원을 많이 소모합니다.
  • 반응 시간이 늦을 수 있습니다.

예제: 버튼 상태를 폴링하여 LED 제어

const int buttonPin = 2; // 버튼 핀
const int ledPin = 13;   // 내장 LED 핀

void setup() {
    pinMode(buttonPin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
}

void loop() {
    int buttonState = digitalRead(buttonPin);

    if (buttonState == LOW) {
        digitalWrite(ledPin, HIGH);
    } else {
        digitalWrite(ledPin, LOW);
    }
}

 

2. 인터럽트 (Interrupt)

인터럽트는 외부 또는 내부 이벤트가 발생했을 때, CPU가 현재 작업을 중단하고 인터럽트 서비스 루틴(ISR)을 실행하도록 합니다. 이벤트 처리가 완료되면 원래 작업으로 돌아갑니다.

 

인터럽트의 장점

  • 빠른 반응 시간
  • CPU 자원을 효율적으로 사용

인터럽트의 단점

  • 구현이 복잡할 수 있습니다.
  • 인터럽트가 너무 자주 발생하면 시스템 성능에 영향을 줄 수 있습니다.

예제: 버튼 인터럽트를 사용하여 LED 제어

Arduino에서는 attachInterrupt 함수를 사용하여 인터럽트를 설정할 수 있습니다.

const int buttonPin = 2; // 버튼 핀
const int ledPin = 13;   // 내장 LED 핀
volatile bool ledState = false; // LED 상태 (인터럽트에서 변경될 수 있으므로 volatile 사용)

// 인터럽트 서비스 루틴
void handleButtonPress() {
    ledState = !ledState; // LED 상태를 토글
    digitalWrite(ledPin, ledState ? HIGH : LOW); // LED 상태 변경
}

void setup() {
    pinMode(buttonPin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, FALLING); // 인터럽트 설정
}

void loop() {
    // 메인 루프는 비워둠
}

 

3. 인터럽트 설정

인터럽트를 설정하기 위해서는 다음과 같은 단계가 필요합니다.

  1. 인터럽트 핀 지정: 인터럽트를 사용할 핀을 지정합니다.
  2. 인터럽트 모드 설정: 인터럽트가 트리거될 조건을 설정합니다. (RISING, FALLING, CHANGE)
  3. 인터럽트 서비스 루틴 정의: 인터럽트 발생 시 실행될 함수를 정의합니다.
  4. 인터럽트 활성화: attachInterrupt 함수를 사용하여 인터럽트를 활성화합니다.

4. 폴링과 인터럽트의 비교

항목 폴링 (Polling) 인터럽트 (Interrupt)
구현 복잡도 간단 복잡
반응 시간 늦음 빠름
CPU 사용률 높음 낮음
이벤트 빈도 낮음 높음 (너무 빈번하면 성능 저하)

 

마무리

오늘은 인터럽트와 폴링의 개념과 차이점을 학습하고, 각각의 방법을 사용하여 버튼을 제어하는 예제를 구현했습니다. 다음 날에는 타이머와 카운터 사용법에 대해 더 깊이 알아보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 7 예고

다음 날은 "타이머와 카운터 사용법"에 대해 다룰 것입니다. 타이머와 카운터를 사용하여 시간을 측정하고 이벤트를 발생시키는 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형