Skip to content
Snippets Groups Projects
Commit 6bc83905 authored by JieunYoon's avatar JieunYoon
Browse files

Fix folder name

parent 147920e1
No related branches found
No related tags found
No related merge requests found
Showing
with 591 additions and 0 deletions
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)
# 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
* 전처리까지만 실행한 결과를 화면에 출력한다.
![gcc-E(1)](https://user-images.githubusercontent.com/54850435/89533294-2b9c9a00-d82e-11ea-9d6e-f170b127536c.PNG)
* 01.option-E.i 생성
![gcc-E(2)](https://user-images.githubusercontent.com/54850435/89533368-4969ff00-d82e-11ea-879d-9c3c28f3c29c.PNG)
2. gcc -S : 컴파일 단계만 실행
* 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행한다.
* 02.option-S.s 생성
![gcc-s](https://user-images.githubusercontent.com/54850435/89533405-5555c100-d82e-11ea-8765-65f17c5b112b.PNG)
3. gcc -c : 컴파일과 어셈블
* 어셈블까지만 수행하고 링크는 수행하지 않는다.
* 03.option-c.o 생성
![gcc-c](https://user-images.githubusercontent.com/54850435/89533512-80401500-d82e-11ea-98e9-82294f9667ae.PNG)
4. gcc -g
* gdb에게 제공하는 정보를 바이너리에 삽입한다.
* 디버깅 정보가 담긴 실행파일을 생성한다.
* a.out 생성
![gcc-g](https://user-images.githubusercontent.com/54850435/89533542-89c97d00-d82e-11ea-9b30-82e8e85a10b3.PNG)
5. gcc -Wall
* 모든 모호한 코딩에 대해서 경고를 보내는 옵션이다.
![gcc-Wall](https://user-images.githubusercontent.com/54850435/89533566-9352e500-d82e-11ea-9fd2-5cb7a3a53a5d.PNG)
6. gcc -o : 출력 파일 지정
* 실행파일을 만든다.
* 이름이 00인 실행파일 만들기
![gcc-o(1)](https://user-images.githubusercontent.com/54850435/89533595-9e0d7a00-d82e-11ea-9a66-c41af3c71e6a.PNG)
* 이름이 01.exe인 실행파일 만들기
![gcc-o(2)](https://user-images.githubusercontent.com/54850435/89533613-a665b500-d82e-11ea-87ed-542d346a70a6.PNG)
7. gcc -D : 매크로 지정
* 매크로를 외부에서 define할 때 사용한다.
![gcc-D](https://user-images.githubusercontent.com/54850435/89533642-b1204a00-d82e-11ea-850b-d5b982c8850a.PNG)
# 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 형식
![make1](/uploads/0a40029e667928fe4d54a7b588d974fe/make1.PNG)
2. Dummy Target(Label) & Dependency Check
![make2](/uploads/9d701192aea00d8fe458105fb6120295/make2.PNG)
3. 매크로(Macro, Variable)의 이용
![make3](/uploads/02da1b99ea3eed380e1b7715ea8c2a75/make3.PNG)
4. 내장 매크로(Internal Macro)의 이용
![make4](/uploads/bdd7a9dba3dcb3937dbcc8386fc00d1d/make4.PNG)
5. 내장 매크로(Pre-definced Macro)의 이용
![make5](/uploads/1f1285d02099c4a8435c900737c7d4a0/make5.PNG)
6. 확장자규칙(Suffix Rules)의 이용 & 확장자(Suffix)의 치환 이용
![make6](/uploads/46ba746c8c95efe7909a05cb642570f6/make6.PNG)
7. 디폴트 확장자규칙(Default Suffix Rules)의 이용
![make7](/uploads/4e3b187a18d5f578b28af2f1cec71280/make7.PNG)
8. make clean 후 make
* make clean 했을 때 설정한 파일들이 지워지고 make를 했을 때 설정 파일들을 컴파일한다.
![makeclean_make](/uploads/7433da7c8dbcfdc40f57f1e05f95b77a/makeclean_make.PNG)
\ No newline at end of file
//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
}
//func.h
extern int func_name_or_id();
File added
// main.c
#include <stdio.h>
#include "func.h"
int main()
{
func_name_or_id();
}
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
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
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
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
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
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)
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)
#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
*/
#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;
}
# 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, 고정 저항기(레지스터)
![연결상태](/uploads/99a8130d152cc09e8ea8bb14e08ac592/연결상태.jpg)
## 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
![실행방법](/uploads/5b2f627378d14e2cabd312597155daa2/실행방법.PNG)
![5번깜빡](/uploads/0343b31a2a20a4f52388483f47bf1ecc/5번깜빡.mp4)
## 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
#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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment