컴퓨터응용실험실 마이크로프로세서1pds3.egloos.com/pds/200707/30/01/slide2.pdf ·...

18
컴퓨터응용실험실 마이크로프로세서 1 마이크로프로세서 개발을 위한 C 언어 사용법 소개 컴퓨터응용실험실 마이크로프로세서 2 Microsoft Visual C++ 이용한 C 연습 Win32 Console Application 으로 VisualC_exam1 프로젝트 생성

Upload: others

Post on 09-Oct-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

컴퓨터응용실험실 마이크로프로세서 1

마이크로프로세서 개발을 위한

C 언어 사용법 소개

마이크로프로세서 개발을 위한

C 언어 사용법 소개

컴퓨터응용실험실 마이크로프로세서 2

Microsoft Visual C++ 이용한 C 연습Microsoft Visual C++ 이용한 C 연습

Win32 Console Application 으로 VisualC_exam1 프로젝트 생성

컴퓨터응용실험실 마이크로프로세서 3

프로젝트 파일 추가

main.cpp

컴퓨터응용실험실 마이크로프로세서 4

간단한프로그램의실행간단한프로그램의실행

컴퓨터응용실험실 마이크로프로세서 5

Simple programSimple program

// hello.c: Hello World program#include <stdio.h>

int main(void) { printf("Hello World!\n"); return 0;

}

• 주석달기

// hello.c: Hello World program• 동작 : 컴파일러에게 아무런 영향을 미치지 못한다.• : 프로그래머에 의해 유용한 정보를 기록한다.

: 프로그램 해독을 쉽게하기 위해 내용을 기록한다.

컴퓨터응용실험실 마이크로프로세서 6

#include <stdio.h>

include 문이미 개발된 코드(명령어들의 연속)을 그 곳에 include(포함) 시키는 동작을 한다.위 예제는 stdio.h 라는 파일을 #include <stdio.h> 위치에 풀어 나열시킨다.< >가 사용되면 컴파일러의 환경설정에서 정한 include path 위치에서 그 파일을

찾는다.현재작업중인폴더에서 include 하려면 “ ” 를사용

stdio.h 에는 무엇이 있나?표준입출력(standard input and output)에 관련된코드들이 기록되어 있다.

printf() 함수는 stdio.h 에서 사용할 수있음을 선언하고있다.

컴퓨터응용실험실 마이크로프로세서 7

int main(void){

. . .}

함수 명이 main인 함수

{ 는 함수(불록)의 시작을 알리고, } 는 함수

(블록)의 끝을 알린다.

int 가 함수 앞에 : 함수가 종료될 때 얻어지

는 결과 값이 int 형 값임을 알린다.

• int 자료형 : 연산 대상 유형이 정수형인

형태를 취한다.

(void)는 main()함수의 입력 파라메타가 없

을을 나타낸다.

C 언어의 시작은 main 함수 부터 출발한다.

•프로그램 관리 프로그램이 main 함수를

호출한다.

컴퓨터응용실험실 마이크로프로세서 8

{ printf("Hello World!\n"); return 0;

}

함수 printf()를 호출한다.이 때 인수(argument)로 “Hello World!\n”를 printf()

함수에게 전달한다.\n 은 줄바꿈 문자

return 0; int main(void)로 main()함수는 int형을 반환한다.

컴퓨터응용실험실 마이크로프로세서 9

변수(variable)와자료형(data type)변수(variable)와자료형(data type)

변수의 선언

-int 자료형 변수 x 를 선언했다.

-선언된 아래에서 변수 x를 사용할 수 있다.

printf() 함수 내의 결과 대입

- %d 위치에 연산결과를 정수형으로 대입

- x+5 를 %d 위치에 대입하여 출력

- 순서대로 짝맞추어 대입

- %x : 16진수로 대입

- %f : 소수점 있는 float형

컴퓨터응용실험실 마이크로프로세서 10

마이크로프로세서와 컴파일러마다

