2010.7.13_AVR_Compriler

Download Report

Transcript 2010.7.13_AVR_Compriler

Differences of AVR Compiler
2010. 7. 13
조 승훈
1
Index
 Introduction
 Differences of AVR Compiler
 Fuse Bit
2
Intro
 컴파일러의 정의
– 특정 프로그래밍 언어로 쓰여 있는 문서를 언어로 옮기는 프로그
램
 인터프리터의 정의
– 소스 프로그램을 읽어서 즉시 결과를 출력하는 프로그램
 컴파일러가 지켜야 할 원칙
– 컴파일러는 옮김의 과정에서 프로그램의 뜻을 보존하여야 함
– 입력으로 들어온 프로그램을 어떤 면에서든지 개선해야 함
3
Intro
 컴파일러의 분류
 목적코드의 동작에 대한 분류
– 네이티브 컴파일러
• 컴파일러가 실행되는 환경이 목적코드를 실행하는 환경과 같은 경우
– 크로스 컴파일러
• 컴파일러가 실행되는 환경이 목적코드를 실행하는 환경과 다른 경우
– 바이트코드 컴파일러
• 가상 머신에서 동작할 프로그램을 만드는 컴파일러
4
Intro
 컴파일러의 분류 (cont’)
 내부 구조에 따른 분류
– 일단 구조
• 소스를 한 번 읽고 번역하여 바로 결과물을 내는 컴파일러
– 다단 구조
• 여러 가지 목적을 위해 중간 결과물을 만들고 그것으로 다시 최종 결과물을
만드는 컴파일러
• 중간 결과를 만드는 이유
– 다양한 입력 언어를 동일한 중간 표현으로 표현하거나, 동일한 중간 표현을 여러
가지 출력 언어로 표현하면 다양한 입력 언어와 출력 언어를 지원하는 컴파일러를
작성 가능
– 고수준 언어일 수록 중간형태를 거치는 것이, 프로그램을 최적화한 다음 최종적으
로 출력물을 내놓는 데 유리
– 가상 머신은 플랫폼의 기계어에 비해 속도가 느릴 수밖에 없으므로, 실행 직전에
현재 플랫폼의 기계어로 다시 한 번 컴파일되어 속도를 향상
5
Intro
 AVR 컴파일러의 종류
– IAR : IAR Embedded Workbench for AVR
• 장점
– GCC 만큼이나 넓은 저변 , 가장 안정된 성능과 막강한 호환성
– 대부분의 마이크로프로세서 지원
– C_spy를 통한 시뮬레이션과 디버깅 가능
• 단점
– 다른 컴파일러에 비해 비싼 가격
– 익히기 어려움
6
Intro
 AVR 컴파일러의 종류
– GCC : GNU C Complier for AVR
• 장점
– 가장 널리 사용되는 컴파일러
– 무료로 공개
– WinAVR, AVR STUDIO 등의 IDE가 사용
• 단점
– 치명적인 오류가 있어도 보상을 받을 수 없음
7
Intro
 AVR 컴파일러의 종류
– Code Vision AVR : Code Vision AVR C Compiler
• 장점
–
–
–
–
코드위저드 기능
Chip에 대한 접근이 용이
효율적인 기계어코드 생성
가격이 비용이 저렴
• 단점
– ANSI C와 충돌을 일으킬 수 있음
– 각종 매크로와 헤더 등이 제약을 줄 때가 있음
8
Intro
 AVR 컴파일러의 종류
