AVR & ATmega

AVR-GCC 정리

EP 기술연구소 2019. 11. 28. 13:56

 상 수 (추가 : 2010. 4. 5, 수정 : 2010. 5. 4)

  RAMEND : 칩에 존재하는 RAM의 마지막 주소 (byte 주소)

  XRAMEND : 지정 가능한 램의 마지막 주소 (외부램의 없다면 RAMEND와 동일)

  E2END : EEPROM의 마지막 주소

  FLASHEND : flash memory 끝 주소 (byte 주소)

  SPM_PAGESIZE : flash memory page size (byte 단위)

  E2PAGESIZE : EEPROM의 페이지 크기

  SIGNATURE_0 : device signature (byte 0)

  SIGNATURE_1 : device signature (byte 1)

  SIGNATURE_2 : device signature (byte 2)

 

  FUSE_MEMORY_SIZE : FuseBit bytes의 크기 (fusebit bytes는 low, high, extended로 구성)

 

  F_CPU : 사용자가 제공하는 CPU 클럭 정보

 

 * SIGRD가 정의되어 있지 않다는 컴파일러 에러가 발생하는 버그가 존재하므로

  #ifndef SIGRD

  #define SIGRD  5

  #endif

  위의 코드를 추가하여 컴파일.

 

 

 매크로(추가 : 2010. 4. 5,  수정 : 2011, 11. 17)

  _BV() : bit value    특정 비트 플래그의 값을 검사하기 위한 비트마스크를 만드는 매크로

  예) 1 << TXC   =====>   _BV(TXC)

        while( !(UCSRA & (1<<TXC) );        ====>    while( !(UCSRA & _BV(TXC) );

  sei() : 전역 인터럽트 활성화, 어셈블리 명령어 sei와 동일함.

  cli() : 전역 인터럽트 비활성화, 어셈블리 명령어 cli와 동일함.

  bit_is_set(sfr, bit) : sfr레지스터의 bit가 set이면 참(0이아닌 값).

  bit_is_clear(sfr, bit) : sfr레지스터의 bit가 clear면 참(0이아닌 값).

  loop_until_bit_is_set(sfr, bit) : sfr레지스터의 bit가 set 될 때까지 대기. (while 루프)

  loop_until_bit_is_clear(sfr, bit) : sfr레지스터의 bit가 clear 될 때까지 대기. (while 루프)

 

 헤더파일

  avr/io.h : device에 관련된 기본적인 정의 (추가 : 2010. 4. 23)

  컴파일러 옵션 '-mmc='으로 전달된 avr에 대한 적절한 입출력 관련된 정의들을 불러들인다.

  <avr/ioXXXX.h>를 include함으로써 이 작업을 수행한다. 모든 AVR에 공통적인 레지스터는

  <avr/common.h>에 정의 되어 있고, avr/io.h에서 읽어들인다.

  읽어들이는 헤더파일

  <avr/sfr_defs.h>

  <avr/portpins.h>

  <avr/common.h>

  <avr/version.h>

 

  avr/boot.h : 부트로더 지원 (추가 : 2010. 4. 16)

  부트로더에서 제공하는 기능들에 대한 C 언어 지원 매크로, 함수, 상수

  전역 인터럽트는 자동으로 disable 되지 않고 프로그래머가 결정하도록 한다.

  페이지 기록하는 예제 코드도 포함되어 있다.

 

  avr/pgmspace.h : flash memory에 접근 기능 제공 (추가 : 2010. 4. 16)

  장치의 플래시 메모리 영역에 저장된 데이터에 접근하기 위한 인터페이스를 제공한다.

  대상 장치는 LPM이나 ELPM 명령을 지원해야 한다. 

  IAR C의 헤더파일과의 호환성을 위해 제공되지만 100% 호환되지는 않는다.

  ram에 기초한 문자열을 다루는 경우에는 avr_string에서 설명하는 표준 문자열 함수를 사용.

 

  inttypes.h : 정확한 길이의 정수형 타입 정의 (추가 : 2010. 4. 16)

  그 길이를 정확하게 사용할 필요가 있는 정수형 데이터를 정의하는 stdint.h를 확장한다.

  "far" 포인터(64kbytes 초과하는 주소를 위한), printf/scanf에 사용하는 formatting options


 

  avr/interrupt.h : 인터럽트 서비스 루틴 작성에 필요한 매크로 지원(추가 : 2010. 5. 4)

  C언어는 하드웨어에 종속적이지 않은 추상화된 언어이기 때문에 하드웨어에 따라서 달라지

  는 인터럽트 서비스 루틴을 직접 지원할 수가 없다. 따라서, AVR 컴파일러에 따라서 인터럽트

  지원 방법을 나름대로의 방식으로 구현한다. avr-gcc에서는 인터럽트 벡터 테이블이 미리

  정의된 특정 이름을 가지고 있다.

 

  util/setbaud.h : 보오레이트 계산에 필요한 매크로 지원(추가 : 2010. 5. 11)

  F_CPU(시스템 클럭), BAUD_TOL(허용 오차율%, 기본값은 2%), BAUD(보오레이트)의 3개의

  상수를 제공 받아서 UBRRH_VALUE, UBRRL_VALUE, USE_2X(2배속 사용여부)를 전처리기에

  서 계산해서 상수로 쓸 수 있도록 한다.

 

 

 #undef BAUD      // 이전에 BAUD를 define 했다면 컴파일러 오류를 피한다.
 #define BAUD 38400
 #include <util/setbaud.h>
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
 #if USE_2X
   UCSRA |= _BV(U2X);
 #else
   UCSRA &= ~_BV(U2X);
 #endif

 

  avr/eeprom.h : EEPROM에 읽기/쓰기 위한 지원 매크로 및 함수 지원(추가 : 2010. 5. 13)

  EEPROM이 사용 가능한가를 알아보는 eeprom_is_ready()와 사용 가능할 때까지를 기다리는

  eeprom_busy_wait()를 제공하고, EEPROM에 읽고, 쓰는 eeprom_read_XXX, eeprom_write_XX

  제공. 단, 모든 함수는 폴링을 위한 인터페이스로서 인터럽트 기반 처리를 위해서는 스스로

  구현해야 한다.


  stdio.h :  C언어의 표준 입출력 함수를 제공 (추가 : 2010. 5. 14)

  AVR과 MCU는 제한된 기능으로 인해서 모든 표준 IO 인터페이스가 구현될 수가 없다.

  printf와 scanf를 AVR의 특정 IO로 연결 시키고 싶다면 입출력 함수를 작성해서 이 함수를

  fdev_setup_stream()을 이용해서 stream을 생성/등록하고 이것을 stdin, stdout, stderr과

  연결하면 된다.



출처: https://electronicsdo.tistory.com/entry/팁-AVRGCC-조금-더-잘-사용하기-위한-정리 [도닦는공돌이]

'AVR & ATmega' 카테고리의 다른 글

Atmegaxx Micom Interrupt 처리에 따른 주의사항.  (0) 2016.07.25
Tach Driver IC(ADC7843) Driver Source File  (0) 2016.07.12
Atmega32  (0) 2015.02.18
AVR 시리즈의 Fuse 비트 설정  (0) 2015.02.07
AVR Studio Download  (0) 2015.01.29