자료형에 대한 길이가 다르다.int 자료형의 길이

•Pentium PC VC++: 32 bit = 4 byte•AVR Gcc : 16 bit = 2 byte

long 자료형의길이

• Pentium PC VC++: 32 bit = 4 byte•AVR Gcc: 32 bit = 4 byte

double 자료형 길이

•Pentium PC VC++: 64 bit = 8 byte•AVR Gcc: 32 bit = 4 byte

포인터 자료형 길이

•Pentium PC VC++: 32 bit•AVR Gcc: 16 bit

컴퓨터응용실험실 마이크로프로세서 11

AVR의자료형(data type) 길이AVR의자료형(data type) 길이

#include <inttypes.h>

typedef int int16_t //16-bit signed type. typedef long int32_t //32-bit signed type. typedef long long int64_t //64-bit signed type. typedef signed char int8_t //8-bit signed type. typedef int16_t intptr_t //Signed pointer compatible type. typedef unsigned int uint16_t //16-bit unsigned type. typedef unsigned long uint32_t //32-bit unsigned type. typedef unsigned long long uint64_t //64-bit unsigned type. typedef unsigned char uint8_t //8-bit unsigned type. typedef int16_t uintptr_t //Unsigned pointer compatible type.

컴퓨터응용실험실 마이크로프로세서 12

배열(Array) 변수배열(Array) 변수

이름은 동일하고 index로 배열내의 하나를 구별

int형 7개의 자료를 배열명 a로 선언

•각 각은 a[인덱스]로 구분한다.

•인덱스는 0 ~ 6 까지 사용 가능

컴퓨터응용실험실 마이크로프로세서 13

산술연산자산술연산자

+ Addition (더하기)- Subtraction (빼기)* Multipication (곱하기)/ Division (나누기)% Modulus (나누었을 때 나머지)

• 연산결과는 operand 중 큰 자료형으로 변환된다.5/2 5./2

int/int int double/int double

컴퓨터응용실험실 마이크로프로세서 14

흐름제어 if…else…문흐름제어 if…else…문

if(조건){ ⓐ

}else{ ⓑ

}

조건연산이 True 면 ⓐ 블록을 수행하고

False면 ⓑ 블록을 수행한다.수행될 명령이 하나일경우는블록기호 { }를생략할 수 있다.

True일 때 만 사용하고자 할 때

else { }는 생략할 수 있다.

조건연산이 0 일 때 False로 취급하고 0이

아닐 때 True로 취급한다.

컴퓨터응용실험실 마이크로프로세서 15

관계연산자(Relational operator)와연산결과관계연산자(Relational operator)와연산결과

연산 결과 : True 일 때 1

연산 결과 : False 일 때 0

컴퓨터응용실험실 마이크로프로세서 16

반복(Loop)문 : for loop반복(Loop)문 : for loop

for(식1; 식2; 식3){ⓐ

}1. 식1은 무조건 수행

2. 식2가 True면 ⓐ실행

3. 식3 실행 후 goto 2

컴퓨터응용실험실 마이크로프로세서 17

반복문 : while loop반복문 : while loop

while(식1){ⓐ

}1. 식1이 True면ⓐ 수행

2. Goto 1

들여쓰기를 하라.블록 영역이 눈에 쉽게띈다.

프로그램을 이해하기쉽다.

관리가용이하다.

컴퓨터응용실험실 마이크로프로세서 18

반복문 : do ~ while Loop반복문 : do ~ while Loop

do {ⓐ

} while(식1);

1. ⓐ블록을 수행한다.2. while 식1이 True면 goto 1

• 주의 : while(식) 뒤에 ; 이 반드시

있어야 한다.• x++ 는 x = x + 1 의미를 갖는다.

컴퓨터응용실험실 마이크로프로세서 19

반복중단(break)반복중단(break)

string[0]string[1]string[2]string[3]string[4]string[5]string[6]string[0]string[8]string[0]string[10]string[11]string[12]string[13]string[14]string[15]string[16]

