8051
AVR
EZLab
PIC
80C196KC
DSP
ARM
VHDL
마이크로마우스
로봇축구
Battle 로봇
로봇대회
휴먼로봇
Embeded Linux
HW/SW 강좌
RTOS
 
 

1. GCC(GNU C Compiler)의 일반적인 소개

2. 윈도우(Win9x, WinNT)용 AVR-GCC

3. Linux용 AVR-GCC

 

AVR-GCC - GNU C Compiler for AVR

1) GCC의 소개

   GCC(이하 gcc)는 FSF(Free Software Foundation : 자유 소프트웨어 재단)에서 추진중인 GNU(GNU is Not Unix) 프로젝트의 일환으로 개발된 공개 C 언어 컴파일러이다. 공개임에도 불구하고 gcc는 매우 뛰어난 성능과 안정성을 갖추고 있으며, 전세계의 해커들에 의해서 보완 발전되고 있다. 이런 이유로 gcc는 매우 다양한 유닉스 시스템에 이식되어 있으며, 특히 Linux 시스템의 경우 기본적으로 gcc를 시스템용 C 컴파일러로 채택하고 있다.

 

2) GCC의 특징

   gcc의 여러 특징들 가운데 하나는 이식성(portability)이다. 이는 본래 GNU 프로젝트가 여러 유닉스 시스템 지원을 목표로 삼고 있으며 gcc 역시 그러한 특성을 물려 받았기 때문이다. 아마도 gcc는 가장 많은 하드웨어 플랫폼을 지원하는 C 컴파일러가 아닌가 싶다(실제로 지금까지 나온 거의 모든 CPU를 지원한다). 이러한 특징으로 gcc는 여러 플랫폼에 대하여 거의 동일한 개발환경(development environment)소스 코드 호환성(source code compatibility)을 제공한다. 개발자에게 있어서 개발환경은 매우 중요하다. 특히 CPU가 바뀜에 따라서 변화하는 개발환경은 개발자에게 매우 긴 적응 시간을 소비하게 만든다. gcc의 경우는 플랫폼에 상관없이 대부분의 컴파일러 옵션을 이용할 수 있다. 그리고 소스 코드 호환성 역시 중요한데, 예를 들면 x86 계열의 시스템에서나 PowerPC 또는 SPARC 계열의 시스템에서 약간의 소스 코드 수정만으로도 호환되는 프로그램 개발이 가능하다는 것을 의미한다. 이 역시 개발자가 다른 플랫폼을 지원하기 위해 소스 코드를 재작성하는 시간을 줄여주기 때문에 매우 중요한 점이다. 이외에도 많은 뛰어난 특징들이 있다. 자세한 사항들은 gcc homepage를 참고하기 바란다.

 

3) 크로스 컴파일러(Cross Compiler)

   크로스 컴파일러를 이해하기 전에 먼저 호스트 플랫폼(host platform)타겟 플랫폼(target platform)이라는 용어를 먼저 이해해야 한다. 타겟 플랫폼은 크로스 컴파일러가 생성하는 오브젝트 코드가 실제로 수행되는 시스템을, 호스트 플랫폼은 크로스 컴파일러를 수행하는 시스템을 일컫는다. 예를 들어 펜티엄 컴퓨터 상에서 8051 C 컴파일러를 이용하여 8051용 오브젝트 코드를 생성하고 그 결과 코드를 롬에 담아서 8051에서 수행하였을 경우에, 펜티엄 컴퓨터는 호스트 플랫폼이 되는 것이고, 8051은 타겟 플랫폼이 된다. 여기에서 크로스(Cross-교차하다. 가로지르다. 즉, 플랫폼을 가로질러서 컴파일하다.)라는 말이 생긴 것이다. 따라서 호스트 플랫폼과 타겟 플랫폼이 같은 경우는 크로스라는 말이 붙지 않는다. 이 경우의 대표적인 예는 x86 호환 컴퓨터에서 Boland C 컴파일러를 이용해서 386EX(x86과 호환되는 임베디드용 프로세서)용 오브젝트 코드를 생성하는 경우이다.

 

