diff --git a/mutex/1.mytwothread.c b/multi_Thread/1.mytwothread.c similarity index 100% rename from mutex/1.mytwothread.c rename to multi_Thread/1.mytwothread.c diff --git a/mutex/2.mymutexthread_st.c b/multi_Thread/2.mymutexthread_st.c similarity index 100% rename from mutex/2.mymutexthread_st.c rename to multi_Thread/2.mymutexthread_st.c diff --git a/multi_Thread/ledThreads/0.mp4 b/multi_Thread/ledThreads/0.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a2f0b7f5cffabb5991ad53a762e46d617ca05f43 Binary files /dev/null and b/multi_Thread/ledThreads/0.mp4 differ diff --git a/multi_Thread/ledThreads/1.mp4 b/multi_Thread/ledThreads/1.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9aa9465d1568c0ff6a8e7f2b6a23401212612e2c Binary files /dev/null and b/multi_Thread/ledThreads/1.mp4 differ diff --git a/multi_Thread/ledThreads/2.mp4 b/multi_Thread/ledThreads/2.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9bf1d1a35e57c0502457ed0b82939178ed3e6710 Binary files /dev/null and b/multi_Thread/ledThreads/2.mp4 differ diff --git a/multi_Thread/ledThreads/2020_08_14.md b/multi_Thread/ledThreads/2020_08_14.md new file mode 100644 index 0000000000000000000000000000000000000000..43b90a60caab027cffdbd416214a441d7d78dbca --- /dev/null +++ b/multi_Thread/ledThreads/2020_08_14.md @@ -0,0 +1,122 @@ +# 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> + +<br><br> + +make를 입력한 후 생성된 응용 프로그램을 실행한다.<br> + +#### 2-2) CMake를 통한 Makefile 생성 + +<br><br> + +<br><br> + +CMakeLists.txt를 작성한 후, cmake CMakeLists.txt를 입력한다. + +<strong>이때 주의할점은 파일명이 반드시 CMakeLists.txt 이어야한다는 점이다. </strong> + +<br><br> + +<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 diff --git a/multi_Thread/ledThreads/3.mp4 b/multi_Thread/ledThreads/3.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9bec26ea5940d2bdc8ab61057225f8b924d9977b Binary files /dev/null and b/multi_Thread/ledThreads/3.mp4 differ diff --git a/multi_Thread/ledThreads/CMakeLists.txt b/multi_Thread/ledThreads/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..9662968736650809758dd183eb0c2efe6f13176d --- /dev/null +++ b/multi_Thread/ledThreads/CMakeLists.txt @@ -0,0 +1,2 @@ +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 diff --git a/multi_Thread/ledThreads/Makefile b/multi_Thread/ledThreads/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..dd72c73ff9e6960bed8d92245bcf979b63e2b5c6 --- /dev/null +++ b/multi_Thread/ledThreads/Makefile @@ -0,0 +1,122 @@ +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 diff --git a/multi_Thread/ledThreads/led.h b/multi_Thread/ledThreads/led.h new file mode 100644 index 0000000000000000000000000000000000000000..86b32bedcb6781b5bf7042c4edd4058b97e42f28 --- /dev/null +++ b/multi_Thread/ledThreads/led.h @@ -0,0 +1,17 @@ +#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 diff --git a/multi_Thread/ledThreads/led_green.c b/multi_Thread/ledThreads/led_green.c new file mode 100644 index 0000000000000000000000000000000000000000..52c5a259bc0d74633419f33200c36ef38e8bb54a --- /dev/null +++ b/multi_Thread/ledThreads/led_green.c @@ -0,0 +1,17 @@ +#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 diff --git a/multi_Thread/ledThreads/led_main.c b/multi_Thread/ledThreads/led_main.c new file mode 100644 index 0000000000000000000000000000000000000000..7343c1e0a0a424f85c2f8217498a0a966ea16356 --- /dev/null +++ b/multi_Thread/ledThreads/led_main.c @@ -0,0 +1,69 @@ +#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 diff --git a/multi_Thread/ledThreads/led_yellow.c b/multi_Thread/ledThreads/led_yellow.c new file mode 100644 index 0000000000000000000000000000000000000000..ce9cb04c3155502a66e08b4618a28dac4a874686 --- /dev/null +++ b/multi_Thread/ledThreads/led_yellow.c @@ -0,0 +1,18 @@ +#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