break; 반복문의 수행을 중지하고 블록을 빠져

나온다.strlen() 함수 실행을 위해

#include <string.h> 가 포함되었다.strlen() 함수는 문자열의 byte 길이를 정

수로 알려준다.x++ 는 x 값을 1 증가

T h i s i s a s t r i n g \0

char string[] = “This is a string”;string

컴퓨터응용실험실 마이크로프로세서 20

반복건너뜀(continue)반복건너뜀(continue)

continue; 반복 블록구간 중 이 후 명령들을 무시하고

skip 한다.반복 명령은 계속된다. 단 1 회에 한하여

continue; 이후의 블록구간을 건너뛴다.

컴퓨터응용실험실 마이크로프로세서 21

함수(function)함수(function)

함수는 앞에서 선언(declare)되어야

호출할 수 있다.선언된 함수는 정의(define)되어 있어야

실행될 수 있다.함수의 반환 자료형은 함수가 종료될 때

return 되는 값의 유형이다.함수간에 전달되는 파라메타 자료형을

선언과 정의에서 표시한다.

컴퓨터응용실험실 마이크로프로세서 22

함수(function)함수(function)

함수의 정의(define)를 앞에서 하면

선언(declare) 할 필요없이 호출할 수

있다.

컴퓨터응용실험실 마이크로프로세서 23

다른파일에있는함수(function)의호출다른파일에있는함수(function)의호출

extern 예약어를 사용하여 다른 파일에 int square()함수가 있음을 선언(declare)한다.다른 파일에서 int square() 한수를 정의(define)한다.

main.c

foo.c

main.o

foo.cmain.exe

compile

compile

link

Source file Object file Executable file

컴퓨터응용실험실 마이크로프로세서 24

변수의유효구역(Variable Scope)변수의유효구역(Variable Scope)

블록 안에서 선언된 변수는 그 블록내에서만

유효

동일한 변수명으로 선언된 경우는 가까운 블

록에서 선언된 변수가 유효

안쪽 블록에서 선언된 x

바깥 블록에서 선언된 x

컴퓨터응용실험실 마이크로프로세서 25

불록 밖에서 선언된 변수는 여러 블록에서 유효

선언된 이후 사용이 가능

블록 밖에서 선언된 변수 x

선언된 이후에 사용가능

컴퓨터응용실험실 마이크로프로세서 26

다른함수에서선언된변수의사용다른함수에서선언된변수의사용

extern 예약어를 이용하여 외부

파일에 변수가 있음을 선언한 후

사용한다.

실제 변수는 다른 파일에 정의되어

있다.

다른 파일에 있는 함수도 extern 예약어를 이용하여 선언한 후 호출

한다.

컴퓨터응용실험실 마이크로프로세서 27

포인터(pointer)포인터(pointer)포인터는 변수(variable)에 대한 주소(address)를 갖는 변수다.

int x;int *ip;

*ip 는 int형 데이터다. 변수 ip는 int형 변수에 대한 주소를 갖을 수 있다.*ip 는 변수 ip가 갖는 주소에 위치한 int 형 데이터다.&x 는 int형 변수 x의 주소가 추출된다.

주소

&x

&ip

내용

?

x

ip

?

• x 는 int 형 변수

• ip 는 int형 변수 주소를 갖을 수 있는 포인터

• x 에 3을 기록

• ip에 int형 변수 x의주소(&x)를 기록

• ip가 갖는 int형 변수주소 위치에 x + 2 기록

컴퓨터응용실험실 마이크로프로세서 28

포인터와배열(Pointers and Arrays)포인터와배열(Pointers and Arrays)

배열은 하나의 이름으로 여러 변수

를 사용

각 변수는 “배열명[index]” 형태로

사용

배열명은 배열의 첫번째 주소를 나

타내는 상수(constant)배열명은 주소이므로포인터에 대입

시킬 수있다.

포인터에 더해진 정수는 포인터자료형

원소의수 만큼주소가더해진것이다.