4) AVR-GCC와 크로스 컴파일러

   앞에서 말했듯이 gcc는 뛰어난 이식성을 가지고 있다. 이러한 특징을 가능하게 하기 위해 gcc는 플랫폼에 의존적인 부분과 플랫폼에 비의존적인 부분으로 모듈화되어 있으며, 각 모듈은 서로 특정한 규칙으로 인터페이스되어 있다. 따라서 플랫폼에 의존적인 부분만 수정하고 다른 모듈과 인터페이스를 맞추어 주면 새로운 플랫폼을 지원하는 gcc를 제작할 수가 있다. 사실 AVR-GCC(이하 avr-gcc)도 그런 방식으로 만들어졌다.

gcc가 크로스 컴파일러로써 동작하기 위해서는 몇 개의 도움이 더 필요하다. 사실 gcc는 단지 C언어를 어셈블러로 변환하는 기능을 갖는다. 따라서 변환된 어셈블러를 오브젝트 코드로 변환 시켜주는 어셈블러(assembler) 그리고 여러 개의 오브젝트 코드를 하나로 오브젝트 코드로 병합하는 링커(linker)가 필요하다. 호스트 플랫폼과 타겟 플랫폼이 같은 경우는 어셈블러와 링커를 따로 제작할 필요가 없이 호스트 플랫폼의 것을 이용하면 된다(왜냐면 호스트 어셈블러와 링커가 생성하는 오브젝트 코드가 타겟과 호환되므로). 하지만 크로스 컴파일러의 경우 변환된 어셈블러를 타겟용 오브젝트 코드로 만들어줄 어셈블러와 링커가 필요하다(이를 각각 크로스 어셈블러와 크로스 링커라고 부른다).

GNU 프로젝트에도 어셈블러와 링커가 포함되어 있다. 그러나 그것들은 크로스 플랫폼용으로 이용되지 않았었다. 적어도 Cygnus 사에서 크포스 플랫폼 지원을 하기 전에는 말이다. Cygnus는 최근에(약 1~2년전) 임베디드 시스템용 솔루션을 개발하고 상품화하는 과정에서 GNU 툴인 gas(GNU assembler, as라고도 불린다), ld(linker) 등을 크로스 플랫폼용으로 이식하였다. 그렇게 해서 나온 것이 Binutils이다.

 

5) AVR-GCC를 위해서 필요한 것들

   총 세가지 패키지가 필요하다. 즉 Binutils, GCC(avr용 패치 필요), libc(avr용)이다. 요약하면 다음과 같다.

  • Binutils : cross assembler + cross linker + 여러 바이너리 파일 유틸리티(예:파일 포맷 변환기)
  • gcc : 기존의 gcc이 avr을 지원하도록 패치하여야 함
  • libc : gcc는 C 언어를 어셈블러로 변환하는 기능만을 가지므로 C에서 지원해야 할 기본적인 함수가 따로 필요하며 이를 libc라고 부른다. 심지어 덧셈(+)이나 곱셈 연산자(*)에 대한 실제 오브젝트 코드를 gcc는 가지고 있지 않으며 모두 libc가 제공한다.

   필수 사항은 아니지만 디버깅 툴인 gdb(GNU Debugger)도 AVR용도 포팅되어 있다.

 

6) AVR-GCC의 이점(학습상의 이점)

   gcc는 전세계의 해커들에 의해서 만들어졌기 때문에 매우 편리하며 강력한 옵션들을 제공한다(이는 해커들이 필요에 의해서 만들었기 때문이라 여겨진다). gcc 뿐만아니라 gas, ld 등의 툴들도 매우 훌륭한 개발 환경을 제공한다. GNU 툴을 배웠을 때의 장점은 일단 익혀두면 다른 환경에서도 적응이 쉽다는 것이다. 즉 GNU 툴이 제공하는 개발 방식들이 상당히 수준있는 것이어서 배우기는 힘들지만 일단 배워두면 다른 환경에 적응하는 밑거름이 된다. 또 해커들의 아이디어가 들어있어서 그런지 배울 만한 기법들도 많고 익혀두면 편리한 기능들이 많다. 이는 C 컴파일러의 옵션 개수만 봐도 알 수 있다. 또 gas의 경우 강력한 매크로 지원으로 다른 상용 어셈블러보다 훨씬 더 유연성을 갖추고 있다. 이 외에도 많은 이점이 있으며 차차 이용하면서 느끼기 바란다.

 Goto the Top

 

 

