Atmega128

STM32

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 설치경로 확인 필요)

image.png

Cmake : Generator

image.png

visual studio code WORKSPACE

image.png

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 클린 작업을 수행
            ]
        }
    ]
}