Creative Code

06_THREAD3.c 본문

Raspberry PI(C)

06_THREAD3.c

빛하루 2023. 10. 6. 13:01
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <wiringPi.h>
#define LED_1 23
#define LED_2 24
#define SW_1 4
#define SW_2 17

int LED1_flag = 0;
int LED2_flag = 0;

void sw1_interrupt() {
    if (LED1_flag == 0) {
        LED1_flag = 1;
    } else {
        LED1_flag = 0;
    }
}
void sw2_interrupt() {
    if (LED2_flag == 0) {
        LED2_flag = 1;
    } else {
        LED2_flag = 0;
    }
}

void* thread1_main(void *arg)
{
    while (1) {
        if (LED1_flag == 0) {
            digitalWrite(LED_1,HIGH);
            delay(300);
            digitalWrite(LED_1,LOW);
            delay(300);
        } else {
            digitalWrite(LED_1,LOW);
        }
    }
    return NULL;
}

void* thread2_main(void *arg)
{
    while (1) {
        if (LED2_flag == 0) {
            digitalWrite(LED_2,HIGH);
            delay(500);
            digitalWrite(LED_2,LOW);
            delay(500);
        } else {
            digitalWrite(LED_2,LOW);
        }
    }
    return NULL;
}

int main(int argc, char *argv[])
{
    pthread_t t1_id, t2_id;
    void *thr_ret;

    if (wiringPiSetupGpio() == -1) return -1;   // BCM

    pinMode(LED_1, OUTPUT);
    pinMode(SW_1, INPUT);
    pinMode(LED_2,OUTPUT);
    pinMode(SW_2, INPUT);
    digitalWrite(LED_1, LOW);
    digitalWrite(LED_2, LOW);
    wiringPiISR(SW_1, INT_EDGE_RISING, &sw1_interrupt);
    wiringPiISR(SW_2, INT_EDGE_RISING, &sw2_interrupt);

    if (pthread_create(&t1_id, NULL, thread1_main, NULL)) {
        puts("pthread_create() error\n");
        return -1;
    }
    if (pthread_create(&t2_id,NULL,thread2_main,NULL)) {
        puts("pthread_create() error\n");
        return -1;
    }

    while (1) {
        
    }

    //블로킹 함수(스레드가 끝날때까지 다음 명령을 진행하지 않음). t1_id가 끝날때까지 대기
    if (pthread_join(t1_id, &thr_ret)!=0) {
        puts("pthread_join() error");
        return -1;
    }
    sleep(3); 
    puts("end of main\n");

    return 0;
}

 

'Raspberry PI(C)' 카테고리의 다른 글

05_THREAD2.c  (0) 2023.10.06
04_THREAD1.c  (0) 2023.10.06
03_THREAD.c  (0) 2023.10.06
02_SWITCH_LED_INTERRUPT.c  (0) 2023.10.06
01_LED_ON_OFF.c  (0) 2023.10.06