AVR-GCC on Windows - good development environment

 

1) 설치 방법 (for Win9x)

   avr-gcc의 windows 버전은  Volker Oth가 binutils + avr-gcc + libc를 모두 도스용으로 컴파일하여 패키지 형태로 배포하고 있으며, 직접 만든 예제 파일도 함께 배포하고 있다. 먼저 다음 세 파일을 다운로드한다.

  • avr-gcc for windows (윈도우즈용 avr-gcc 컴파일러 : binutils, avr-gcc, libc 포함)
  • install fix (avr-gcc for windows 설치파일의 버그 수정 파일)
  • gcctest (예제 파일들)

 

[1] avrgcc.zip를 적당한 디렉토리에 푼다. 예를 들어 c:\avrgcc라고 가정한다.

[2] instfix.zip 파일안에 포함되어 있는 install.exe와 install.ini를 c:\avrgcc에 덮에 씌운다. (이는 avrgcc.zip에 포함되어 있는 install.exe와 install.ini가 버그가 있기 때문이다)

[3] c:\avrgcc\install.exe를 수행한다. 도스창으로 실행하던가 아니면 탐색기에서 더블 클릭으로 수행해도 된다. 그러면 바탕 화면에 AVR-GCC.lnk가 생긴다. (도스 모양의 아이콘)

[4] gcctest.zip을 적당한 디렉토리에 푼다. 예를 들어 c:\avrgcc\gcctest

[5] 바탕 화면에 있는 AVR-GCC 아이콘을 더블 클릭한다. 그리고 다음 명령으로 예제 프로그램을 컴파일 해본다.

  • cd c:\avrgcc\gcctest\gcctest1
  • make

그러면, 컴파일되는 과정을 볼 수 있을 것이다. 설치 끝.

*주1) 원래는 install.ini가 영문윈도우에 맞추어져 있어서 install.ini를 손봐주어야 했지만, 최근에 install.ini가 업그레이드 된 관계로 위의 과정만 거쳐도 됩니다.

*주2) 압축 파일을 풀 경우에는 윈도우용을 이용하세요. 몇몇 압축 프로그램은 파일명이 8자를 넘어갈 경우 제대로 인식이 안되어서 설치가 안되더군요. Winzip은 잘 됩니다.

 

2) 설치 방법 (for WinNT)

   WinNT용 avr-gcc의 설치를 위해서는 먼저 Win9x용 avr-gcc의 설치 단계 [5]까지 똑같이 진행한다. 설치 과정을 자세히 관찰하여 보면 알겠지만 install.exe가 하는 역할은 c:\avr-gcc\run.bat라는 파일을 시스템에 맞게 설정해주고 이 run.bat를 이용해서 avr-gcc에서 필요로하는 변수를 설정해준다(AVR=c:/avrgcc, CC=avr-gcc, 그리고 PATH에 c:\avrgcc\bin을 추가). 그리고 난 다음에 c:\avrgcc\lib\src에 있는 libc(표준 C 함수), libm(수학함수), fplib(부동소수점 처리 함수)등을 컴파일하여 라이브러리를 구축한다. 따라서 WinNT에서 avrgcc를 이용하기 위해서는 path에 c:\avrgcc\bin을 추가하고 AVR 환경변수를 c:/avrgcc(즉, avr-gcc가 설치된 디레토리, '/'임을 주의 !), CC 환경 변수를 avr-gcc로 설정하면 된다. 따라서 c:\autoexec.bat 파일에 다음을 추가하던가 "내 컴퓨터"의 등록 정보에서 "환경 변수"를 세팅하면 된다.

  • set AVR=c:/avrgcc
  • set CC=avr-gcc
  • set PATH=c:\avrgcc\bin;%PATH%

 

