Processor

【라즈베리파이】 wiringPi C 언어 : 인터럽트

작성자 임베디드코리아 작성일26-02-17 16:49 조회134회 댓글0건
■ 인터럽트란?
    ▷ 인터럽트라는 영어단어(interrupt)에는 '중단시키다'라는 의미로  CPU가 프로그램을 실행하고 있을 때,
    ▷ 장치에 예외상황이 발생하여 처리가 필요할 때 기존의 프로그램을 중단시키고 마이크로프로세서가 다른 것을 먼저 처리하는 것이다.
    ▷ 인터럽트를 사용하지 않고 스위치를 제어하려고 할 때에는 항상 대기하는 방식으로 구성을 해야 하므로 성능의 손해가 발생한다.

--<* 예제 *>____________________________________________
    ▷ 인터럽트로 스위치를 입력하는 것을 통하여 LED를 깜빡깜빡한다.
    ▷ wiringPiISR(SW, INT_EDGE_FALLING, &SW_Interrupt)에서  SW_interrupt()라는 임의로 만든 함수이다.
    ▷ 전역 변수로 설정한 sw_onoff라는 변수를 이용하여 스위치를 1,0으로 인식시키고 컨트롤한 것을 알 수 있다.
    ▷ edgeType을 INT_EDGE_FALLING으로 설정한 이유는 스위치를 누르고 때는 경우에 HIGH에서 LOW로 신호가
          바뀌기 때문에 인터럽트를 발생시킬 수 있다.

>>>> isr.c <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include<stdio.h>
#include<wiringPi.h>

#define LED 5      //BCM 기준 5
#define SW 21      //BCM 기준 21

volatile int sw_onoff=0;

void SW_Interrupt();    // 인터럽트 처리 함수

int main() {

    wiringPiSetupGpio();        // BCM  기준
   
    //초기 핀의 Input, Output을 설정
    pinMode(LED, OUTPUT);
    pinMode(SW, INPUT);
    pullUpDnControl(SW, PUD_UP); //내부 PULL-up저항 (쇼트방지)

    //스위치 인터럽트
    if(wiringPiISR(SW, INT_EDGE_FALLING, &SW_Interrupt) < 0)
        return 1;

    while(1) {
        if(sw_onoff == 1) {
            digitalWrite(LED,1);    //LED 점등
            delay(1000);      //time초 만큼 유지
            digitalWrite(LED,0);
            delay(1000);
        }
    }
}

void SW_Interrupt()  {      // 인터럽트 처리 함수
    delay(100);    // 스위치 bouncing 제거 목적
    if(digitalRead(SW)<1) {
        if(sw_onoff == 1) {
            printf("Switch off\n");
            sw_onoff = 0;
        }
        else {
            printf("Switch on\n");
            sw_onoff = 1;
        }
    }
}
-------------------------------------------------------------------------------
$ gcc  -o isr  isr.c  -lwiringPi
$ sudo  ./isr