(* byte 값이 더해진 것이 아님)

배열명이 대입된 포인터는 배열명과

같이 동작 할수있다.

컴퓨터응용실험실 마이크로프로세서 29

함수에대한포인터함수에대한포인터

int (*p)(int a, int b);p 는 함수의 시작주소를 가질 수 있

는 포인터

단 반환자료형이 int이고 파라메타로

두 개의 int를 갖는 함수의 주소

함수 포인터 p의 선언

* 반환은 int형, 인수는 2개의 int형

함수포인터 p에 함수 foo() 시작위치 대입

* 함수 foo()는 int foo(int x, int y) 로서 선

언된 포인터와 동일한 함수 유형

함수포인터로 함수의 호출

컴퓨터응용실험실 마이크로프로세서 30

구조체(Structure)구조체(Structure)

자료형을 혼합하여 구조화하여 사용

할 수 있다.struct complex 자료형을 구조체로

새롭게 탄생시켰다.앞의 구조체 자료형 변수 x, y, z를

선언하여 사용할 수 있게 했다.구조체의 구성변수(member)는 . 로지칭하여 사용한다.구조체변수를 인수와 반환값으로 하

는 함수를 사용할 수 있다.구조체크기가커지면비 효율적

컴퓨터응용실험실 마이크로프로세서 31

구조체의포인터구조체의포인터

포인터로 구조체를 사용할 때

구성원소는 -> 로 지칭하여 사용한다.

컴퓨터응용실험실 마이크로프로세서 32

#define 문#define 문

#define 대표명 문자열

대표명을 문자열로 대신 사용한다.사용용도

프로그램의 여러 곳에서 변경될 수있

는 상수를 대표하는 이름으로사용

여러곳을 수정할 필요없이 #define 문만 수정하면 된다.

#define 문의 마지막에 ;을 사용하지

않는다.

컴퓨터응용실험실 마이크로프로세서 33

typedef 문typedef 문

자료형 표현을 바꾸어 사용

int 자료형 표현을 myinteger_t 로

사용

struct complex 자료형을

complex_t 표현으로 사용

기존 표현을 사용해도 무방함.단 혼돈의 여지가 있을수 있다.

컴퓨터응용실험실 마이크로프로세서 34

#include <inttypes.h>

파일 inttypes.h 에 있는 내용

typedef int int16_t //16-bit signed type. typedef long int32_t //32-bit signed type. typedef long long int64_t //64-bit signed type. typedef signed char int8_t //8-bit signed type. typedef int16_t intptr_t //Signed pointer compatible type. typedef unsigned int uint16_t //16-bit unsigned type. typedef unsigned long uint32_t //32-bit unsigned type. typedef unsigned long long uint64_t //64-bit unsigned type. typedef unsigned char uint8_t //8-bit unsigned type. typedef int16_t uintptr_t //Unsigned pointer compatible type.

컴퓨터응용실험실 마이크로프로세서 35

함수호출파라메타의자료형함수호출파라메타의자료형

인수를 포인터가 아닌 변수를 사용하면 변수 값을 copy하여 전달한다.copy하여전달되기때문에호출된함수에서수정해도호출한블록의변수는

수정되지않는다.

배열과큰구조체를인수로직접사용할때 copy해야할양이많아지므로효율

적이지못하다.

인수로 포인터를 사용하면 주소를 copy하여 전달한다.주소를찾아가값을수정할수있으므로호출한블록의변수가수정될수있다.

주소만을 copy해서전달하므로배열과구조체의경우는포인터로인수전달하

는것이바람직하다.

컴퓨터응용실험실 마이크로프로세서 36

포인터로 인수전달

인수 p[] 는 p가 배열임을 알림

인수가 포인터이므로 주소를 추출하여 전달

인수는 전달된 값을 copy하여 사용

•포인터가 아닌 경우는 변수값 copy

•포인터인 경우는 주소를 copy

주소로 내용을 수정하므로 main() 함수의

sum 변수 값이 수정된다.