이 튜토리얼에서는 CMake 빌드 생성기, Ninja 빌드 도구 및 GCC 컴파일러를 사용하여 Visual Studio Code 에서 STM32 애플리케이션을 효과적으로 개발하고 디버깅하는 단계를 설명합니다.
당신이 배울 것 들
모든 도구를 설치하고 설정하는 방법
STM32CubeMX 또는 STM32CubeIDE 도구를 사용하여 새 STM32 프로젝트를 생성하는 방법
보다 쉬운 개발을 위해 Visual Studio Code 용 권장 확장을 설치하고 설정하는 방법
CMake 목록 및 CMake 사전 설정을 설정하는 방법
컴파일러용 빌드 시스템을 생성하는 방법
GCC로 프로젝트를 컴파일하는 방법
STM32 타겟에 애플리케이션을 플래시하고 디버깅하는 방법
이 튜토리얼에서는 Windows 운영 체제를 사용합니다. Linux 및 MAC 운영 체제에도 유사한 절차가 적용됩니다.
도구 설치 튜토리얼은 STM32를 사용하는 데 필요한 도구를 이해하는 데 도움이 되며 일반적으로 초보자가 속도를 높이고 필요한 요구 사항을 올바르게 이해하는 데 좋습니다.
ST는 얼마 전부터 vscode에 필요한 빌드 도구, Ninja 빌드 시스템 및 CMake 빌드 생성기를 포함하는 새로운 STM32CubeCLT 소프트웨어 도구를 보유하고 있습니다. STM32CubeCLT(명령줄 도구)는 vscode 개발 속도를 빠르게 높일 수 있는 간단하고 쉬운 방법입니다. 또한 빌드 환경 변수(Windows의 경우 Path )를 자동으로 설정하여 명령줄 도구에서 직접 ninja , cmake 또는 기타 명령을 호출할 수 있습니다.
STM32CubeCLT 를 설치하면 STM32CubeIDE 그래픽 도구나 MCU 구성 도구 기능을 얻을 수 없으며 일반적으로 vscode 내에서 빌드 및 디버그를 호출하는 명령줄 도구만 얻을 수 있습니다. vscode와 필요한 확장 프로그램을 별도로 설치해야 합니다.
첫 번째 단계는 STM32CubeIDE를 설치하는 것입니다. 이는 새로운 STM32 프로젝트를 쉽게 시작하는 데 사용되며 통합 STM32CubeMX 도구와 함께 제공되므로 그래픽 구성이 가능합니다.
STM32CubeIDE는 나중에 VSCode 개발에 필요한 필수 도구도 제공합니다.
ARM 없음 eabi GCC 컴파일러
디버깅을 위한 ST-LINK GDBServer
코드 다운로드 및 해당 ST-Link 드라이버용 STM32CubeProgrammer 도구
STM32 SVD 파일이 있는 폴더
ST-Link용 드라이버
환경 경로 설정
STM32CubeIDE 설치 시 환경 설정에 3
경로를 추가해야 합니다. 위에서 언급한 도구 각각에 대해 하나의 경로입니다. 내 컴퓨터의 경우 STM32CubeIDE 1.8(eclipse를 통해 업데이트되었으므로 실제 설치 경로는 여전히 버전 1.0.2
로 표시됨)을 사용하여 경로는 다음과 같이 정의됩니다.
GCC 컴파일러: c:STSTM32CubeIDE_1.0.2STM32CubeIDEpluginscom.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.202105311346toolsbin
ST-Link GDB 서버: c:STSTM32CubeIDE_1.0.2STM32CubeIDEpluginscom.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.win32_2.0.100.202109301221toolsbin
STM32Cube 프로그래머 CLI: c:STSTM32CubeIDE_1.0.2STM32CubeIDEpluginscom.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.0.100.202110141430toolsbin
버전 번호에 따라 경로가 다를 수 있습니다.
올바른 경로 설정을 확인하고 다음을 실행하십시오.
arm-none-eabi-gcc --version STM32_Programmer_CLI --version ST-LINK_gdbserver --version
그러면 아래 그림과 비슷한 출력이 생성됩니다.
STM32CubeCLT를 사용하여 빌드 도구를 설치한 경우 이 단계는 필요하지 않습니다.
CMake를 다운로드하고 설치합니다.
설치 마법사는 환경 경로에 CMake를 추가하라는 메시지를 표시합니다. 옵션을 선택하거나 CMake 설치 폴더의 bin
폴더를 환경 경로에 추가하세요.
STM32CubeCLT를 사용하여 빌드 도구를 설치한 경우 이 단계는 필요하지 않습니다.
Github 릴리스 페이지에서 Ninja 빌드 시스템을 다운로드하세요. 아무것도 설치할 필요 없이 이식 가능한 실행 파일로 제공됩니다. 그러나 이전의 모든 도구와 마찬가지로 환경 수준에서 표시되어야 합니다.
CMake 및 Ninja 설치를 확인하고 다음을 실행합니다.
cmake --version ninja --version
출력은 다음과 유사합니다.
VSCode를 다운로드하고 설치합니다. 설치하고 열면 아래와 같은 창이 나타납니다.
Visual Studio Code 는 확장을 사용하여 확대할 수 있는 기능을 갖춘 경량 텍스트 편집기입니다.
CMake를 사용한 STM32 개발에 유용한 확장 목록:
ms-vscode.cpptools
: C/C++ 개발을 위한 구문 강조 및 기타 핵심 기능
ms-vscode.cmake-tools
: CMake 핵심 도구, 빌드 시스템 생성기 도구
twxs.cmake
: CMake 색상 강조
marus25.cortex-debug
: Cortex-M 디버깅 확장, VSCode의 STM32 디버그에 필수
dan-c-underwood.arm
: ARM 어셈블리 구문 강조 표시
zixuanwang.linkerscript
: GCC 링커 스크립트 구문 강조 표시
VSCode의 내부 터미널 창에서 아래 명령을 복사하여 설치할 수 있습니다.
code --install-extension ms-vscode.cpptools code --install-extension ms-vscode.cmake-tools code --install-extension twxs.cmake code --install-extension marus25.cortex-debug code --install-extension dan-c-underwood.arm code --install-extension zixuanwang.linkerscript
터미널 -> 새 터미널 로 이동하여 새 터미널 창을 엽니다.
다른 방법은 확장 검색 GUI를 사용하여 거기에서 수동으로 설치하는 것입니다.
이제 모든 도구가 올바르게 설치되었습니다. 성공을 향한 올바른 길을 가고 있는 것입니다.
앞으로 나아가기 위한 기본 요구 사항은 CMake 로 변환되고 VSCode 에서 개발될 작업 프로젝트를 보유하는 것입니다. 이를 위해 STM32CubeMX 또는 STM32CubeIDE 소프트웨어 도구를 사용하여 간단한 새 프로젝트 생성 방법을 안내하겠습니다.
이미 작업할 프로젝트가 있으면 이 부분을 건너뛸 수 있습니다.
이 데모에서는 STM32CubeIDE 도구와 STM32H735G-DK 보드를 사용했습니다.
STM32CubeIDE를 열고 새 프로젝트 시작
STM32 MCU 선택 - STM32H735G-DK 보드에 사용되는 STM32H735IG를 선택했습니다.
프로젝트 이름과 경로를 선택한 다음 프로젝트를 생성하고 핀아웃 보기가 열릴 때까지 기다립니다.
우리의 임무는 LED를 전환하는 간단한 프로젝트를 만드는 것입니다. LED는 각각 PC2
와 PC3
에 연결되어 있으며 활성 LOW입니다. 핀은 출력 푸시풀 또는 오픈 드레인 모드로 구성 가능
핀을 각각 LED1
및 LED2
로 옵션 레이블이 있는 출력으로 설정
STM32CubeMX
사용하는 경우 프로젝트 관리자 로 이동하여 프로젝트 이름을 설정하고 STM32CubeIDE
Toolchain
으로 선택되어 있는지 확인하세요.
고급 설정으로 이동하여 생성된 코드의 드라이버로 LL
선택하세요.
이 튜토리얼에서는 단순화를 위해 LL 드라이버를 사용합니다.
빨간색 버튼을 누르거나 CTRL + S
단축키로 프로젝트를 저장하여 프로젝트를 다시 생성하십시오.
이제 프로젝트가 (재)생성되었습니다. 노란색으로 강조 표시된 파일은 빌드할 소스입니다. 파란색은 링커 스크립트입니다.
이것이 첫 번째 실행이고, 컴파일할 준비가 되었습니다. CTRL + B
누르거나 망치 아이콘을 클릭하여 시작하세요. STM32CubeIDE가 프로젝트를 컴파일하면 아래 그림과 비슷한 내용이 표시됩니다. 이제 MCU의 플래시를 플래싱하고 디버깅을 시작할 준비가 되었습니다.
이것으로 프로젝트를 성공적으로 생성한 첫 번째 부분이 끝났습니다. 이 시점에서는 프로젝트를 CMake 기반 빌드 시스템으로 전송할 준비가 된 것으로 간주합니다.
앞으로 STM32CubeIDE를 사용하여 개발을 계속하고, 새로운 소스를 추가하고, 코드를 수정하고, 바이너리를 컴파일하고, 플래시하고, 마이크로컨트롤러를 직접 디버그할 수 있습니다. 이는 STMicroelectronics에서 개발 및 유지 관리하는 선호되는 STM32 개발 스튜디오입니다.
VSCode로 개발할 프로젝트가 만들어졌을 것으로 예상됩니다. 우리는 GCC 컴파일러를 위해 앞으로 나아갈 것이지만 다른 것들도 사용될 수 있습니다.
Visual Studio Code가 출시되면서 많은 개발자가 다양한 프로그래밍 언어에 대한 도구를 사용하고 있으며 다행히도 단일 도구로 STM32 애플리케이션을 개발할 수도 있습니다. VSCode를 좋아하는 개발자 중 한 명이라면 앞으로 나아갈 수 있는 가장 우아한 방법은 STM32CubeIDE 기반 프로젝트를 CMake 로 전송하고, VSCode에서 코드를 개발하고, GCC 컴파일러를 사용하여 Ninja 빌드 시스템으로 컴파일하는 것입니다. 빠르고 가볍습니다.
VSCode의 개발은 중급 또는 숙련된 사용자를 위한 것입니다. 나는 모든 STM32 초보자에게 STM32CubeIDE 개발 툴체인을 계속 사용할 것을 제안합니다. 나중에 VSCode 주제로 넘어가는 것은 매우 쉽습니다.
모든 CMake 기반 애플리케이션 에는 루트 디렉터리에 프로젝트를 설명하고 빌드 시스템 생성을 위한 입력 정보를 제공하는 CMakeLists.txt
파일이 필요합니다.
루트
CMakeLists.txt
파일은 최상위 CMake 파일이라고도 합니다.
CMakeLists.txt
파일에 설명된 필수 사항:
빌드 플래그가 포함된 GCC 구성과 같은 도구 체인 정보
프로젝트 이름
컴파일러, C, C++ 또는 어셈블리 파일로 빌드할 소스 파일
컴파일러가 함수, 정의 등을 찾기 위한 포함 경로 목록 ... ( -I
)
링커 스크립트 경로
컴파일 정의 또는 전처리기 정의 라고도 함( -D
)
명령어 세트 생성을 위한 Cortex-Mxx 및 부동 소수점 설정
Visual Studio Code가 설치되었으며 추가 파일 편집기로 사용됩니다.
생성된 프로젝트 경로를 찾고 VSCode를 사용하여 폴더를 엽니다.
옵션 1: 탐색기를 사용하여 폴더로 이동한 다음 마우스 오른쪽 버튼을 클릭하고 Open in Code
선택합니다.
옵션 2: 또는 VScode를 새로운 빈 솔루션으로 열고 폴더를 수동으로 추가합니다. File -> Open Folder...
사용하여 폴더를 엽니다.
옵션 3: cmd 또는 powershell 도구를 사용하여 폴더로 이동하고 code .
최종 결과는 아래와 유사해야 합니다.
CMake는 프로젝트를 최종적으로 컴파일하는 데 사용하려는 도구 체인에 대해 알고 있어야 합니다. 동일한 툴체인은 일반적으로 여러 프로젝트에서 재사용되므로 쉽게 재사용할 수 있도록 이 부분을 별도의 파일로 생성하는 것이 좋습니다. 이는 일반 컴파일러 설정이며 프로젝트 자체에 직접 연결되지 않습니다.
간단한 .cmake
파일을 사용하고 나중에 다양한 프로젝트에서 재사용할 수 있습니다. 이 튜토리얼에서는 cmake/gcc-arm-none-eabi.cmake
라는 이름을 사용하고 있으며 아래는 그 예입니다.
set(CMAKE_SYSTEM_NAME Generic)set(CMAKE_SYSTEM_PROCESSOR arm)# 일부 기본 GCC 설정# arm-none-eabi-는 경로 환경의 일부여야 합니다.set(TOOLCHAIN_PREFIX arm-none-eabi-)set(FLAGS "-fdata-sections -ffunction-sections - -specs=nano.specs -Wl,--gc-sections")set(CPP_FLAGS "-fno-rtti -fno-Exceptions -fno-threadsafe-statics")# 컴파일러 설정 정의set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc ${FLAGS})set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++ $ {플래그} ${CPP_FLAGS})set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy)set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size)set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf")set(CMAKE_EXECUTABLE_SUFFIX_C ".elf")set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf")세트(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
루트 프로젝트 디렉토리의 cmake/
폴더에 파일을 생성합니다.
CMake 형광펜 플러그인이 설치되어 있으면 VSCode가 CMake 명령을 멋지게 강조 표시합니다.
툴체인 설정이 완료되었습니다. 자유롭게 파일을 닫고 다음 단계로 넘어갈 수 있습니다.
루트 CMake 파일이라고도 하는 기본 CMakeLists.txt
생성해야 합니다.
올바른 대문자와 소문자를 사용하여 이름을
CMakeLists.txt
로 지정했는지 확인하세요.
향후 모든 프로젝트에 재사용할 수 있는 간단한 템플릿 파일을 준비했습니다. 프로젝트 이름, 소스 파일, 포함 경로 등을 변경하기만 하면 됩니다.
cmake_minimum_required(VERSION 3.22)# 컴파일러 설정 설정set(CMAKE_C_STANDARD 11)set(CMAKE_C_STANDARD_REQUIRED ON)set(CMAKE_C_EXTENSIONS ON)set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED ON)set(CMAKE_CXX_EXTENSIONS ON)set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR})message("빌드 유형: " ${CMAKE_BUILD_TYPE})## 핵심 프로젝트 설정#project(your-project-name)enable_언어(C CXX ASM)## 핵심 MCU 플래그, CPU, 명령어 세트 및 FPU 설정# MCU#세트(CPU_PARAMETERS)에 대해 올바르게 설정해야 합니다. -mthumb# 사용된 MCU-mcpu=cortex-m7에 대해 올바르게 설정하려면 주의가 필요합니다. -mfpu=fpv5-d16 -mfloat-abi=하드 )# Set linker scriptset(linker_script_SRC ${PROJ_PATH}/path-to-linker-script.ld)set(EXECUTABLE ${CMAKE_PROJECT_NAME})## 컴파일할 소스 파일 목록#set(sources_SRCS# 여기에 소스 파일을 넣으세요. CMakeLists.txt 파일 위치를 기준으로 각 줄에)## 포함 디렉터리#set(include_path_DIRS# 여기에 포함 디렉터리를 하나씩 입력하세요. 행, CMakeLists.txt 파일 위치에 상대적)## 기호 정의#set(symbols_SYMB# 각 줄에 하나씩 기호(전처리기 정의)를 여기에 넣습니다.# 안전을 위해 큰따옴표로 캡슐화합니다.)# 실행 파일add_executable(${EXECUTABLE} ${sources_SRCS})# 포함 경로target_include_directories(${EXECUTABLE} PRIVATE ${include_path_DIRS})# 프로젝트 Symbolstarget_compile_definitions(${EXECUTABLE} PRIVATE ${symbols_SYMB})# 컴파일러 옵션target_compile_options(${EXECUTABLE} PRIVATE${CPU_PARAMETERS}-Wall -웨스트라 -Wpedantic -Wno-unused-parameter# 전체 디버그 구성-Og -g3 -ggdb )# 링커 옵션target_link_options(${EXECUTABLE} PRIVATE-T${linker_script_SRC}${CPU_PARAMETERS}-Wl,-Map=${CMAKE_PROJECT_NAME}.map --specs=nosys.specs -u _printf_float # STDIO 부동 소수점 형식 지원-Wl,--start-group -lc -lm -lstdc++ -lsupc++ -Wl,--끝-그룹 -Wl,--print-메모리-사용량 )# 빌드 후 실행을 실행하여 sizeadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}> 인쇄 )# 출력을 16진수 및 바이너리로 변환add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.hex )# bin 파일로 변환 -> 조건부 검사 추가?add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O 바이너리 $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.bin )
소스 파일은 STM32CubeIDE 프로젝트와 동일합니다. 노란색으로 강조된 소스로 이전 이미지를 확인할 수 있습니다.
기호 및 포함 경로는 STM32CubeIDE의 프로젝트 설정에서 찾을 수 있습니다. 아래 2
사진은 데모 프로젝트의 경우를 보여줍니다.
Cortex-Mxx 설정에는 특히 부동 소수점 설정에 특별한 주의가 필요합니다. STM32H735xx
의 경우 아래와 같이 설정해야 합니다.
설정(CPU_PARAMETERS -mthumb -mcpu=cortex-m7 # Cortex-M 설정 CPU-mfpu=fpv5-d16 # 부동 소수점 type-mfloat-abi=hard # 하드웨어 ABI 모드 설정
설정에 대한 일반적인 규칙은 아래 표와 같습니다.
STM32 제품군 | -mcpu | -mfpu | -mfloat-abi |
---|---|---|---|
STM32F0 | cortex-m0 | Not used | soft |
STM32F1 | cortex-m3 | Not used | soft |
STM32F2 | cortex-m3 | Not used | soft |
STM32F3 | cortex-m4 | fpv4-sp-d16 | hard |
STM32F4 | cortex-m4 | fpv4-sp-d16 | hard |
STM32F7 SP | cortex-m7 | fpv5-sp-d16 | hard |
STM32F7 DP | cortex-m7 | fpv5-d16 | hard |
STM32G0 | cortex-m0plus | Not used | soft |
STM32C0 | cortex-m0plus | Not used | soft |
STM32G4 | cortex-m4 | fpv4-sp-d16 | hard |
STM32H5 | cortex-m33 | fpv5-sp-d16 | hard |
STM32H7 | cortex-m7 | fpv5-d16 | hard |
STM32L0 | cortex-m0plus | Not used | soft |
STM32L1 | cortex-m3 | Not used | soft |
STM32L4 | cortex-m4 | fpv4-sp-d16 | hard |
STM32L5 | cortex-m33 | fpv5-sp-d16 | hard |
STM32U0 | cortex-m0plus | Not used | soft |
STM32U5 | cortex-m33 | fpv5-sp-d16 | hard |
STM32WB | cortex-m4 | fpv4-sp-d16 | hard |
STM32WBA | cortex-m33 | fpv5-sp-d16 | hard |
STM32WL CM4 | cortex-m4 | Not used | soft |
STM32WL CM0 | cortex-m0plus | Not used | soft |
이 테이블은 잠재적인 실수의 대상이며 모든 라인에 대해 GCC 컴파일러 로 테스트되지 않았습니다.
STM32F7
의 경우 STM32F7xx 공식 사이트로 이동하여 장치에 단일 또는 이중 정밀도 FPU가 있는지 확인한 다음 그에 따라 설정을 적용하십시오. 제품 목록은 완전하지 않습니다.
소스 파일, 포함 경로, MCU 코어 설정 및 정의가 설정된 후의 최종 CMakeLists.txt
파일:
cmake_minimum_required(VERSION 3.22)# 컴파일러 설정 설정set(CMAKE_C_STANDARD 11)set(CMAKE_C_STANDARD_REQUIRED ON)set(CMAKE_C_EXTENSIONS ON)set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED ON)set(CMAKE_CXX_EXTENSIONS ON)set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR})message("빌드 유형: " ${CMAKE_BUILD_TYPE})## 핵심 프로젝트 설정#project(STM32H735G-DK-LED) # Modifiedenable_언어(C CXX ASM)## 핵심 MCU 플래그, CPU , 명령어 세트 및 FPU 설정# MCU#세트(CPU_PARAMETERS에 대해 올바르게 설정해야 합니다. -mthumb# 사용된 MCU-mcpu=cortex-m7 # Modified-mfpu=fpv5-d16 # Modified-mfloat-abi=hard # Modified)# 링커 스크립트 세트(linker_script_SRC ${PROJ_PATH}/STM32H735IGKX_FLASH. ld) # 수정된 집합(EXECUTABLE ${CMAKE_PROJECT_NAME})## 컴파일할 소스 파일 목록#set(sources_SRCS # 수정됨${PROJ_PATH}/Core/Src/main.c${PROJ_PATH}/Core/Src/stm32h7xx_it.c${PROJ_PATH}/Core/Src/syscalls.c${PROJ_PATH}/Core/Src/sysmem.c$ { PROJ_PATH}/Core/Src/system_stm32h7xx.c${PROJ_PATH}/Core/Startup/startup_stm32h735igkx.s${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm3 2h7xx_ll_exti.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_gpio.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_l l_pwr.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_utils.c )## 포함 디렉터리#set(include_path_DIRS # Modified${PROJ_PATH}/Core/Inc${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Inc${PROJ_PATH}/Drivers/CMSIS/Device/ST/STM32H7xx/Include${PROJ_PATH}/ 드라이버/CMSIS/포함 )## 기호 정의#set(symbols_SYMB # Modified"DEBUG""STM32H735xx""USE_FULL_LL_DRIVER""HSE_VALUE=25000000")# 실행 파일add_executable(${EXECUTABLE} ${sources_SRCS})# 경로 포함target_include_directories(${EXECUTABLE} PRIVATE ${include_path_DIRS})# 프로젝트 기호target_compile_definitions(${EXECUTABLE} PRIVATE ${symbols_SYMB})# 컴파일러 옵션target_compile_options(${EXECUTABLE} PRIVATE${CPU_PARAMETERS}-Wall -웨스트라 -Wpedantic -Wno-unused-parameter# 전체 디버그 구성-Og -g3 -ggdb )# 링커 옵션target_link_options(${EXECUTABLE} PRIVATE-T${linker_script_SRC}${CPU_PARAMETERS}-Wl,-Map=${CMAKE_PROJECT_NAME}.map --specs=nosys.specs -u _printf_float # STDIO 부동 소수점 형식 지원-Wl,--start-group -lc -lm -lstdc++ -lsupc++ -Wl,--끝-그룹 -Wl,--print-메모리-사용량 )# 빌드 후 실행을 실행하여 sizeadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}> 인쇄 )# 출력을 16진수 및 바이너리로 변환add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.hex )# bin 파일로 변환 -> 조건부 검사 추가?add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O 바이너리 $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.bin )
VSCode에서 강조표시된 부분은 다음과 같습니다.
CMakePresets.json
CMake 3.18
부터 사용할 수 있는 특수 파일이며 Eclipse에서 알려진 디버그 및 릴리스 구성과 유사한 사용자 구성에 대한 정의를 제공합니다. 이 파일을 사용하면 개발자는 디버그 모드와 릴리스 모드 사이, 심지어 부트로더 와 기본 애플리케이션 사이를 빠르게 변경할 수 있습니다. 이는 임베디드 애플리케이션의 일반적인 사용 사례입니다.
이 튜토리얼에서는 파일에 대한 세부 사항에 초점을 맞추지 않고 여기에 제공된 템플릿 파일이 있습니다.
파일 설명:
각 빌드 구성의 빌드 디렉터리 경로
각 구성의 기본 빌드 유형( Debug , Release , ...)
.cmake 툴체인 설명자의 경로
각 기본 CMake 구성에 대해 템플릿에
4
사전 설정이 구성되어 있습니다.
{"버전": 3,"configurePresets": [ {"name": "default","hidden": true,"generator": "Ninja","binaryDir": "${sourceDir}/build/${presetName}","toolchainFile": "${sourceDir} /cmake/gcc-arm-none-eabi.cmake","cacheVariables": {"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"} }, {"name": "디버그","inherits": "default","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"} }, {"name": "RelWithDebInfo","inherits": "default","cacheVariables": {"CMAKE_BUILD_TYPE": "RelWithDebInfo"} }, {"name": "릴리스","inherits": "default","cacheVariables": {"CMAKE_BUILD_TYPE": "릴리스"} }, {"name": "MinSizeRel","inherits": "default","cacheVariables": {"CMAKE_BUILD_TYPE": "MinSizeRel"} } ] }
templates/CMakePresets.json
에서 항상 최신 파일을 사용할 수 있습니다.
프로젝트 정보로 CMake를 구성했으며 이제 CMake 명령을 실행할 준비가 되었습니다.
VSCode에는 CMake 명령을 위한 훌륭한 도우미인 CMake 도구 플러그인이 함께 제공됩니다. 설치되면 VSCode 활성 창 하단에서 여러 옵션을 사용할 수 있습니다.
보시다시피 구성 사전 설정이 선택되어 있지 않습니다.
해당 정보가 표시되지 않으면
CTRl + ALT + P
누르고CMake: Quick Start
명령을 실행하세요.
다음 단계는 현재 사전 설정을 선택하는 것입니다. 선택한 사전 설정 구성 없음 을 클릭하여 상단 창을 열고 사전 설정을 선택합니다. 이 튜토리얼을 위해 디버그를 선택했습니다.
선택하면 텍스트가 선택한 사전 설정 라벨 로 변경됩니다.
이제 사전 설정이 활성화되었으므로 CMake-Tools 확장 덕분에 사용자가 CMakeLists.txt
파일을 수정할 때마다 VSCode는 자동으로 빌드 생성 명령을 호출하여 새로운 변경 사항을 적용합니다.
우리 프로젝트는 구축하고 연결할 준비가 되었습니다. CMake 빌드 생성 단계가 실패하지 않는 한, ninja 빌드 시스템을 호출할 수 있는 빌드 디렉터리가 준비되어 있어야 합니다.
다음 단계는 녹색 직사각형으로 표시된 대로 빌드 버튼을 누르는 것입니다. CMake는 다음 명령을 실행합니다.
선택한 사전 설정에 대한 빌드 생성기 실행
실제로 Ninja 로 코드를 빌드해 보세요.
제대로 빌드되면 출력의 마지막 단계는 다양한 섹션의 메모리 사용을 인쇄하는 것입니다.
결과적으로 우리는 build/<presetname>/
디렉토리에 일부 출력을 얻었습니다.
완전한 실행 가능 정보가 포함된 project-name.elf
파일
project-name.hex
HEX 파일
project-name.bin
BIN 파일
project-name.map
맵 파일
기본 구성에서는 .hex
및 .bin
파일이 생성되지 않으며 메모리 사용량 도 표시되지 않습니다. 준비된 CMakeLists.txt
파일에는 성공적인 빌드 후 추가 명령을 실행하기 위한 POST_BUILD
옵션이 포함되어 있습니다. 코드는 이미 CMakeLists.txt
파일에 있으므로 아무것도 할 필요가 없습니다. 그냥 관찰하면 됩니다.
다음 명령을 실행합니다.
각 영역의 사용된 크기 + 최종 실행 가능 메모리 사용량을 출력합니다.
실행 파일에서 .hex
파일 생성
실행 파일에서 .bin
파일 생성
# 빌드 후 실행을 실행하여 sizeadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}> )# 출력을 16진수 및 바이너리로 변환add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.hex )# bin 파일로 변환 -> 조건부 검사 추가?add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O 바이너리 $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.bin )
.bin
파일 생성을 비활성화하려면.bin
에 대한POST_BUILD
줄을 삭제하고 CMake 빌드 시스템 명령을 다시 생성하기만 하면 됩니다..bin
파일을 생성하면 메모리가 내부 플래시 메모리와 외부 플래시 메모리로 분할될 때 부정적인 영향을 미칠 수 있습니다. 사용되지 않은 0이 많이 포함된 매우 큰 파일(>= 2GB
)을 생성할 수 있습니다.
프로젝트 개발 중에 염두에 두어야 할 유용한 명령 목록은 다음과 같습니다.
빌드 변경 사항
프로젝트 정리
먼저 깨끗한 상태로 프로젝트를 다시 빌드하세요.
플래시 프로젝트
전체 구문을 잊어버리기 쉽습니다. 대신 빠른 실행을 위해 명령 목록이 포함된 .vscode/tasks.json
파일을 만들어 보겠습니다.
{ "버전": "2.0.0", "작업": [ {"type": "cppbuild","label": "빌드 프로젝트","command": "cmake","args": ["--build", "${command:cmake.buildDirectory}", "- j", "8"],"옵션": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"종류": "빌드","isDefault": 참} }, {"type": "shell","label": "프로젝트 다시 빌드","command": "cmake","args": ["--build", "${command:cmake.buildDirectory}", "--clean-first", "-v", "-j", "8"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"], }, {"type": "shell","label": "프로젝트 정리","command": "cmake","args": ["--build", "${command:cmake.buildDirectory}", "- -target", "clean"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": [] }, {"type": "shell","label": "CubeProg: 플래시 프로젝트(SWD)","command": "STM32_Programmer_CLI","args": ["--connect","port=swd","- -download", "${command:cmake.launchTargetPath}","-hardRst"],"옵션": {"cwd": "${workspaceFolder}"},"problemMatcher": [] }, {"type": "shell","label": "CubeProg: 정의된 일련 번호(SWD)가 있는 플래시 프로젝트 - 먼저 일련 번호를 설정해야 합니다.",