AVR & ATmega

CodeVisionAVR ANSI C Language 요점 정리(1)

EP 기술연구소 2010. 4. 19. 14:33

CodeVisionAVR ANSI C Language 요점 정리

 

l        CodeVisionAVR 특징

- Atmel AVR용 통합 환경 C 컴파일러.

 통합 환경 내에 여러 가지 ISP 기능 포함.

 통합 환경 내에 비동기 통신 터미널 기능 내장.

- 윈도우 95, 98, NT4.0, 2000 환경에서 동작

- 생성된 COFF파일은 AVR Studio를 사용하여 소스 레벨 디버깅 가능.

- 표준 라이브러리 외에 아래의 여러 가지 주변 소자 라이브러리 포함

       문자형 LCD 모듈

       Philips I2C 버스

       온도 센서 소자(LM75, DS1820)

       Real Time Clock 소자 지원(PCF8563,PCF8583, DS1302, DS1307)

       Dallas 1 Wire 프로토콜

       Thermometer/Thermostat (ds1621)

       SPI

       Delay 함수

       Power management

-  자동 소스 생성 기능 내장

 

l        변수 / 함수 / 레벨의 이름(Identifiers) 지정

- 알파벳 문자(A..Z, a..z)와 숫자(09) 그리고 underscore(_)문자 사용 가능.

- 시작은 알파벳 문자나 underscore로 사용 가능.

- 대소문자 구분 있음.

- 최대 32문자까지 사용 가능.

 

l        CodeVisionAVR의 데이터 타입

데이터 타입

크기(bit)

범 위

Bit

1

0,1

Char

8

-128 ~ 127

Unsigned char

8

0 ~ 255

Signed char

8

-127 ~ 127

Int

16

-32768 ~ 32767

Short int

16

-32767 ~ 32767

Unsigned int

16

0 ~ 65536

Signed int

16

-32767 ~ 32767

Long int

32

-2147483648 ~ 2147483647

Unsigned long int

32

0 ~ 4294967295

Signed long int

32

-2147483648 ~ 2147483647

Float

32

-0.175e-38 ~ +0.402e38

Double

32

-0.175e-38 ~ +0.402e38

 

l        주석(Comments) 처리

주석 시작           /*

주석 끝              */

:        /* 이것은 주석 입니다 */

한 줄 주석 처리: //

:        // 이것도 주석입니다.

 

l        전처리(Preprocessor)

-         <![endif]>파일 포함 처리:

#include <file name>          /* 컴파일러 설치 사용 디렉터리에서 참조 */

#include file name           /* 현재 작업 디렉터리에서 참조 */

-         <![endif]>macro define:

#define  ALFA 0xff              /* ALFA 심볼을 0xff로 동일 처리 */

                                /* 소스 문에서 ALFA를 모두 0xff로 컴파일 처리 함 */

-         <![endif]>파라미터를 가질 수 있음:

#define  SUM(a,b) a+b

int         i=SUM(2,3);          /* i=2+3;으로 치환 처리 */

 

-         매크로 파라미터에 #을 사용하면 문자열로 치환:

#define PRINT_MESSAGE(t) printf(#t)

PRINT_MESSAGE(Hello);    /* printf(Hello)와 동일 처리 */

 

-         두개의 파라미터가 ## 연산자로 하나로 합해 짐:

#define ALFA(a,b) a ## b

char      ALFA(x,y)=1;         /* char xy=1; 과 동일  처리 */

 

-         역 슬래시()를 사용하여 다음 줄까지 연장:

#define MESSAGE This is a very    

long text

 

-         define 취소: #undef 사용

#undef   ALFA

 

-         조건부 컴파일 처리 : #ifdef, #ifndef, #else, #endif

#ifdef macro_name

             [ 1 그룹]

#else                                             /* option */

             [ 2 그룹]

#endif

설명: 만일 macro_name define 되어 있으면 [ 1 그룹]을 컴파일 하고, 그렇지 않으면 [ 2 그룹]을 컴파일 한다.

 

-         또 다른 조건부 컴파일 처리: #if, #elif, #else, #endif

#if expression1

             [ 1 그룹]

#elif expression2

             [ 2 그룹]

#else

             [ 3 그룹]

#endif

설명: 만일 expression1 true이면 [ 1 그룹]을 컴파일 하고,

그렇지 않고 만일 expression2 true이면 [ 2 그룹]을 컴파일 하고,

그 외에는 [ 3 그룹]을 컴파일 한다.

 

-         #error : 컴파일을 중지하고 에러 메시지를 표시.

:

#error This is an error!

 

-         #pragma : 컴파일러 특수 지시 문

#pragma warn-                               /* warning 디스어블 */

#pragma warn+                               /* warning 인에이블 */

#pragma opt-                                  /* 최적화 안 함 */

#pragma opt+                                  /* 최적화 함 */

#pragma savereg-                           /* 레지스터 저장 안 함 */

#pragma savereg+                           /* 레지스터 저장 함 */

#pragma library mylib.lib     /* 링크 라이브러리 지정 */

 

n        상수(Constants)

2진수 : 0b로 시작( 0b101001)

16진수 : 0x로 시작 (. 0xff)

8진수 : 0으로 시작 (. 0777)

Unsigned integer 상수는 뒤에 U사용: (, 10000U)

Long integer 상수는 뒤에 L사용: (, 99L)

Unsigned Long integer 상수는 뒤에 UL사용: (, 99UL)

Floating point 상수는 뒤에 F사용: (, 1.234F)

문자 상수는 1중 따옴표로 처리: (, a)

문자열 상수는 2중 따옴표로 처리:  (, Hello world)

(함수의 파라미터 안에 2중 따옴표 문자열이 있으면 FLASH 메모리에 놓임.)

행렬은 최대 8차까지 가능

 

n        변수(Variables)

전역(global) 변수와 지역(local) 변수가 있음.

전역(global) 변수 : 함수 외각에 선언, 프로그램 내의 모든 함수에서 사용 가능.

지역(local) 변수 : 함수 내부에 선언, 해당 함수 내에서만 사용 가능.

초기화하지 않은 전역 변수는 프로그램 초기에 0으로 초기화 됨.

 

:

/* 전역 변수 선언 */

char a;

int b;

long c = 0x12345678;            /* 초기화 */

 

void main(void){

/* 지역 변수 */

char d;

int e;

long f=22222222;    /* 초기화 */

}

행렬 변수: 8차까지 가능, 0부터 시작, 초기화하지 않은 전역 행렬 변수 값은 0으로 초기화.

 

/* 전역 행렬 변수 */

int global_array1[32];          /* 모든 값이 0으로 초기화 */

int global_array2[]={1,2,3};

int global_array3[4]={1,2,3,4};

char global_array4[]=This is a string;

int multidim_array[2,3]={{1,2,3},{4,5,6}};

void main(void){

 

/* 지역 행렬 변수 */

int local_array[3]={11,22,33};

}

 

static 변수: 지역 변수라도 static 선언을 하면 값을 보존할 수 있다.

:

int alfa(void){

static int n=1;        /* static 변수 선언 */

return n++;