3) 예제 파일에 대한 설명 (컴파일 옵션)

   gcctest.zip을 압축 풀고 나면 여러 가지 예제들을 볼 수 있을 것이다. STK200을 이용한 예제이지만 회로를 직접 꾸며서 실험해 볼 수도 있다. avr-gcc는 여러 가지 옵션들을 가지고 있어서 바로 컴파일 하기는 힘들고 make 유틸리티를 이용해야 한다. win32용 avr-gcc에는 기본적으로 make 유틸리티를 가지고 있으며, 예제 파일들을 보면 Volker Oth가 작성한 Makefile을 볼 수 있을 것이다. 앞의 설치 과정 [6]에서 make를 수행하면 다음 메시지를 볼 수 가 있다.

  avr-gcc -c -g -O3 -Wall -Wstrict-prototypes -Wa,-ahlms=gcctest1.lst -mmcu=at90s8515 -I. gcctest1.c -o gcctest1.o
  avr-gcc  gcctest1.o   -Wl,-Map=gcctest1.map,--cref -mmcu=at90s8515 -o gcctest1.elf
  avr-objcopy -O avrobj gcctest1.elf gcctest1.obj
  avr-objcopy -O srec gcctest1.elf gcctest1.rom
  avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" -O srec gcctest1.elf gcctest1.eep
  rm gcctest1.elf

  • 첫 번째 라인은 컴파일러를 호출하는 부분으로써 gcctest1.c을 컴파일하여 gcctest1.o 파일을 생성한다.

    "-c" : 오브젝트 파일을 생성하라. "-g" : 디버깅 정보를 포함하라.

    "Wall -Wstrict-prototypes" : 문법 체크를 철저하게 하라.

    "-Wa,-ahlms=gcctest1.lst" : -Wa는 뒤에 오는 옵션을 어셈블러에게 넘겨라. 즉, 어셈블리 언어로 번역한 결과를 gcctest1.lst라는 파일에 기록하라.

    "-I." : .(현재 디렉토리)에서 헤더파일을 찾아라. gcctest1.c : 소스 파일. -o gcctest1.o : 컴파일 결과 오브젝트 파일을 gcctest1.o에 기록하라.

  • 두 번째 라인은 링커를 호출하는 부분으로써 gcctest1.o는 런 타임 모듈(runtime module : startup code와 기타 C 표준 라이브러리)과 링크되어서 gcctest1.elf가 생성된다.
  • "-Wl,-Map=gcctest1.map" : -Wl은 뒤에 오는 옵션을 링커에게 넘겨라. 즉 링크한 결과를 gcctest1.map 파일에 기록하라고 알린다. 이는 링크된 라이브러리들이 몇 번지에 위치하는지를 알 수 있게한다.

  • 세 번째 라인은 gcctest1.obj를 만드는 부분입니다. 이 파일은 AvrStudio에서 디버깅을 할 때 불러들입니다.(아직 기능 미흡)
  • 나머지 두 라인은 ROM 파일(gcctest1.rom)과 EEPROM 파일(gcctest1.eep)을 Motorola s-record 포맷으로 생성하는 부분입니다.(Intel hex 포맷도 생성 가능)

 

4) Makefile 직접 만들기

   gcctest 중의 한 디렉토리에서 Makefile을 복사하여 수정함으로써 직접 Makefile을 만들 수 있다.

  • MCU : 타겟이 되는 MCU의 이름 (at90s8515, at90s8535, atiny22, atmega103 등)
  • TRG : 프로젝트 이름, 이는 main() 함수를 포함하는 파일에서 확장자를 뺀 것이어야 한다.
  • SRC : 소스 파일들을 적는다. 소스 파일이 여러 개일 경우 모두 적어 준다.
  • LIB : 전에 컴파일한 오브젝트 파일이나 라이브러리를 이용하였을 경우 여기에 적어준다.
  • FORMAT : 출력 ROM 파일 포맷을 정의 (Motorola S-record : srec, Intel Hex : ihex). 꼭 include $(AVR)/include/make1 다음에 위치하여야 한다.
  • 만일 여러 개의 소스 파일이 존재할 경우는 다음을 추가로 적어 주어야 한다. 꼭 include $(AVR)/include/make2 다음에 위치하여야 한다. 이는 소스파일의 연관 관계를 적어주는 부분이다. 예를 들어 ex1.c라는 파일이 추가로 컴파일되어야 한다면 그리고 ex1.h가 수정될 때 컴파일을 다시 할 필요가 있다면 다음 라인을 추가한다. 이는 dependency라고 부른다.
  • ex1.o : ex1.h

 

