<서론>
아두이노 1.0을 바탕으로 윈도우 OS 이클립스에서 아두이노 (AVR) 코딩할 수 있는 환경을 구축하는 방법을 알아보고자 한다.
<본론>
1. 가장 먼저 “아두이노 개발툴(pde)”를 설치한다.
나는 1.0 버전으로 설치했다.
2. make
mingw 에서 나온 윈도우용 make 유틸리티를 설치한다.
나는 5.1.5 버전을 사용중이다.
http://sourceforge.net/projects/mingw/files/OldFiles/MinGW%205.1.4/MinGW-5.1.4.exe/download
custom 지정을 잘한다. make을 반드시 설치 목록에 넣어줘야 한다.
설치된 mingw/bin 디렉토리를 path에 추가한다.
mingw32-make.exe 파일을 make.exe 파일로 하나 복사해서 사용한다.
정상적으로 동작하는지 확인한다.
make 유틸리티가 윈도우 path에 등록되어 있지 않으면 이클립스상에서 컴파일은 되지 않는다.
**** Build of configuration 328P_16MHz for project arduino-test ****
make all
Error: Cannot run program "make" (in directory "G:\android\workspace\arduino-test\328P_16MHz"): CreateProcess error=2, ??d?? Æ???; ?; ¼? ¾ø
**** Build Finished **** |
3. avr Eclipse 플러그인을 설치한다.
http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download 를 참조한다.
플러그인 update 주소는 다음과 같다.
http://avr-eclipse.sourceforge.net/updatesite
(출처 : http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download)
4. Preferneces 설정의 AVR Path를 변경
체인툴의 path를 설정해야 한다.
path source는 custom으로 하고 설치된 아두이노의 디렉토리를 지정한다.
위치 지정은 다음과 같다.
AVG-GCC : hardware\tools\avr\bin
GNU make : hardware\tools\avr\utils\bin
AVR Header Files : hardware\tools\avr\avr\include
AVRDude : hardware\tools\avr\bin
c/c++ / build item에서 Build all configuration in each project를 check on 한다.
5. 프로젝트 환경
먼저 c++ 프로젝트를 생성한다.
소스 디렉토리를 생성한다.
프로젝트의 properties를 설정한다. 내 꺼는 arduino uno이다. MCU type은 Atmgega328P , clock은 16000000로 지정한다.
Properties 중 c/c++ build 설정의 “Manage Configuration” 설정을 선택한다.
아래와 같은 팝업창에서 “New”버튼을 선택한다.
328P_16MHz 라는 이름으로 새로운 설정을 추가한다.
OK 버튼을 누르면, 아까 봤던 팝업창이 뜨는데 Set Avice 버튼을 선택한다. 나머지 설정은 다 지운다.
AVR tab를 선택하고, 항목에서 Enable시킨다.
C/C++ Build –> Settings 설정에서 Configuration 설정에서 328P_16MHz를 선택한다.
Settings 아이템의 Additional Tools in Toolchain에서 아래 두 옵션만 check on 한다. (우선은 컴파일하고 바이너리 이미지까지만 만드는 것까지이다.)
”Generate HEX file for flash memroy”, “Print Size”,
Tool Settings 밑의 AVR Compiler /Debugging을 선택하고, 정보를 확인한다.
AVR Compiler의 Optimization 설정을 다음과 같이 수정한다.
-Os, 체크박스를 모두 off, "-ffunction-sections -fdata-sections”을 optimization flag로 설정한다.
C/C++ Build/Settings 탭의 Tool Settings/AVR Compiler/Language Standard 화면의 옵션을 모두 check off 한다.
AVR Compiler의 Directories 설정의 플러스 아이콘을 선택한다.
AVR Compiler 의 Directories에 아래 디렉토리를 추가한다. header 파일과 구현 파일들이다.
"G:\Arduino-package\arduino-1.0\hardware\arduino\cores\arduino" : 아두이노 h 및 cpp
"G:\Arduino-package\arduino-1.0\hardware\arduino\variants\standard" : pins_arduino.h
AVR Compiler 처럼 AVR C++ Compiler 부분도 똑같이 수정해야 한다. (사실 cpp로 동작하기 때문에 c++ compiler 설정을 더 잘해야 한다.)
AVR C++ Compiler/Debugging 설정을 잘 되었는지 확인한다.
Optimization 설정도 똑같이 한다.
Language Standard도 똑같이 설정한다.
Directories도 동일하게 설정한다.
6. 링커 설정
AVR C++ Linker에서 다음과 같이 설정한다.
Command는 avr-gcc,
Command line pattern은 “ ${COMMAND} -s -Os ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} -lm ${FLAGS}”으로 지정한다. (복사하면서 유니코드가 들어갈 수 있어 빌드 실패가 일어날 수 있음)
그리고, Library 설정은 특별히 하지 않는다.
7. 아두이노 디렉토리를 import한다.
Import/Filesystem 을 이용해서 Include된 디렉토리를 참조하게 한다. 이 파일들로 인해서 컴파일 시 참조가 되게 한다.
8. 컴파일
main.cpp 파일에 있는 setup(), loop()를 주석을 제거하거나 exmple 소스 하나를 구현해본다.
#include <Arduino.h>
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
int main(void)
{
init();
#if defined(USBCON)
USB.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
} |
잘 생각해보면, 아두이노 개발 툴 에서 setup(), loop()를 구현한 코드에서 main.cpp 와 링킹하면서 바이너리가 만들어지는 모델이라는 점을 쉽게 이해할 수 있다.
컴파일을 하려면 툴바에 있는 망치를 선택한다.
컴파일하면, 다음과 같이 잘 되는지 확인가능 하다. 빌드 과정을 보면서 지금까지 셋팅한 정보로 컴파일되는지 확인한다.
**** Build of configuration 328P_16MHz for project arduino-test ****
make all
Building file: ../src/main.cpp
Invoking: AVR C++ Compiler
avr-g++ -I"G:\Arduino-package\arduino-1.0\hardware\arduino\cores\arduino" -I"G:\Arduino-package\arduino-1.0\hardware\arduino\variants\standard" -Wall -g2 -gstabs -Os -ffunction-sections -fdata-sections -fno-exceptions -mmcu=atmega328p -DF_CPU=1600000UL -MMD -MP -MF"src/main.d" -MT"src/main.d" -c -o "src/main.o" "../src/main.cpp"
Finished building: ../src/main.cpp
Building target: arduino-test.elf
Invoking: AVR C++ Linker
avr-g++ -s -Os -o"arduino-test.elf" ./src/main.o ./ref/CDC.o ./ref/HID.o ./ref/HardwareSerial.o
./ref/IPAddress.o ./ref/Print.o ./ref/Stream.o ./ref/Tone.o
./ref/USBCore.o ./ref/WInterrupts.o ./ref/WMath.o ./ref/WString.o
./ref/new.o ./ref/wiring.o ./ref/wiring_analog.o ./ref/wiring_digital.o
./ref/wiring_pulse.o ./ref/wiring_shift.o -lm -Wl,-Map,arduino-test.map,--cref -mmcu=atmega328p
Finished building target: arduino-test.elf
Create Flash image (ihex format)
avr-objcopy -R .eeprom -O ihex arduino-test.elf "arduino-test.hex"
Finished building: arduino-test.hex
Invoking: Print Size
avr-size --format=avr --mcu=atmega328p arduino-test.elf
AVR Memory Usage
----------------
Device: atmega328p
Program: 20130 bytes (61.4% Full)
(.text + .data + .bootloader)
Data: 544 bytes (26.6% Full)
(.data + .bss + .noinit)
Finished building: sizedummy
**** Build Finished ****
|
Navigator 또는 Project Explorer로 보면, 아래와 같이 make 파일과 hex, elf 파일이 생성되는지 확인할 수 있다.
이제는 이미지 업로드하는 작업을 한다.