– ICC : ICC C Compiler
• 장점
– 심플한 유저인터페이스
– 코드 위자드 기능
– 배우기 쉬움
• 단점
– 저변이 넓지 못함
9
비트 표현
컴파일러
비트표현
bit a,b,c; // 비트변수 선언
PORTA.0=0; // 출력
PORTA.0=1;
코드비전
a=PORTA.0; // 입력
b=PORTA.1;
PORTA.0= ~PORTA.0; //토글
if(PORTB.0)PORTA.0=0;
if(!PORTB.0)PORTA.0=1;
비트 변수 선언 지원 안함
비트 변수는 사용자가 구조체로 선언해야 함
AVR EDIT & AVRSTUDIO
ICC
IAR
// bit 매크로
#define SetBit(x,y) (x|=(1<<y))
#define ClrBit(x,y) (x&=~(1<<y))
#define ToggleBit(x,y) (x^=(1<<y))
#define FlipBit(x,y) (x^=(1<<y)) // Same as
ToggleBit.
#define TestBit(x,y) (x&(1<<y))
위와 같은 비트 매크로를 이용
포트 비트 조작 지원 안함
PORTA&=0xFE; // 0 출력
PORTA|=0x01; // 1 출력
if(PORTB&0x01) PORTA&=0xFE;
if(!(PORTB&0x01)) PORTA|=0x01;
10
헤더 파일 / 인터럽트 허가/금지 / volatile
컴파일러
128 헤더 파일
코드 비전
#include <mega128.h>
AVR EDIT & AVRSTUDIO
#include <avr/io.h>
ICC
#include <iom128v.h>
IAR
#include<iom128.h>
#include <ina90.h>
컴파일러
인터럽트 허가/금지
#asm("sei")
#asm("cli")
코드 비전
AVR EDIT & AVRSTUDIO
sei();
cli();
ICC
SEI();
CLI();
IAR
SEI();
CLI();
컴파일러
코드비전
AVR EDIT & AVRSTUDIO
ICC
IAR
volatile
사용 안 함
전역 변수는 모두 volitile형으로 선언하는 것이 편리
예) volatile unsigned char i = 0;
11
메인 함수 / FLASH
컴파일러
코드 비전
AVR EDIT & AVRSTUDIO
메인 함수
void main(void){}
int main(void){}
ICC
void main(void){}
IAR
void main(void){}
컴파일러
FLASH
코드 비전
flash table[] = { 1, 2, 3 };
c= table[x];
i= table[x];
AVR EDIT & AVRSTUDIO
flash table[] = { 1, 2, 3 };
c= table[x];
i= table[x];
ICC
IAR
__flash int table[] = { 1, 2, 3 };
__flash char hello[] = "Hello World";
__flash char *ptr1;
char * __flash ptr2;
__flash char * __flash ptr3;
__flash char
__flash char
__flash char
char __flash
str[] = {"abcdefg"};
str1[]={"12345"};
str2[]={"23456"};
* __flash *strP;
flash fdata[][100]={{0x02,0xf0,.......},{0x00,....}};
char flash *p ;
p = &fdata[0][0];
12
내부 EEPROM
컴파일러
코드 비전
내부 EEPROM
eeprom int foo = 0x1234;
eeprom char table[] = { 0, 1, 2, 3, 4, 5 };
int i=3;
foo=i;
i-foo;
eeprom_write_dword((uint32_t*)0, i);
i= eeprom_read_dword((uint32_t*)0);
AVR EDIT & AVRSTUDIO
eeprom_write_byte((uint8_t*)EE_ADD, c);
c= eeprom_read_byte((uint8_t*)EE_ADD);
eeprom_write_dword((uint32_t*)EE_ADD, L);
L= eeprom_read_dword((uint32_t*)EE_ADD);
//Initializing EEPROM
#pragma data:eeprom
int foo = 0x1234;
char table[] = { 0, 1, 2, 3, 4, 5 };
#pragma data:data
ICC
IAR
//Accessing EEPROM
int i;
EEPROM_READ(0x1, i); // read 2 bytes into i
int i;
EEPROM_WRITE(0x1, i); // write 2 bytes to 0x1
EEPROMWriteBytes(int location, void *ptr, int size)
EEPROMReadBytes(int location, void *ptr, int size)
__eeprom int i;
int temp;
i=23;
//write 23 to EEPROM
temp=i;
//read from EEPROM into temp
13
코드비전 인터럽트
컴파일러
인터럽트
interrupt
interrupt
interrupt
interrupt
interrupt
interrupt
interrupt
interrupt
[EXT_INT0]
[EXT_INT1]
[EXT_INT2]
[EXT_INT3]
[EXT_INT4]
[EXT_INT5]
[EXT_INT6]
[EXT_INT7]
void
void
void
void
void
void
void
void
ext_int0_isr(void){}
ext_int1_isr(void){}
ext_int2_isr(void){}
ext_int3_isr(void){}
ext_int4_isr(void){}
ext_int5_isr(void){}
ext_int6_isr(void){}
ext_int7_isr(void){}
interrupt [TIM0_OVF] void timer0_ovf_isr(void){}
interrupt [TIM0_COMP] void
timer0_comp_isr(void){ }
코드비전
interrupt [TIM1_OVF] void timer1_ovf_isr(void){}
interrupt [TIM1_CAPT] void timer1_capt_isr(void){
}
interrupt [TIM1_COMPA] void
timer1_compa_isr(void){ }
interrupt [TIM1_COMPB] void
timer1_compb_isr(void){ }
interrupt [TIM1_COMPC] void
timer1_compc_isr(void){ }
interrupt [TIM2_OVF] void timer2_ovf_isr(void){}
interrupt [TIM2_COMP] void
timer2_comp_isr(void){ }
14
코드비전 인터럽트2
컴파일러
인터럽트
interrupt [TIM3_OVF] void timer3_ovf_isr(void){}
interrupt [TIM3_CAPT] void timer3_capt_isr(void){
}
interrupt [TIM3_COMPA] void
timer3_compa_isr(void){ }
interrupt [TIM3_COMPB] void
timer3_compb_isr(void){ }
interrupt [TIM3_COMPC] void
timer3_compc_isr(void){ }
코드비전
interrupt [USART0_RXC] void usart0_rx_isr(void){}
interrupt [USART0_DRE] void
usart0_dre_isr(void){}
interrupt [USART0_TXC] void usart0_tx_isr(void){}
interrupt [USART1_RXC] void usart1_rx_isr(void){}
interrupt [USART1_DRE] void
usart1_dre_isr(void){}
i nterrupt [USART1_TXC] void usart1_tx_isr(void){}
interrupt
interrupt
interrupt
interrupt
interrupt
interrupt
[ADC_INT] void adc_isr(void){}
[ANA_COMP] void ana_comp_isr(void){}
[EE_RDY] void ee_rdy_isr(void){}
[SPI_STC] void spi_isr(void){}
[TWI] void twi_isr(void){}
[SPM_RDY] void spm_rdy_isr(void){}
15
컴파일러
인터럽트
ISR(INT0_vect){}
ISR(INT1_vect){}
ISR(INT2_vect){}
ISR(INT3_vect){}
ISR(INT4_vect){}
ISR(INT5_vect){}
ISR(INT6_vect){}
ISR(INT7_vect){}
ISR(TIMER0_OVF_vect){}
ISR(TIMER0_COMP_vect){}
ISR(TIMER1_OVF_vect){}
ISR(TIMER1_CAPT_vect){}
ISR(TIMER1_COMPA_vect){}
ISR(TIMER1_COMPB_vect){}
ISR(TIMER1_COMPC_vect){}
AVR EDIT & AVRSTUDIO
#include <avr/interrupt.h>
ISR(TIMER2_OVF_vect){}
ISR(TIMER2_COMP_vect){}
ISR(TIMER3_OVF_vect){}
ISR(TIMER3_CAPT_vect){}
ISR(TIMER3_COMPA_vect){}
ISR(TIMER3_COMPB_vect){}
ISR(TIMER3_COMPC_vect){}
ISR(USART0_RX_vect){}
ISR(USART0_UDRE_vect){}
ISR(USART0_TX_vect){}
ISR(USART1_RX_vect){}
ISR(USART1_UDRE_vect){}
ISR(USART1_TX_vect){}
ISR(ADC_vect){}
ISR(ANALOG_COMP_vect){}
ISR(EE_READY_vect){}
ISR(SPI_STC_vect){}
ISR(TWI_vect){}
ISR(SPM_READY_vect){}
A
V
R
E
D
I
T
&
A
V
R
S
T
U
D
I
O
인
터
럽
트
16
컴파일러
ICC
인터럽트
#pragma interrupt_handler ext_int0_isr: iv_INT0
void ext_int0_isr(void){ }
#pragma interrupt_handler ext_int1_isr: iv_INT1
void ext_int1_isr(void){ }
#pragma interrupt_handler ext_int2_isr: iv_INT2
void ext_int2_isr(void){ }
#pragma interrupt_handler ext_int3_isr: iv_INT3
void ext_int3_isr(void){ }
#pragma interrupt_handler ext_int4_isr: iv_INT4
void ext_int4_isr(void){ }
#pragma interrupt_handler ext_int5_isr: iv_INT5
void ext_int5_isr(void){ }
#pragma interrupt_handler ext_int6_isr: iv_INT6
void ext_int6_isr(void){ }
#pragma interrupt_handler ext_int7_isr: iv_INT7
void ext_int7_isr(void){ }
#pragma interrupt_handler timer0_ovf_isr:
iv_TIMER0_OVF
void timer0_ovf_isr(void){ }
#pragma interrupt_handler
timer0_comp_isr: iv_TIMER0_COMP
void timer0_comp_isr(void){ }
I
C
C
인
터
럽
트
#pragma interrupt_handler timer1_ovf_isr:
iv_TIMER1_OVF
void timer1_ovf_isr(void){ }
#pragma interrupt_handler timer1_capt_isr:
iv_TIMER1_CAPT
void timer1_capt_isr(void){ }
#pragma interrupt_handler timer1_compa_isr:
iv_TIMER1_COMPA
void timer1_compa_isr(void){ }
#pragma interrupt_handler timer1_compb_isr:
iv_TIMER1_COMPB
void timer1_compb_isr(void){ }
#pragma interrupt_handler
timer1_compc_isr: iv_TIMER1_COMPC
void timer1_compc_isr(void){ }
17
컴파일러
인터럽트
#pragma interrupt_handler timer2_ovf_isr:
iv_TIMER2_OVF
void timer2_ovf_isr(void){ }
#pragma interrupt_handler timer2_comp_isr:
iv_TIMER2_COMP
void timer2_comp_isr(void){ }
ICC
#pragma interrupt_handler timer3_ovf_isr:
iv_TIMER3_OVF
void timer3_ovf_isr(void){ }
#pragma interrupt_handler timer3_capt_isr:
iv_TIMER3_CAPT
void timer3_capt_isr(void){ }
#pragma interrupt_handler
timer3_compa_isr: iv_TIMER3_COMPA
void timer3_compa_isr(void){ }
#pragma interrupt_handler timer3_compb_isr:
iv_TIMER3_COMPB
void timer3_compb_isr(void){ }
#pragma interrupt_handler timer3_compc_isr:
iv_TIMER3_COMPC
void timer3_compc_isr(void){ }
I
C
C
인
터
럽
트
2
#pragma interrupt_handler usart0_rx_isr:
iv_USART0_RX
void usart0_rx_isr(void){ }
#pragma interrupt_handler usart0_dre_isr:
iv_USART0_DRE
void usart0_dre_isr(void){ }
#pragma interrupt_handler usart0_tx_isr:
iv_USART0_TX
void usart0_tx_isr(void){ }
18
컴파일러
인터럽트
#pragma interrupt_handler usart1_rx_isr:
iv_USART1_RX
void usart1_rx_isr(void){ }
#pragma interrupt_handler usart1_dre_isr:
iv_USART1_DRE
void usart1_dre_isr(void){ }
#pragma interrupt_handler usart1_tx_isr:
iv_USART1_TX
void usart1_tx_isr(void){ }
ICC
#pragma interrupt_handler
void adc_isr(void){ }
#pragma interrupt_handler
iv_ANA_COMP
void ana_comp_isr(void){ }
#pragma interrupt_handler
void ee_rdy_isr(void){ }
#pragma interrupt_handler
void spi_isr(void){ }
#pragma interrupt_handler
void twi_isr(void){ }
#pragma interrupt_handler
iv_SPM_RDY
void spm_rdy_isr(void){ }
adc_isr: iv_ADC
I
C
C
인
터
럽
트
3
ana_comp_isr:
ee_rdy_isr: iv_EE_RDY
spi_isr: iv_SPI_STC
twi_isr: iv_TWSI
spm_rdy_isr:
IAR 인터럽트
컴파일러
IAR
인터럽트
#pragma pack=INT0_vect
__interrupt void INT0_interrupt(void){ }
나머지 인터럽트 함수는 다른 컴파일러 참고
19
Fuse Bit
 Fuse Bit란