5) 참고 자료

   기타 정보에 관심이 있다면 다음의 관련 링크를 참고하기 바란다.

 

6) gcrt.s 다시 컴파일 하기

 Goto the Top  

 

AVR-GCC on Linux - best development environment

 

  필자가 처음 Micro Tools for Linux라는 사이트에 들어간 것은 1999년 10월 쯤으로 기억하고 있다. 이 사이트는 Linux용 avr-gcc에 필요한 자료를 모아둔 곳이다. 나중에 꼭 들어가보기 바란다. 그 당시에도 어느 정도 avr-gcc의 진척이 있었던 걸로 봐서는 avr-gcc 프로젝트가 1999년 초부터 진행되지 않았나 싶다. 그리고 2000년 3월 쯤에는 avr-gcc가 gcc의 정식 버전에 함께 포함되었고 avr-binutils가 binutils에 정식으로 포함되었다. 따라서 이들은 gcc와 binutils를 다운로드 받음으로써 구할 수 있다(전에는 다운로드 후에 패치파일을 이용하여 수정하여야 했다). 하지만 gcc와 binutils의 마지막 정식 official 버전 후에 포함된 것이라서 정식 official 버전은 없고 snapshot(개발 버전) 형태로 구할 수 있다. snapshot 버전은 개발 버전이라서 버그를 포함할 가능성이 있다(하지만 매우 빠르게 수정이 이루어지고 있다). 정식 official 버전은 snapshot 버전에서 충분히 테스트된 후에 발표 된다. 필자의 경험으로는 snapshot 버전에서 큰 문제점을 발견하지 못했다. 정식 official 버전으로 발표된 avr-gcc가 참으로 기대된다.

리눅스용 avr-gcc를 설치하기 위해서는 총 다음 3가지 패키지를 컴파일 및 인스톨 하여야 한다.

  • binutils  : 2000/05/18 snapshot (개발 버전)
  • egcs     : 2000/04/17 snapshot (개발 버전)
  • avr-libc : 2000/05/14 snapshot (개발 버전)

 또, 이 패키지들의 지금도 계속 업그레이드가 이루어지고 있으며, 위에 보인 버전들은 필자가 컴파일에 성공한 버전들이다. 필자가 컴파일한 리눅스 버전은 알짜 리눅스 6.1 (FTP 버전)과 앨릭스 리눅스 6.2 베타(현 아델리눅스) 이다. 최근 버전은 Cygnus 사, GCC 홈페이지 등에서 구할 수 있다. 필자의 경험상 가장 최근 버전은 거의 컴파일에 성공하기 어렵다. 위의 패키지를 설치하는 순서를 꼭 유의하기 바란다.

 

1) binutils의 설치

    # tar zxvf binutils-000518.tar.gz

    # cd binutils-000518

    # ./configure --target=avr

    # make

    # make install

 

2) egcs(gcc)의 설치

    # tar zxvf egcs-core-20000417.tar.gz

    # cd egcs-20000417

    # ./configure --target=avr

    # make

    # make install

 

3) avr-libc의 설치

    # tar zxvf avr-lib-20000514.tar.gz

    # cd avr-lib-20000514

    # make

    # make install

 

4) avr-gdb의 소개

   GNU 프로젝트 중의 하나인 gdb(GNU Debugger)의 AVR 버전이다. 본래 gdb는 시뮬레이터처럼 동작하지만 avr-gdb는 AVR 시뮬레이터가 없기 때문에 AVR과 SPI 인터페이스를 이용해서 런타임으로 디버깅이 가능하도록한다. 즉 gdb의 remote debugging 기능을 이용해서 구현되었다. 자세한 내용은 다음을 참고하기 바란다. 현재 avr-gdb는 dummy parallel programmer와 STK200 만을 지원한다.

 Goto the Top  

상호 : (주) 로보블럭 사업자등록번호:214-86-56219 통신판매업신고19-2544 대표: 신대섭 전화:(02)2679-8556 Fax :(02)2679-8557
본사 : 경기도 부천시 원미구 약대동 부천 테크노파크 401동 502호     서울사무소 : 서울시 영등포구 문래동 4가 8-1 4층
Copyright(C) 2004, (주) 로보블럭 시스템즈 All Rights Reserved E-Mail : WebMaster