C 소스를 가지고 윈도우에 설치된 체인툴을 가지고 크로스 컴파일을 해보려고 시도했다.
소스에 가장 먼저 #define 되어야 하는 부분은 AVR 타입에 대한 정보이다. 만약 이 부분을 넣지 않으면 warning과 함께 컴파일이 되지 않는다. avr/include/avr 디렉토리의 io.h 파일에 정의되어 있다.
….
#elif defined (__AVR_ATmega328P__)
# include <avr/iom328p.h
….
# if !defined(__COMPILING_AVR_LIBC__)
# warning "device type not defined"
# endif
#endi
… |
아두이노 우노(arduino uno) 라면 ATmega328 프로세스를 사용하고 있으므로, 다음과 같이 정의해야 한다.
#define __AVR_ATmega328P__
또는 avr-gcc 실행시 –mmcpu 파라미터값에 atmega328p를 추가해야 한다.
아주 간단한 소스를 컴파일하고 업로드하는 것을 해본다.
<test.c>
#define __AVR_ATmega328P__
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
int main() {
// 셋업
DDRB = 0xFF;
while (1) {
PORTB = 0xFF;
_delay_loop_2(1000;
PORTB = 0x00;
_delay_loop_2(1000);
}
} |
avr 칩에서 동작하는 바이너리 파일을 만든다.
> avr-gcc -O test.c -o test.bin
.text와 .data 파일이 포함하는 .hex 파일을 만든다.
>avr-objcopy -j .text -j .data -O ihex test.bin test.hex
.hex 파일을 가지고 아두이노 uno에 업로드를 하면 된다. [속도(b옵션) : 115200, 보드이름(p옵션) arduino 가 반드시 맞아야 한다.] 보드이름에 대한 자세한 정보는 avrdude.conf에 기록 되어 있음
>avrdude -P com3 -b 115200 -p m328p -c arduino -C../etc/avrdude.conf -F -e -U flash:w:test.hex