diff --git a/08_05_three_files/Makefile b/08_05_three_files/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..6a9c6a4daaca15a54b06baf0b0cf41fc4516bdd1 --- /dev/null +++ b/08_05_three_files/Makefile @@ -0,0 +1,15 @@ +SRCS := func.c main.c +OBJS := $(SRCS:.c=.o) +CC := gcc +CFLAGS = -Wall -g + +test : $(OBJS) + $(CC) -o $@ $^ + +#dummy target +clean : + -rm $(OBJS) + rm test + +dep : + gccmakedep $(SRCS) diff --git a/08_05_three_files/README.md b/08_05_three_files/README.md new file mode 100644 index 0000000000000000000000000000000000000000..97eee27be0e1d681242773654fa1f41dc74aa9a0 --- /dev/null +++ b/08_05_three_files/README.md @@ -0,0 +1,188 @@ +# Personal Project2 : three_files(2020.08.05) + +## C Compile and Execution +1. Compile, Preprocessor Directive +2. Compile User Source Code, Generate Assembly +3. Link Assembler, Generate Excutable Code +4. Loader, Loads the executable code into memory + +## gcc를 통해 컴파일 하는 방법 +1. gcc [소스파일 이름] + + * gcc를 사용하여 컴파일에 성공하면 a.out이라는 파일이 생긴다. + +2. ./a.out + + * 생성된 a.out 파일을 이용하여 실행한다. + * 컴파일 과정에서 실행파일의 이름을 정해주지 않으면 기본적으로 a.out이라는 이름으로 생긴다. + +## gcc compile option +1. gcc -c + + * 소스 파일을 컴파일만 하고 링크는 수행하지 않는다. + * *.o 파일을 생성한다. + * ex) gcc -c main.c func.c => main.o func.o 파일 생성 + +2. gcc -o [소스파일 이름] [컴파일할 파일] + + * 바이너리 형식의 출력 파일 이름을 지정한다.(지정하지 않으면 a.out) + +3. gcc -E + + * 컴파일의 첫 단계인 전처리까지만 실행한 결과를 출력한다. + * ex) gcc -E func.c => 매우 방대한 내용이 소스파일 위에 붙는다. + +4. gcc main.c func.o -o main + + * main.c 파일을 컴파일하여 오브젝트 파일을 만들고 func.o 파일과 링킹하여 main이라는 실행 프로그램을 만든다. + +5. gcc -D + + * 매크로를 외부에서 define할 때 사용한다. + * ex) gcc -D PRINT_ID => 소스 내에서 #define PRINT_ID를 추가한 것과 동일하다. + +6. gcc -U + + * -D와 반대로 소스 파일 내에 #undef [매크로] 옵션을 추가한 것과 동일하다. + +## three_files 컴파일 +1. gcc -D PRINT_ID로 컴파일 할 때 + + * gcc -D PRINT_ID main.c func.c + * PRINT_ID가 정의되어 있으므로 학번 출력 + +2. gcc -D PRINT_ID로 컴파일 하지 않을 때 + + * gcc main.c func.c + * PRINT_ID가 정의되어 있지 않으므로 이름 출력 + +3. 조건부 컴파일 + + * #ifdef []: 만약 []가 정의되어 있다면 처리하고 그렇지 않으면 건너뛴다. + * #else, #elif + * #endif : 조건부 컴파일의 종료를 나타낸다. + +# Personal Project3 : 컴파일러와 인터프리터의 차이 & gcc 컴파일 옵션(2020.08.06) + +## 컴파일러 vs 인터프리터 +1. 컴파일러 + + * 고급언어로 쓰여진 프로그램이 컴퓨터에서 수행되기 위해서 컴퓨터가 직접 이해할 수 있는 언어로 바꾸어 주는 프로그램 + * 번역과 실행 과정을 거쳐야하므로 번역 과정이 번거롭고 번역 시간이 오래 걸린다. 하지만 한 번 번역한 후에는 다시 번역하지 않으므로 속도가 빠르다. + +2. 인터프리터 + + * 프로그램을 한 단계씩 기계어로 해석하여 실행하는 **언어처리 프로그램** + * 줄 단위로 번역, 실행되기 때문에 시분할 시스템에 유용하며 원시 프로그램의 변화에 대한 반응이 빠르다. + * 대화형 언어에 적합하지만 실행 시간이 길어 속도가 늦다 + + +||컴파일러|인터프리터| +|---|---|---| +|번역 단위|전체|한줄씩| +|실행 속도|빠름|느림| +|번역 속도|느림|빠름| +|실행 파일|생성함|생성하지 않음| + +## gcc 컴파일 옵션 연습 +1. gcc -E + * 전처리까지만 실행한 결과를 화면에 출력한다. +  + * 01.option-E.i 생성 +  + + +2. gcc -S : 컴파일 단계만 실행 + * 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행한다. + * 02.option-S.s 생성 +  + + +3. gcc -c : 컴파일과 어셈블 + * 어셈블까지만 수행하고 링크는 수행하지 않는다. + * 03.option-c.o 생성 +  + +4. gcc -g + * gdb에게 제공하는 정보를 바이너리에 삽입한다. + * 디버깅 정보가 담긴 실행파일을 생성한다. + * a.out 생성 +  + +5. gcc -Wall + * 모든 모호한 코딩에 대해서 경고를 보내는 옵션이다. +  + +6. gcc -o : 출력 파일 지정 + * 실행파일을 만든다. + * 이름이 00인 실행파일 만들기 +  + * 이름이 01.exe인 실행파일 만들기 +  + +7. gcc -D : 매크로 지정 + * 매크로를 외부에서 define할 때 사용한다. +  + +# Personal Project4 : Makefile 만들기(2020.08.07) + +## make란? +* **maintain, update, and regenerate group of progrmas** +* 명령을 생성하는 유틸리티, 프로그램 그룹을 유지하는데 필요한 유틸리티 +* **많은 프로그램 모듈들로 구성된 프로그램을 효율적으로 유지하고 일관성 있게 관리하도록 도와주는 도구** +* 소스 수정 시 유관 파일들을 재컴파일 & 링크하는 반복적인 작업을 간단하게 처리함 + +## make의 동작 +* **make는 여러 파일들 간의 의존성을 저장하고 수정된 파일에 연관된 소스 파일들만을 재컴파일 하도록 해줌** +* make 유틸리티는 이전에 make명령을 실행했던 시점 이후에 이뤄진 프로젝트 작업들에 대해서만 갱신 작업을 수행함 +* 개별 항목은 순서에 따라 실행되지만 전체 내용은 순서를 따르지 않음 + +## make 필요성 +* **프로그램 개발 및 유지보수의 편리성을 지원** +* 명령어의 배치 처리 기능, 자주 쓰는 명령어를 자동화할 수 있음 +* 자동적으로 특정 프로그램 수행을 원할 때 + +## Makefile 작성 +1. 빌드 규칙(Rule) 블록 + ```Text + <Target> : <Dependencies> + <Recipe> + ``` + * Target : 빌드 대상 이름. 최종적으로 생성해내는 파일명 + * Dependencies or prerequisities : 빌드 대상이 의존하는 Target이나 파일 목록. 이곳에 나열된 대상들을 먼저 만들고 빌드 대상 생성 + * Recipe : 빌드 대상을 생성하는 명령. 각 줄 시작에 반드시 `Tab`문자로 된 Indent가 있어야 한다. + +2. 내장 매크로(Pre-defined Macro) - Variables Used by Implicit Rules + * CC : 컴파일러 + * CFLAGS : 컴파일 옵션 + * OBJS : 중간 산물 Object 파일 목록 + * TARGET : 빌드 대상(실행 파일) 이름 + * LDFLAGS : 링커 옵션 + * LDLIBS : 링크 라이브러리 + +3. 내장 매크로(Internal Macro) - Automatic variables + * $@ : 현재의 목표 (Target) 파일명 + * $? : 현재의 목표파일(Target)보다 더 최근에 갱신된 의존 파일 명단 + * $* : 현재의 목표파일(Target)보다 더 최근에 갱신된 현재 의존 파일 명단(확장자를 제외한) + * $< : 의존 파일(전제 조건) 중 첫번째 파일명 + * $^ : 현재 모든 의존 파일들의 명단 + + +## Makefile 작성 실습 과정 +1. Makefile 형식 +  +2. Dummy Target(Label) & Dependency Check +  +3. 매크로(Macro, Variable)의 이용 +  +4. 내장 매크로(Internal Macro)의 이용 +  +5. 내장 매크로(Pre-definced Macro)의 이용 +  +6. 확장자규칙(Suffix Rules)의 이용 & 확장자(Suffix)의 치환 이용 +  +7. 디폴트 확장자규칙(Default Suffix Rules)의 이용 +  +8. make clean 후 make + * make clean 했을 때 설정한 파일들이 지워지고 make를 했을 때 설정 파일들을 컴파일한다. +  \ No newline at end of file diff --git a/08_05_three_files/func.c b/08_05_three_files/func.c new file mode 100644 index 0000000000000000000000000000000000000000..0643c37c8d67cdd5e5f921a148f33e530daa5038 --- /dev/null +++ b/08_05_three_files/func.c @@ -0,0 +1,15 @@ +//func.c file + +#include <stdio.h> +#include "func.h" + +int func_name_or_id() +{ +#ifdef PRINT_ID + printf("ID : 201723273\n"); + return 0; +#else + printf("Name : JieunYoon\n"); + return 1; +#endif +} diff --git a/08_05_three_files/func.h b/08_05_three_files/func.h new file mode 100644 index 0000000000000000000000000000000000000000..4ede03d38a3342e9865c0c3c790a3a518f997735 --- /dev/null +++ b/08_05_three_files/func.h @@ -0,0 +1,3 @@ +//func.h + +extern int func_name_or_id(); diff --git a/08_05_three_files/main b/08_05_three_files/main new file mode 100644 index 0000000000000000000000000000000000000000..608853bc905cbe750ebc9a6a001215d8baa77cc1 Binary files /dev/null and b/08_05_three_files/main differ diff --git a/08_05_three_files/main.c b/08_05_three_files/main.c new file mode 100644 index 0000000000000000000000000000000000000000..cbf27c637ff243b61aca178f18c1a8770fcbbe49 --- /dev/null +++ b/08_05_three_files/main.c @@ -0,0 +1,11 @@ +// main.c + +#include <stdio.h> +#include "func.h" + + +int main() +{ + func_name_or_id(); + +} diff --git a/08_05_three_files/make/make1 b/08_05_three_files/make/make1 new file mode 100644 index 0000000000000000000000000000000000000000..f7de64ab845944ce62b5c674b1d8708e1d311f47 --- /dev/null +++ b/08_05_three_files/make/make1 @@ -0,0 +1,8 @@ +test : func.o main.o + gcc -o test func.o main.o + +func.o : func.c func.h + gcc -c func.c + +main.o : main.c func.h + gcc -c main.c diff --git a/08_05_three_files/make/make2 b/08_05_three_files/make/make2 new file mode 100644 index 0000000000000000000000000000000000000000..8953672ae31aacfc0379baddc47b373b128e7571 --- /dev/null +++ b/08_05_three_files/make/make2 @@ -0,0 +1,16 @@ +test : func.o main.o + gcc -o test func.o main.o + +func.o : func.c + gcc -c func.c + +main.o : main.c + gcc -c main.c + +#dummy target +clean : + -rm func.o main.o + rm test + +dep : + gccmakedep func.c main.c diff --git a/08_05_three_files/make/make3 b/08_05_three_files/make/make3 new file mode 100644 index 0000000000000000000000000000000000000000..e8ac008c85f869ce0f230e1f641b2c5334ceb3d7 --- /dev/null +++ b/08_05_three_files/make/make3 @@ -0,0 +1,18 @@ +OBJS := func.o main.o + +test : $(OBJS) + gcc -o test $(OBJS) + +func.o : func.c + gcc -c func.c + +main.o : main.c + gcc -c main.c + +#dummy target +clean : + -rm $(OBJS) + rm test + +dep : + gccmakedep func.c main.c diff --git a/08_05_three_files/make/make4 b/08_05_three_files/make/make4 new file mode 100644 index 0000000000000000000000000000000000000000..d8bf175ec28f7a8a6530ed1cb539de588c198878 --- /dev/null +++ b/08_05_three_files/make/make4 @@ -0,0 +1,18 @@ +OBJS := func.o main.o + +test : $(OBJS) + gcc -o $@ $^ + +func.o : func.c + gcc -c $? + +main.o : main.c + gcc -c $*.c + +#dummy target +clean : + -rm $(OBJS) + rm test + +dep : + gccmakedep func.c main.c diff --git a/08_05_three_files/make/make5 b/08_05_three_files/make/make5 new file mode 100644 index 0000000000000000000000000000000000000000..617e1ac1d1f56987d361a5eaa808342a4f9e2f4a --- /dev/null +++ b/08_05_three_files/make/make5 @@ -0,0 +1,20 @@ +OBJS := func.o main.o +CC := gcc +CFLAGS = -c -Wall -g + +test : $(OBJS) + $(CC) -o $@ $^ + +func.o : func.c + $(CC) $(CFLAGS) $? + +main.o : main.c + $(CC) $(CFLAGS) $*.c + +#dummy target +clean : + -rm $(OBJS) + rm test + +dep : + gccmakedep func.c main.c diff --git a/08_05_three_files/make/make6 b/08_05_three_files/make/make6 new file mode 100644 index 0000000000000000000000000000000000000000..1fcedbd9dd8f81e793765e4b1f3b72cecc3a88af --- /dev/null +++ b/08_05_three_files/make/make6 @@ -0,0 +1,18 @@ +SRCS := func.c main.c +OBJS := $(SRCS:.c=.o) +CC := gcc +CFLAGS = -c -Wall -g + +test : $(OBJS) + $(CC) -o $@ $^ + +.c.o : + $(CC) $(CFLAGS) $< + +#dummy target +clean : + -rm $(OBJS) + rm test + +dep : + gccmakedep $(SRCS) diff --git a/08_05_three_files/make/make7 b/08_05_three_files/make/make7 new file mode 100644 index 0000000000000000000000000000000000000000..6a9c6a4daaca15a54b06baf0b0cf41fc4516bdd1 --- /dev/null +++ b/08_05_three_files/make/make7 @@ -0,0 +1,15 @@ +SRCS := func.c main.c +OBJS := $(SRCS:.c=.o) +CC := gcc +CFLAGS = -Wall -g + +test : $(OBJS) + $(CC) -o $@ $^ + +#dummy target +clean : + -rm $(OBJS) + rm test + +dep : + gccmakedep $(SRCS) diff --git a/08_10_ledTest/01.led_wpi_st.c b/08_10_ledTest/01.led_wpi_st.c new file mode 100644 index 0000000000000000000000000000000000000000..740be95ef57eee786fede1c335c0d6fd1cb54b3c --- /dev/null +++ b/08_10_ledTest/01.led_wpi_st.c @@ -0,0 +1,60 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <wiringPi.h> + +int ledOnOff(int gno) +{ + int i; + pinMode(gno, OUTPUT); + + for(i=0; i<5; i++) { + digitalWrite(gno, HIGH); + sleep(2); + //delay(1000); + digitalWrite(gno, LOW); + sleep(1); + //delay(1000); + } + return 0; +} + +int main(int argc, char *argv[]) +{ + int gno; + + if(argc < 2) { + printf("Usage : %s GPIO_NO\n", argv[0]); + exit(-1); + } + gno = atoi(argv[1]); + + wiringPiSetup(); + + ledOnOff(gno); + + return 0; +} + +//$ gpio readall +// BCM(GPIO)-18, (Pin-12) -> wpi-1 +//$ sudo ./a.out 1 + +/* +$ gpio -g mode 18 out +$ gpio -g write 18 1 +$ gpio -g write 18 0 + +$ gpio export 18 out +$ gpio -g write 18 1 +$ gpio unexport 18 + +$ gpio readall (GPIO18 -> Wpi 1) +$ gpio mode 1 out +$ gpio write 1 1 +$ gpio write 1 0 +*/ + + + + diff --git a/08_10_ledTest/03.led_mem1_st.c b/08_10_ledTest/03.led_mem1_st.c new file mode 100644 index 0000000000000000000000000000000000000000..eb482057dfb8c83f51f3b872daf5ae34fec37fe7 --- /dev/null +++ b/08_10_ledTest/03.led_mem1_st.c @@ -0,0 +1,58 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <unistd.h> +#include <string.h> +#include <sys/mman.h> + +#define DEVICE_FILENAME "/dev/mem" + +#define GPIO_BASE (0x3F200000) +#define GPIO_SIZE (256) +#define GPFSEL1 (0x3F200004) //GPIO18:bit26-24 -> 001(output) +#define GPSET0 (0x3F20001C) //GPIO18:bit18 -> 1(set) +#define GPCLR0 (0x3F200028) //GPIO18:bit18 -> 1(clear) +#define OFF_GPFSEL1 (0x04) +#define OFF_GPSET0 (0x1C) +#define OFF_GPCLR0 (0x28) + +volatile unsigned int *gpio; + +int main(void) +{ + int fd; + void *gpio_map; + int i; + + fd = open(DEVICE_FILENAME, O_RDWR|O_SYNC); + if(fd < 0) { + perror("/dev/mem file open error!!"); + exit(-1); + } else printf("/dev/mem file open ok!!\n"); + + gpio_map = mmap(NULL, GPIO_SIZE, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, GPIO_BASE); + if(gpio_map == MAP_FAILED) { + printf("[APP]gpio_mmap error!!\n"); + exit(-2); + } + gpio = (volatile unsigned int *)gpio_map; + printf("gpio mmap ok(addr:%p)!!\n", gpio); + + *(gpio + OFF_GPFSEL1/4) &= ~(7 << 24); //bit26~24 clear + *(gpio + OFF_GPFSEL1/4) |= (1 << 24); //bit26~24 -> 001(ouput mode) + for(i=0; i<5; i++) { + *(gpio + OFF_GPSET0/4 ) |= (1 << 18); //bit18 -> 1(led on) + sleep(1); + *(gpio + OFF_GPCLR0/4 ) |= (1 << 18); //bit18 -> 1(led off) + sleep(1); + } + + nunmap(gpio_map, GPIO_SIZE); + close(fd); + printf("led end...\n"); + return 0; +} + diff --git a/08_10_ledTest/README.md b/08_10_ledTest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6caf2ef8601ce2af87350b96ebc281346204581a --- /dev/null +++ b/08_10_ledTest/README.md @@ -0,0 +1,111 @@ +# Personal Project5 : RaspberryPi에 LED 연결(2020.08.10) + +## GPIO + +### GPIO란? +* General Purpose Input/Output +* 단일 마이크로 프로레서와 같이 입출력(Input/Output) 신호를 제어할 수 있는 포트 +* 사용자가 직접 회로를 구성하고 프로그래밍하여 라즈베리파이의 GPIO를 다룰 수 있다. + +### GPIO 명령어 +1. gpio readall + * gpio map 확인 + * 각 핀의 현재 입/출력방향의 상태와 핀에 입력된 전압(0 or 1)등을 표시해준다. +2. gpio -h + * gpio 명령어 및 정보 확인 +3. man gpio + * gpio 명령어에 대한 소개 +4. gpio -g mode [핀번호] [input or output] + * LED는 출력이고, 스위치는 입력이다. 그러면 각각 입력인지 출력인지 방향을 정해줘야 한다. + * ex) gpio -g mode 21 output => 21번 핀에 LED를 연결했다면, 출력으로 설정한다. + * ex) gpio -g mode 26 input => 26번 핀에 스위치를 연결했다면, 입력으로 설정해야 한다. +5. gpio -g write [핀번호] [1 or 0] + * LED를 출력할 수 있도록 설정했으니, 불빛이 들어오도록 설정해야 한다. + * ex) gpio -g write 29 1 => 29번 핀에 연결한 LED의 불빛이 들어온다. + * ex) gpio -g write 29 0 => 29번 핀에 연결한 LED의 불빛이 꺼진다. + +## 회로 구성 +* 준비물 : 라즈베리 파이, T자형 코블러, Breadboard(빵판), 빵판용 점퍼 와이어(전선), LED, 고정 저항기(레지스터) + + +## ledTest.c +1. wiringPi.h 헤더파일을 추가시킨다. + ```C + #include <wiringPi.h> + ``` + * wiringPi : 라즈베리 파이의 BCM2835 프로세서에 접근하는 라이브러리 +2. 핀 모드를 29번으로 설정한다.(BCM으로 21번이 wiringPi에서 29번이므로) + ```C + pinMode(29, OUTPUT); + ``` +3. for문을 이용하여 동작을 5번 실행한다. + ```C + for(i=0;i<5;i++) + { + + } + ``` +4. led를 키고 0.5초 지연시킨다. + ```C + digitalWrite(29, 1); + delay(500); + ``` +5. led를 끄고 0.5초 지연시킨다. + ```C + digitalWrite(29, 0); + delay(500); + ``` + +## 실행 결과 +* gcc ledTest.c -lwiringPi +  +  + + + + + +## GPIO + +### GPIO란 + + + + + + +gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ +pi@raspberrypi:~ $ gpio read 1 +0 +pi@raspberrypi:~ $ gpio toggle 1 +pi@raspberrypi:~ $ gpio read 1 +1 +pi@raspberrypi:~ $ gpio write 1 0 +pi@raspberrypi:~ $ gpio read 1 +0 +pi@raspberrypi:~ $ gpio read 1 + +### 실행방법 +gcc 01.led_spi_st.c -lwiringPi +./a.out 1 + +gcc 03.led_mem1_st.c -o 03 +sudo ./03 + +### sudo -i vs sudo su cs sudo su - +switch user + +su kim : 현재 pio계정에 모든 환경변수를 그대로 쓸때 +su -kim : kim에 oriented된 환경변수를 쓸때 + +### ls -F +@ : link +\*는 실행가능한 파일 \ No newline at end of file diff --git a/08_10_ledTest/ledTest.c b/08_10_ledTest/ledTest.c new file mode 100644 index 0000000000000000000000000000000000000000..abec2faa5bfe9220a9a4925dfb775a91bf62863c --- /dev/null +++ b/08_10_ledTest/ledTest.c @@ -0,0 +1,17 @@ +#include <stdio.h> +#include <wiringPi.h> + +int main() +{ + int i; + if(wiringPiSetup()==-1) return -1; + pinMode(29, OUTPUT); + for(i=0;i<5;i++) + { + digitalWrite(29, 1); + delay(500); + digitalWrite(29, 0); + delay(500); + } + return 0; +} \ No newline at end of file