Skip to content
Snippets Groups Projects
Commit b5811d13 authored by BeomSooHeo's avatar BeomSooHeo
Browse files

0814

parent be1509db
No related branches found
No related tags found
No related merge requests found
File moved
File moved
File added
File added
File added
# 2020_08_14_multiThreading
<P>라즈베리파이에 LED 3개(빨강, 노랑, 초록)을 연결하여 입력에 따라 이들을 동시에 제어하는 응용 프로그램 작성</p>
## 0. Conditons & Usage
#### Condition:
빨강색 LED는 1초 간격으로 ON/OFF를 반복한다.
초록색 LED는 2초 간격으로 ON/OFF를 반복한다.
노랑색 LED는 3초 간격으로 ON/OFF를 반복한다.
<br>
#### Usage:
<br>
<p>
입력형식은 다음과 같다.
<strong>./led_main [control] [repetition]</strong>
</p><br>
<p>
control : 제어할 LED 조합을 결정. 아무 값도 전달하지 않거나 1~3까지의 자연수
1 : 빨강색 LED와 초록색 LED
2 : 빨강색 LED와 노랑색 LED
3 : 모든 3개의 LED
</p><br>
<p>
repetition : 빨강색을 제외한 나머지 LED들의 ON/OFF 반복 횟수 결정. 아무 값도 전달하지 않거나 그 외의 자연수.
입력값에 상관없이 항상 빨강색 LED는 1초 간격으로 10초간 ON/OFF를 반복한다.
따라서 control과 repetition을 전달하지 않을 경우 빨강색 LED만 켜진다.
</p><br>
ex) ./led_main //빨강색 LED만 1초 간격으로 ON/OFF 반복<br>
ex) ./led_main 1 5 //빨강색 LED는 1초 간격으로 10회on/off 반복, 초록색 LED는 2초 간격으로 5회 on/off.<br>
ex) ./led_main 2 7 //빨강색 LED는 1초 간격으로 10회 on/off 반복, 노랑색 LED는 3초 간격으로 7회on/off.<br>
ex) ./led_main 3 6//빨강색 LED는 1초 간격으로 10회on/off 반복, 초록색 LED는 2초간격으로, 노랑색 LED는3초 간격으로 각각 6회on/off.
<br>
## 1. Thread Functions
```c
void* led_red (void * args);
void* led_green (void * args);
void* led_yellow (void * args);
```
pthread_create를 통해 입력에 따라 Thread를 생성할 때 위 함수들을 전달한다.
각 함수들은 반복 횟수를 void type pointer인 args를 통해 led의 ON/OFF를 제어한다.
## 2. Makefile
#### 2-1) Makefile을 작성하여 make
<br><br>
![image](/uploads/16b3b6c7205d54f60e62b9019c4fe245/image.png)
<br><br>
make를 입력한 후 생성된 응용 프로그램을 실행한다.<br>
#### 2-2) CMake를 통한 Makefile 생성
<br><br>
![image](/uploads/13b2c5b53b7357a5cb57441318c3506e/image.png)
<br><br>
CMakeLists.txt를 작성한 후, cmake CMakeLists.txt를 입력한다.
<strong>이때 주의할점은 파일명이 반드시 CMakeLists.txt 이어야한다는 점이다. </strong>
<br><br>
![image](/uploads/0e4037e63b8ce50195680ae6ee245943/image.png)
<br><br>
Makefile이 생성된 후, make를 입력하여 응용 프로그램을 생성하고 이를 실행한다. <br>
## 3. Test
<br><br>
#### 3-1) ./main
<video>
<source src = "0.mp4" type = "video/mp4">
</video>
<br><br>
#### 3-2) ./main 1 5
<video>
<source src = "1.mp4" type = "video/mp4">
</video>
<br><br>
#### 3-2) ./main 2 7
<video>
<source src = "2.mp4" type = "video/mp4">
</video>
<br><br>
#### 3-2) ./main 3 6
<video>
<source src = "3.mp4" type = "video/mp4">
</video>
\ No newline at end of file
File added
ADD_EXECUTABLE(led_main led_main.c led_green.c led_yellow.c)
target_link_libraries( led_main pthread wiringPi )
\ No newline at end of file
SRCS = led_main.c led_green.c led_yellow.c
OBJS = $(SRCS:.c=.o)
cc = gcc
link = -lpthread -lwiringPi
led_main : $(OBJS)
$(cc) -o $@ $^ $(link)
.o :
$(cc) -c $<
clean:
-rm $(OBJS)
rm led_main
dep:
gccmakedep $(SRCS)
# DO NOT DELETE
led_main.o: led_main.c /usr/include/stdc-predef.h led.h \
/usr/include/stdio.h /usr/include/features.h \
/usr/include/arm-linux-gnueabihf/sys/cdefs.h \
/usr/include/arm-linux-gnueabihf/bits/wordsize.h \
/usr/include/arm-linux-gnueabihf/gnu/stubs.h \
/usr/include/arm-linux-gnueabihf/gnu/stubs-hard.h \
/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h \
/usr/include/arm-linux-gnueabihf/bits/types.h \
/usr/include/arm-linux-gnueabihf/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdarg.h \
/usr/include/arm-linux-gnueabihf/bits/stdio_lim.h \
/usr/include/arm-linux-gnueabihf/bits/sys_errlist.h \
/usr/include/stdlib.h /usr/include/arm-linux-gnueabihf/bits/waitflags.h \
/usr/include/arm-linux-gnueabihf/bits/waitstatus.h \
/usr/include/arm-linux-gnueabihf/sys/types.h /usr/include/time.h \
/usr/include/endian.h /usr/include/arm-linux-gnueabihf/bits/endian.h \
/usr/include/arm-linux-gnueabihf/bits/byteswap.h \
/usr/include/arm-linux-gnueabihf/bits/byteswap-16.h \
/usr/include/arm-linux-gnueabihf/sys/select.h \
/usr/include/arm-linux-gnueabihf/bits/select.h \
/usr/include/arm-linux-gnueabihf/bits/sigset.h \
/usr/include/arm-linux-gnueabihf/bits/time.h \
/usr/include/arm-linux-gnueabihf/sys/sysmacros.h \
/usr/include/arm-linux-gnueabihf/bits/pthreadtypes.h \
/usr/include/alloca.h \
/usr/include/arm-linux-gnueabihf/bits/stdlib-float.h \
/usr/include/string.h /usr/include/xlocale.h /usr/include/unistd.h \
/usr/include/arm-linux-gnueabihf/bits/posix_opt.h \
/usr/include/arm-linux-gnueabihf/bits/environments.h \
/usr/include/arm-linux-gnueabihf/bits/confname.h /usr/include/getopt.h \
/usr/include/pthread.h /usr/include/sched.h \
/usr/include/arm-linux-gnueabihf/bits/sched.h \
/usr/include/arm-linux-gnueabihf/bits/setjmp.h /usr/include/wiringPi.h
led_green.o: led_green.c /usr/include/stdc-predef.h led.h \
/usr/include/stdio.h /usr/include/features.h \
/usr/include/arm-linux-gnueabihf/sys/cdefs.h \
/usr/include/arm-linux-gnueabihf/bits/wordsize.h \
/usr/include/arm-linux-gnueabihf/gnu/stubs.h \
/usr/include/arm-linux-gnueabihf/gnu/stubs-hard.h \
/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h \
/usr/include/arm-linux-gnueabihf/bits/types.h \
/usr/include/arm-linux-gnueabihf/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdarg.h \
/usr/include/arm-linux-gnueabihf/bits/stdio_lim.h \
/usr/include/arm-linux-gnueabihf/bits/sys_errlist.h \
/usr/include/stdlib.h /usr/include/arm-linux-gnueabihf/bits/waitflags.h \
/usr/include/arm-linux-gnueabihf/bits/waitstatus.h \
/usr/include/arm-linux-gnueabihf/sys/types.h /usr/include/time.h \
/usr/include/endian.h /usr/include/arm-linux-gnueabihf/bits/endian.h \
/usr/include/arm-linux-gnueabihf/bits/byteswap.h \
/usr/include/arm-linux-gnueabihf/bits/byteswap-16.h \
/usr/include/arm-linux-gnueabihf/sys/select.h \
/usr/include/arm-linux-gnueabihf/bits/select.h \
/usr/include/arm-linux-gnueabihf/bits/sigset.h \
/usr/include/arm-linux-gnueabihf/bits/time.h \
/usr/include/arm-linux-gnueabihf/sys/sysmacros.h \
/usr/include/arm-linux-gnueabihf/bits/pthreadtypes.h \
/usr/include/alloca.h \
/usr/include/arm-linux-gnueabihf/bits/stdlib-float.h \
/usr/include/string.h /usr/include/xlocale.h /usr/include/unistd.h \
/usr/include/arm-linux-gnueabihf/bits/posix_opt.h \
/usr/include/arm-linux-gnueabihf/bits/environments.h \
/usr/include/arm-linux-gnueabihf/bits/confname.h /usr/include/getopt.h \
/usr/include/pthread.h /usr/include/sched.h \
/usr/include/arm-linux-gnueabihf/bits/sched.h \
/usr/include/arm-linux-gnueabihf/bits/setjmp.h /usr/include/wiringPi.h
led_yellow.o: led_yellow.c /usr/include/stdc-predef.h led.h \
/usr/include/stdio.h /usr/include/features.h \
/usr/include/arm-linux-gnueabihf/sys/cdefs.h \
/usr/include/arm-linux-gnueabihf/bits/wordsize.h \
/usr/include/arm-linux-gnueabihf/gnu/stubs.h \
/usr/include/arm-linux-gnueabihf/gnu/stubs-hard.h \
/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h \
/usr/include/arm-linux-gnueabihf/bits/types.h \
/usr/include/arm-linux-gnueabihf/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdarg.h \
/usr/include/arm-linux-gnueabihf/bits/stdio_lim.h \
/usr/include/arm-linux-gnueabihf/bits/sys_errlist.h \
/usr/include/stdlib.h /usr/include/arm-linux-gnueabihf/bits/waitflags.h \
/usr/include/arm-linux-gnueabihf/bits/waitstatus.h \
/usr/include/arm-linux-gnueabihf/sys/types.h /usr/include/time.h \
/usr/include/endian.h /usr/include/arm-linux-gnueabihf/bits/endian.h \
/usr/include/arm-linux-gnueabihf/bits/byteswap.h \
/usr/include/arm-linux-gnueabihf/bits/byteswap-16.h \
/usr/include/arm-linux-gnueabihf/sys/select.h \
/usr/include/arm-linux-gnueabihf/bits/select.h \
/usr/include/arm-linux-gnueabihf/bits/sigset.h \
/usr/include/arm-linux-gnueabihf/bits/time.h \
/usr/include/arm-linux-gnueabihf/sys/sysmacros.h \
/usr/include/arm-linux-gnueabihf/bits/pthreadtypes.h \
/usr/include/alloca.h \
/usr/include/arm-linux-gnueabihf/bits/stdlib-float.h \
/usr/include/string.h /usr/include/xlocale.h /usr/include/unistd.h \
/usr/include/arm-linux-gnueabihf/bits/posix_opt.h \
/usr/include/arm-linux-gnueabihf/bits/environments.h \
/usr/include/arm-linux-gnueabihf/bits/confname.h /usr/include/getopt.h \
/usr/include/pthread.h /usr/include/sched.h \
/usr/include/arm-linux-gnueabihf/bits/sched.h \
/usr/include/arm-linux-gnueabihf/bits/setjmp.h /usr/include/wiringPi.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <wiringPi.h>
#define RED 4
#define GREEN 5
#define YELLOW 6
#define Interval_RED 1
#define Interval_GREEN 2
#define Interval_YELLOW 3
void* led_green (void * args);
void* led_yellow (void * args);
\ No newline at end of file
#include "led.h"
void* led_green(void * args)
{
pinMode(GREEN, OUTPUT);
for(int i=0; i < (int)args; i++) {
digitalWrite(GREEN, HIGH);
sleep(Interval_GREEN);
digitalWrite(GREEN, LOW);
sleep(Interval_GREEN);
}
pthread_exit(NULL);
}
\ No newline at end of file
#include "led.h"
void* led_red(void * args)
{
pinMode(RED, OUTPUT);
for(int i=0; i < 10; i++) {
digitalWrite(RED, HIGH);
sleep(1);
digitalWrite(RED, LOW);
sleep(1);
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t t1, t2, t3;
int set;
int reps;
wiringPiSetup();
if(argc < 2) {
pthread_create(&t1, NULL, led_red, (void *)0);
pthread_exit(NULL);
}
set = atoi(argv[1]);
reps = atoi(argv[2]);
switch(set){
case 1:
pthread_create(&t1, NULL, led_red, (void *)0);
pthread_create(&t2, NULL, led_green, (void *)reps);
pthread_exit(NULL);
break;
case 2:
pthread_create(&t1, NULL, led_red, (void *)0);
pthread_create(&t2, NULL, led_yellow, (void *)reps);
pthread_exit(NULL);
break;
case 3:
pthread_create(&t1, NULL, led_red, (void *)0);
pthread_create(&t2, NULL, led_yellow, (void *)reps);
pthread_create(&t3, NULL, led_green, (void *)reps);
pthread_exit(NULL);
break;
default: break;
}
return 0;
}
\ No newline at end of file
#include "led.h"
void* led_yellow(void * args)
{
pinMode(YELLOW, OUTPUT);
for(int i=0; i < (int)args; i++) {
digitalWrite(YELLOW, HIGH);
sleep(Interval_YELLOW);
digitalWrite(YELLOW, LOW);
sleep(Interval_YELLOW);
}
pthread_exit(NULL);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment