cmake를 이용한 AVR 개발 환경
주요 칩제조사들은 개발자들이 해당 칩에서 동작되는 프로그램을 쉽게 개발하도록 통합개발환경(IDE)을 무료로 혹은 일부 비용을 받고 전용 도구를 제공한다. 그러나 칩제조사에서 만드는 대부분의 칩을 지원하도록 하기위해서 개발도구의 프로그램도 커지고 컴퓨터의 자원도 많이 필요로한다.
무료로 제공되는 개발환경에 포함되는 컴파일러는 대부분 GCC 기반인 경우가 많기 때문에 전용도구 없이도 칩에서 동작되는 프로그램을 개발할수 있다.
이번 글에서는 윈도우 OS에서 cmake를 사용해서 AVR 칩용 프로그램을 개발하는 환경을 구성하는 방법에 대해서 설명한다.
필요한 파일은 AVR용 GCC toolchain과 make, cmake, git이다.
먼저 gcc를 다운받아서 설치한다.
설치하는 위치는 c:\tools 에 하는걸로 설명한다.
다음에는 make 프로그램을 다운로드한 후 설치한다.
위의 그림에서 binaries와 dependencies모두 다운로드해서 같은 폴더에서 압축을 풀어주면 된다.
다음으로는 cmake 프로그램을 설치한다.
이렇게 세개의 프로그램만 설치해도 되지만 윈도우에서 리눅스 명령어를 사용하기 위해서 git을 설치해 주도록 한다.
설치가 완료된 폴더는 다음과 같은 모습이 될것이다. 폴더명은 가급적 간편하게 수정하였다.
모든 tool의 설치가 완료되면 각각의 tool을 바로 실행될수 있도록 환경변수설정을 해주어야 한다.
모든 tool이 제대로 동작되는지 확인해 본다.
> avr-gcc --version
> make --version
> cmake --version
위 명령을 차례대로 입력하여 각 tool의 버전이 제대로 출력되는지 확인한다.
필요한 tool이 제대로 설치되었으면 본격적으로 빌드 환경을 만들어 보겠다.
cmake가 동작되기 위해서는 CMakeLists.txt 파일이 필요하다.
그리고 AVR 컴파일러에 대한 설정을 위한 파일이 하나 더 필요하다. 그리고 좀더 간단한 명령으로 빌드되기 위해서 Makefile도 만들어 준다.
cmake_minimum_required(VERSION 3.28)
project(sample CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
file(GLOB_RECURSE PROJECT_SRC
src/*.cpp)
add_executable(${PROJECT_NAME} ${PROJECT_SRC})
target_include_directories(${PROJECT_NAME} PRIVATE
./inc)
target_compile_definitions(${PROJECT_NAME} PRIVATE
F_CPU=1000000)
set(CPU_PARAM
-mmcu=attiny85)
target_compile_options(${PROJECT_NAME} PRIVATE
${CPU_PARAM}
-funsigned-char
-ffunction-sections
-fdata-sections
-Og -g2
-Wall)
target_link_options(${PROJECT_NAME} PRIVATE
${CPU_PARAM}
-Wl,-Map=${PROJECT_NAME}.map
-Wl,--start-group
-Wl,-lm
-Wl,--end-group
-Wl,--gc-sections)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${PROJECT_NAME}>
COMMAND ${CMAKE_OBJDUMP} -h -S ${PROJECT_NAME} > ${PROJECT_NAME}.lss
COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_NAME}.hex
COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_NAME}.bin)
CMakeLists.txt
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR avr)
set(TOOLCHAIN_PREFIX avr-)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}c++)
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy)
set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size)
set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
avr-gcc.make
BUILD_DIR := build
all: ${BUILD_DIR}
${BUILD_DIR}: cmake
$(MAKE) -C ${BUILD_DIR} --no-print-directory
cmake: ${BUILD_DIR}/Makefile
${BUILD_DIR}/Makefile:
cmake \
-G "Unix Makefiles" \
-B${BUILD_DIR} \
-DCMAKE_TOOLCHAIN_FILE=avr-gcc.cmake
clean:
@rm -rf ${BUILD_DIR}
@echo "Delete ${BUILD_DIR} directory"
.PHONY: all ${BUILD_DIR} cmake clean
Makefile
AtTiny85 I2C에서 사용한 코드를 이용해서 빌드하면 다음과 같은 결과를 볼 수 있다.