– 칩의 기본 동작에 대한 설정을 하는 것
– Power Off되더라도 남아있음
 Fuse Bit가 하는 일
– 클락 소스 결정 (외부 xtal, 내부 오실레이터, 외부 TTL오실레이
터 등)
– 클락 Speed 결정
– Brown Out 기능 설정
– 내부 EEPROM 보호 기능 사용
– ETC
20
Fuse Bit
 Fuse Bit 개별적 설명
– ATmega103 Compatibility Model[M103C=]
• 디폴트로 체크되어 있음
• Atmega128을 사용 할 때는 체크 해제
– Watchdog Timer always on; [WDTON=0}
• 워치독 타이머를 하드웨어적으로 ON 시킴
– On-Chip Debug Enabled; [OCNED=0]
• JTAG를 사용한 Debug를 Enable 시킴
– JTAG Interface Enabled; [JTAGEN=0]
• JTAG를 이용해 Debug나 Writing 할 때 체크
• JTAG ICE를 사용하지 않는다면 체크 해제
21
Fuse Bit
 Fuse Bit 개별적 설명
– Serial program downloading (SPI) enabled; [SPIEN=0]
• ISP 기능을 사용 할 때 체크
• 디폴트로 체크되어 있음
– Preserve EEPROM memory through the Chip Erase cycle;
[EESAVE=0]
• Device의 메모리를 Erase 할 때 EEPROM을 지우지 않음
– Boot Flash section size=512 words Boot start
address=$FE00; [BOOTSZ=11]
• Self-Programming 시, 부트로더 영역 지정
• Self-Programming을 사용하지 않으면 Boot Flash Section의 크기는 어느
것이든 상관 없음
22
Fuse Bit
 Fuse Bit 개별적 설명
