avr 8-bit (Linux) download, download file 이름 바꾼 후 위치 옮기기
https://www.microchip.com/en-us/tools-resources/develop/microchip-studio/gcc-compilers
CMake setting
terminal → cmake —version 확인 후 없으면 install
Visual Studio Code → Extensions → Setting → Workspace
Cmake : Configure Args(avr file 설치경로 확인 필요)
Cmake : Generator
visual studio code WORKSPACE
tools → avr-gcc.cmake (regular update), CMakeLists.txt
# CMake 프로젝트에 AVR 플랫폼 설정
set(CMAKE_SYSTEM_NAME Generic) # 시스템 이름을 'Generic'(범용)으로 설정
set(CMAKE_SYSTEM_PROCESSOR AVR) # 프로세서를 AVR 마이크로컨트롤러로 설정
# 타겟 MCU 설정 (2025.04.30 수정 사항)
set(MCU atmega128a) # 사용할 마이크로컨트롤러를 ATmega128A로 설정
set(CMAKE_C_FLAGS "-mmcu=${MCU}") # MCU 설정
set(CMAKE_CXX_FLAGS "-mmcu=${MCU}") # C++ 컴파일러에 MCU 설정 플래그 전달
# AVR Toolchain 경로 설정
set(BINUTILS_PATH ${AVR_TOOLCHAIN_DIR}) # AVR 도구체인 루트 디렉토리 지정
# AVR Toolchain 실행 파일 경로 설정
set(TOOLCHAIN_PREFIX ${AVR_TOOLCHAIN_DIR}/bin/avr-) # AVR 컴파일러 및 유틸리티 파일 경로 접두사 설정
# CMake 테스트 빌드 대상 유형 설정
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # CMake의 테스트 컴파일을 정적 라이브러리로 제한
# 컴파일러 경로 설정
set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}gcc" CACHE FILEPATH "C Compiler path") # C 컴파일러 경로
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) # ASM(어셈블리) 컴파일러를 C 컴파일러와 동일하게 설정
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}g++" CACHE FILEPATH "C++ Compiler path") # C++ 컴파일러 경로
# AVR에서 사용하는 추가 유틸리티 경로 설정
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "objcopy tool") # 바이너리 변환 유틸리티 설정
set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}size CACHE INTERNAL "size tool") # 바이너리 크기 확인 유틸리티 설정
# C/C++ 표준 버전 설정
set(CMAKE_C_STANDARD 11) # C 언어 표준을 C11로 설정
set(CMAKE_CXX_STANDARD 11) # C++ 언어 표준을 C++11로 설정
# 컴파일러 확인 단계 비활성화
set(CMAKE_C_COMPILER_FORCED TRUE) # C 컴파일러 강제 사용 (검사 생략)
set(CMAKE_CXX_COMPILER_FORCED TRUE) # C++ 컴파일러 강제 사용 (검사 생략)
# 컴파일 및 링크 시 사용할 검색 경로 설정
set(CMAKE_FIND_ROOT_PATH ${BINUTILS_PATH}) # 검색 루트 경로를 도구체인 경로로 설정
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 프로그램 검색 시 루트 경로 사용 안 함
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 라이브러리 검색 시 루트 경로만 사용
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 헤더 파일 검색 시 루트 경로만 사용
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # 패키지 검색 시 루트 경로만 사용
cmake_minimum_required(VERSION 3.10.0)
project(atmega128a
LANGUAGES ASM C CXX
)
set(EXECUTABLE ${PROJECT_NAME}.elf)
# 소스 파일 수집
file(GLOB SRC_FILES CONFIGURE_DEPENDS
*.c
*.cpp
)
file(GLOB_RECURSE SRC_FILES_RECURSE CONFIGURE_DEPENDS
src/*.c
src/*.cpp
)
# 실행 파일 생성
add_executable(${EXECUTABLE}
${SRC_FILES}
${SRC_FILES_RECURSE}
)
# 컴파일 타임 매크로
target_compile_definitions(${EXECUTABLE} PRIVATE
-DF_CPU=16000000UL
)
# include 디렉토리 설정
target_include_directories(${EXECUTABLE} PRIVATE
src
src/ap
#src/bsp
src/hw
src/common
#src/common/hw/include
)
# 컴파일러 옵션
target_compile_options(${EXECUTABLE} PRIVATE
-fdata-sections
-ffunction-sections
-MMD
-flto
-fno-fat-lto-objects
-Wall
-Os
-g3
)
# 링커 옵션
target_link_options(${EXECUTABLE} PRIVATE
-flto
-fuse-linker-plugin
-lm
-Wl,-Map=${CMAKE_BINARY_DIR}/${PROJECT_NAME}.map,--cref
-Wl,--gc-sections
-Xlinker -print-memory-usage -Xlinker
)
# 바이너리 파일 생성 (.hex)
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom ${EXECUTABLE} ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.hex
COMMENT "Generating HEX file"
)
# EEPROM 파일 생성 (.eep)
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 ${EXECUTABLE} ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.eep
COMMENT "Generating EEPROM file"
)
# 바이너리 사이즈 출력
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_SIZE_UTIL} ${EXECUTABLE}
COMMENT "Firmware Size:"
)
.vscode → cmake-kits.json, tasks.json
[
{
"name": "AVR-GCC Embedded",
"toolchainFile": "${workspaceFolder}/tools/avr-gcc.cmake"
}
]
{
"version": "2.0.0",
"tasks": [
{
// CMake를 사용하여 빌드를 수행하는 작업
"label": "CMake Build",
"type": "process", // 외부 프로세스를 호출하여 작업을 수행
"command": "cmake", // CMake 명령어 실행
"args": [
"--build", // CMake를 빌드 모드로 실행
"${workspaceFolder}/build", // 작업 공간 폴더 안의 'build' 디렉토리를 대상으로 빌드
"--target", // 특정 빌드 타겟을 지정
"all" // 모든 타겟을 빌드
],
"group": {
"kind": "build", // 빌드 작업으로 분류
"isDefault": true // 기본 빌드 작업으로 설정
},
"problemMatcher": [] // 문제 매처를 지정하지 않음
},
{
// CMake를 사용하여 클린(clean)을 수행하는 작업
"label": "CMake Clean",
"type": "process", // 외부 프로세스를 호출하여 작업을 수행
"command": "cmake", // CMake 명령어 실행
"args": [
"--build", // CMake를 빌드 모드로 실행
"${workspaceFolder}/build", // 작업 공간 폴더 안의 'build' 디렉토리를 대상으로 실행
"--target", // 특정 빌드 타겟을 지정
"clean" // 'clean' 타겟을 수행하여 빌드 파일 제거
],
"problemMatcher": [] // 문제 매처를 지정하지 않음
},
{
// avrdude를 사용하여 ATmega128A에 펌웨어를 업로드하는 작업
"label": "avrdude",
"type": "shell", // 쉘 명령어 실행
"command": "/usr/bin/avrdude", // avrdude 명령어 실행
"args": [
"-C", "/etc/avrdude.conf", // avrdude 설정 파일 경로
"-v", // 상세한 출력 활성화
"-u", // 잠금 비트를 설정하지 않음 (쓰기 보호 해제)
"-p", "atmega128a", // 타겟 MCU를 ATmega128A로 설정
"-c", "avrisp2", // 프로그래머 타입을 AVR ISP mkII로 설정
"-P", "/dev/ttyUSB0", // 프로그래머가 연결된 시리얼 포트 경로 지정
"-b", "115200", // 통신 속도 설정
"-U", "flash:w:build/atmega128a.hex:i" // 플래시에 HEX 파일을 작성(write), 파일 경로 및 형식 지정
],
"problemMatcher": [] // 문제 매처를 지정하지 않음
},
{
// 빌드 전체 프로세스를 순차적으로 실행하는 작업
"label": "Build",
"dependsOrder": "sequence", // 순차적으로 작업을 실행
"dependsOn": [
"CMake Build", // 먼저 CMake 빌드를 수행
"avrdude" // 이후 avrdude를 통해 펌웨어 업로드 수행
],
"group": {
"kind": "build", // 빌드 작업으로 분류
"isDefault": true // 기본 빌드 작업으로 설정
}
},
{
// 클린 작업을 순차적으로 실행하는 작업
"label": "Clean",
"dependsOrder": "sequence", // 순차적으로 작업을 실행
"dependsOn": [
"CMake Clean" // CMake 클린 작업을 수행
]
}
]
}