이제 AVR을 구동시키기 위해서는 AVR이 이해할 수 있는 명령어들(어셈블리 명령어)로 이루어진 화일을 내부 플래시 메모리에 다운로드시켜야 한다. 따라서 사용자가 작성한 C/C++ 프로그램을 AVR이 실행할 수 있는 이진 파일로 번역(컴파일)해 주는 컴파일러가 필요하다. 사용자가 작성한 C/C++프로그램은 그 표준이 정해져 있기 때문에 PC용이든 uC용이든 그 외관은 비슷해 보이지만 컴파일러에 따라서 같은 프로그램을 PC에서, uC에서, 혹은 DSP에서와 같이 다양한 플랫폼에서 구동시킬 수 있다.


 이러한 AVR컴파일러는 상업용(예:CodevisionAVR) 과 무료 컴파일러로 크게 구분할 수 있다. avr-gcc/avr-g++ 은 대표적인 오픈소스 기반의 무료 AVR 컴파일러로서 그 성능이 상용 컴파일러에 못지 않고 또 Atmel Studio라는 개발 IDE에 통합되어 편리하게 사용할 수 있기 때문에 널리 사용되고 있다. Atmel studio 6.x버전은 컴파일러를 포한한 여러 도구를 모아 놓은 avr 툴체인(toolchain)이 설치 화일에 포함되어서 Atmel studio를 설치할 때 이것들도 자동으로 설치되며 따라서 WinAVR을 별도로 설치할 필요가 없다.


지원하는 변수형

 avr툴체인은 <표 4.1.1>에 수록된 데이터 형을 지원한다. 표준 C/C++에서 지원하는 거의 모든 데이터형을 지원한다. 또한 C/C++ 에서 상수는 10진수, 8진수, 16진수 세 가지 표현만 지원했으나 gcc/g++는 2진수 표현도 지원하며 0b로 시작한다. PC환경에서는 2진수를 취급하는 것이 그다지 중요하지 않지만 uC 프로그래밍에서는 2진수를 다루는 것은 매우 빈번히 일어나며 중요하다. 예를 들어서 다음 네 가지 변수는 모두 같은 숫자값을 가진다.


byA = 17;
byB = 019;
byC = 0x11;
byD = 0b00010001; //2진수 표현


즉, AVR 프로그램에서 2진수를 취급하는 경우가 상대적으로 많기 때문에 지원하는 기능이며 편리하게 사용할 수 있다.


[표 1] avr툴체인이 지원하는 자료형

종류

데이터형

축약된 표현

바이트 수

비고

signed char

int8_t

1

unsigned char

uint8_t

1

signed short

int16_t

2

unsigned short

uint16_t

2

signed int

int16_t

2

signed short 와 같다

unsigned int

uint16_t

2

un signed short 와 같다

signed long

int32_t

4

unsigned long

uint32_t

4

signed long long

int64_t

8

unsigned long long

uint64_t

8

실수형

float

4

double

4

float형과 같다.

논리형

boolean


1

avr-g++ 에서만 지원


여기서 주의할 것은  avr툴체인의 int형은 short형과 마찬가지로 2byte이고, double형은 float형과 마찬가지로 4byte라는 것이다.

IOCR에의 접근

 IOCR이 무엇인지는 이전 포스트에서 설명한 바가 있다. AVR프로그래밍에서 IOCR을 조작하는 것은 거의 필수적으로 행해지는 일이다. avr-gccs는 IOCR에 접근하는 편리한 방법을 제공하는데 예를 들어 PORTD와 관련된 레지스터(PORTD, DDRD, PIND)값을 읽거나 쓰려면 다음과 같이 하면 된다.


unsigned char byA = 0;
PORTD = byA;
DDRD = 0xFF;
byA = PIND;


이런 식으로 변수를 다루듯이 IOCR의 이름을 사용할 수 있는데 이러한 명령이 내려지면 컴파일러는 해당하는 IOCR의 주소를 참조하여 거기에 접근하는 일련의 명령어들을 자동으로 생성하게 된다.


 <io.h>를 인클루드할 때 자동으로 포함되는 <sfr_defs.h>에는 비트를 조작하는 매크로가 다음과 같이 정의되어 있다.

#define _BV(bit) (1 << (bit))

이 매크로를 이용하면 IOCR의 특정한 비트를 세트(1) 또는 리셋(0)시키는데 다음과 같이 사용할 수 있다.


PORTD |= _BV(0); //0번비트 세트
PORTD &= ~_BV(7); //7번비트 리셋


그리고 같은 헤더파일에 IOCR의 특정 비트가 세트(리셋)되어 있는지 조사하는 매크로가 다음과 같이 정의되어 있어서 조건문과 조합하여 사용할 수 있다.


#define bit_is_set(sfr,bit) (_SFR_BYTE(sfr)&_BV(bit))
#define bit_is_clear(sfr,bit) (!(_SFR_BYTE(sfr) & _BV(bit)))


또한, IOCR의 특정 비트가 세트(리셋)될 때까지 기다리는 매크로도 다음과 같이 정의되어 있다.

#define loop_until_bit_is_set(sfr, bit)
                  do {} while (bit_is_clear(sfr, bit))
#define loop_until_bit_is_clear(sfr, bit)
                  do {} while (bit_is_set(sfr, bit))


이러한 매크로 함수를 이용하면 어떤 특정한 비트가 세트(리셋)될 때까지 대기해야 되는 경우에 편리하게 사용할 수 있다.



Posted by 살레시오
,