– Boot Reset vector Enabled (default address=$0000);
[BOOTRST=0]
• Self-Programming 시, 체크
– Brown-out detection level an VCC=4.0V; [BODLEVEL=0]
– Brown-out detection level an VCC=2.7V; [BODLEVEL=1]
default value
– Brown-out detection enabled; [BODEN=0]
• Brown-out detection 기능을 사용 할 때 체크
• Brown-out detection 기능은 VCC가 위에 설정된 레벨 이하로 떨어질 경우
시스템적으로 reset 시키는 기능
• Brown-out detection enabled를 체크하지 않으면 레벨은 상관 없음
23
Fuse Bit
 Fuse Bit 개별적 설명
– CKOPT fuse(operation dependent of CKSEL fuses);
[CKOPT=0]
• Clock의 Swing 레벨을 Small에서 Full Swing하게 함
• Ext. Crystal/Resonator를 사용 할 때 8Mhz보다 클 경우 반드시 체크
• XTAL2로 다른 디바이스에 Clock을 주고자 할 때도 사용
– Ext. Clock; Start-up time: 6 CK + 0 ms; [CKSEL=0000
SUT=00]
• XTAL1 핀으로 외부에서 Clock을 공급 받을 때 체크
• Oscillator를 사용 할 때 체크
• XTAL/Resonator 사용 시, 체크하게 되면 ISP 기능 사용 불능
– Oscillator를 연결하거나, 펑션 제네레이터로 XTAL1에 클럭을 공급해서 해결
24
Fuse Bit
 Fuse Bit 개별적 설명
– Int. RC Osc. 1 MHz; Start-up
[CKSEL=0001 SUT=00]
– Int. RC Osc. 2 MHz; Start-up
[CKSEL=0010 SUT=00]
– Int. RC Osc. 4 MHz; Start-up
[CKSEL=0011 SUT=00]
– Int. RC Osc. 8 MHz; Start-up
[CKSEL=0100 SUT=00]
time: 6 CK + 0 ms;
time: 6 CK + 0 ms;
time: 6 CK + 0 ms;
time: 6 CK + 0 ms;
• 내부 RC 발진기를 사용 할 때 체크
• 1~8Mhz까지 선택 가능
• 2,4,8Mhz의 경우 외부 롬라이터에서 Calibration Byte를 읽어 OSCCAL 레
지스터에 써야 함
25
Fuse Bit
 Fuse Bit 개별적 설명
– Ext. RC Osc. -0.9 MHz; Start-up time: 18CK + 0 ms;
[CKSEL=0101 SUT=00]
– Ext. RC Osc. 0.9 MHz-3.0 MHz; Start-up time: 18CK + 0
ms; [CKSEL=0110 SUT=00]
– Ext. RC Osc. 3.0 MHz-8.0 MHz; Start-up time: 18CK + 0
ms; [CKSEL=0111 SUT=00]
– Ext. RC Osc. 8.0 MHz-12.0 MHz; Start-up time: 18CK + 0
ms; [CKSEL=1000 SUT=00]
• 외부 RX 발진기를 사용 할 때 체크
– Ext. Low-Freq. Crystal; Start-up tie : 1K CK + 4 ms;
[CKSEL= 1001 SUT=00]
• 32,768Khz의 시계 클럭을 사용 할 시 체크
26
Fuse Bit
 Fuse Bit 개별적 설명
– Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK +
4 ms; [CKSEL= 1010 SUT=00]
• 외부 Crystal이나 Resonator를 사용 할 때 체크
• Clock Freq = 9 ~ 16Mhz
 참고
– Start-Up Time
• 시스템이 reset 되었을 때, 다시 on 되기까지의 리셋 딜레이
• 각 클럭 옵션마다 SUT 값이 다름
– PonyProg2000같은 프로그램에선 Clock 옵션에 대한 부분이 언
급이 없으므로 Datasheet의 System Clock & Clock Option 부
분 참고
27
28