본글은 Visual Source Code ( VsCode ) 로 Nuvoton 소스를 build ( compile ), debug 하는 글의 한 부분 입니다.
1. Nuvoton 제공 Sample Code를 Keil 에서 Compile 하기 ( https://bahk33.tistory.com/181 )
2. gcc 로 nuvoton source 직접 build(compile) 하기 ( https://bahk33.tistory.com/183 ) : 본글
3. Visual Source VS Code 로 nuvoton Build(Compile) 하기 ( https://bahk33.tistory.com/185 )
4. VS Code 로 nuvoton 디버그 하기 ( https://bahk33.tistory.com/186 )
==========================================
본문 목차.
0.개념
1 cmake 설치
- CMakeLists.txt 에서 makefile 만드는것
2. make.exe 설치
- make.exe, gcc.exe 등이 있어 make 하고 compile 할 수 있게 함
3 arm gcc 설치
4 "CMakeLists.txt" 파일 만들기
5 "arm-none-eabi-gcc.cmake" 파일 만들기
6 Build ( Compile ) 하기
==========================================
0. 개념
> Build 라 하면, 소스파일들(~.c / ~.cpp)을 binary(~.hex/ ~.bin) 파일로 만드는 일련의 과정 입니다.
이를 하기 위하여 nuvoton 의 keil 을 쓰는 경우, 그냥 [build target] 항목만 실행 하면 되었는데,
VS Code 로 할 경우 직접 해 줘야 합니다.
> 일반적으로 빌드는
1) makefile 을 만들고,
2) make.exe 를 실행하여 makefile 안에 기록된 소스 파일들을
컴파일러(gcc.exe) 를 이용 하여 object 들로 만들고 또 이들을 합쳐서 bin 파일을 만듭니다.
> 하지만 여기서는 makefile 만드는것이 어려워
1) CMakeLists.txt 를 먼저 만들고
2) cmake.exe로 이 파일( CMakeLists.txt )에서 makefile을 만들고,
3) make.exe 를 실행 하는 방법으로 합니다.
=====================================
> 이에 따라 필요한 파일들을 설치 하고 실행 하는 과정을 보여 줍니다.
=====================================
자 그럼 해 보실까요
1. cmake 설치 : 저는 풀어 쓰는것을 좋아해서 풀어 쓰는 버전으로 갑니다.
> https://cmake.org/download/ 에서 cmake-3.31.4-windows-x86_64.zip (크기 45M 정도) 을 다운 받아 적당한데 풉니다.
이 파일이 32비트도 되는지 모르지만, 여기서는 win11 - 64bit 기준로 진행 합니다.
> 풀은 것의 bin 디렉토리를 보면 아래와 같읍니다.
> "cmd" 창을 열고 "path" 를 치면 나오는 환경변수 path 에 cmake bin 디렉토리 가 있도록 설정 하여,
"cmake --version" 를 치면, 버전이 나오게 합니다.
win11 의 경우 환경변수 설정 방법은 https://bahk33.tistory.com/182 를 참고 하셔요.
2. make.exe 설치
> minGW 또는 다른 것으로도 할 수 있겠으나 여기서는 xpack-dev-tools 에 있는 windows-build-tools-xpack 를 설치 합니다.
> https://github.com/xpack-dev-tools 에 접속 하여 선택 하든
> https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases/ 로 가서
> https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases/download/v4.4.1-3/xpack-windows-build-tools-4.4.1-3-win32-x64.zip ( 크기, 3M 정도, 아래 첨부 합니다 ) 를 다운로드 합니다.
> 다운 받은 xpack-windows-build-tools-4.4.1-3-win32-x64.zip 를 적당한데 풀어 주셔요
여기서는 E:\_t\_d\_VSCode\xpack-windows-build-tools-4.3.0-1\ 에 풀었으며
E:\_t\_d\_VSCode\xpack-windows-build-tools-4.3.0-1\bin 에 가보면 make.exe 가 있는것을 확인 할 수 있읍니다.
3. Arm gcc 설치 하기
- 소스(~.c) 파일을 컴파일 하는 컴파일러 (gcc.exe ) 를 설치 합니다. 여기서는 포터블 버전 사용 합니다.
- https://developer.arm.com/downloads/-/gnu-rm 에서
( 크기 195M 정도 ) 을 다운 받아 적당한데 풀어 줍니다.
- 여기서는 "E:\_t\_d\_VSCode\gcc-arm-none-eabi-10.3-2021.10" 에 풀었읍니다.
- 환경 변수 "ARM_TOOLCHAIN_DIR" 를 만들어 "E:\_t\_d\_VSCode\gcc-arm-none-eabi-10.3-2021.10\bin"로 설정 합니다.
* 사실 arm-none-eabi-gcc.cmake 라는 파일(아래에서 설명) 4번째 줄에 설정을 해도 되는데, 이상하게 win11 에서 에러 나네요.
4. "CMakeLists.txt" 파일 만들기
> 먼저 사용할 샘플 소스는 https://bahk33.tistory.com/181 에서 만든것을 이용 합니다.
이것을 이용하여 아래 것을 추가한 파일을 아래 첨부 합니다.
> "CMakeLists.txt" 와 아래에서 추가할 "arm-none-eabi-gcc.cmake" 파일 경로를 보여주는 그림 추가 합니다.
> 다운 받은 것에 있지만, Source Directory 안에 "CMakeLists.txt" 를 만듭니다.
cmake_minimum_required(VERSION 3.13)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools")
include(arm-none-eabi-gcc)
### Project 이름 설정, 암거나 하셔요
set(PRJ_NAME UART_AutoFlow)
project(${PRJ_NAME}
LANGUAGES ASM C CXX
)
set(EXECUTABLE ${PRJ_NAME}.elf)
file(GLOB SRC_FILES CONFIGURE_DEPENDS
_Lib/StdDriver/src/retarget.c
_Lib/StdDriver/src/clk.c
_Lib/StdDriver/src/sys.c
_Lib/StdDriver/src/uart.c
)
file(GLOB_RECURSE SRC_FILES_RECURSE CONFIGURE_DEPENDS
_Lib/NUC472_442/Source/*.c
_LIb/NUC472_442/Source/GCC/*.c
)
### Source File 부분
add_executable(${EXECUTABLE}
main.c
_Lib/NUC472_442/Source/GCC/startup_NUC472_442.S
${SRC_FILES}
${SRC_FILES_RECURSE}
)
#### Include directory 부분
target_include_directories(${EXECUTABLE} PRIVATE
_Lib/Include
_Lib/StdDriver/inc
_Lib/NUC472_442/Include
_LIb/NUC472_442/Source/GCC
)
target_compile_definitions(${EXECUTABLE} PRIVATE
)
target_compile_options(${EXECUTABLE} PRIVATE
-mcpu=cortex-m4
-mthumb
# -mfpu=fpv4-sp-d16
# -mfloat-abi=hard
-fsigned-char
-fdata-sections
-ffunction-sections
-fsingle-precision-constant
-Wall
-g3
-O0
)
target_link_options(${EXECUTABLE} PRIVATE
-T${CMAKE_CURRENT_SOURCE_DIR}/_LIb/NUC472_442/Source/GCC/gcc_arm.ld
-mcpu=cortex-m4
-mthumb
# -mfpu=fpv4-sp-d16
# -mfloat-abi=hard
-specs=nano.specs
-lc
-lm
-lstdc++
-lsupc++
-lnosys
-Wl,-Map=${PRJ_NAME}.map,--cref
-Wl,--gc-sections
-Xlinker -print-memory-usage -Xlinker
)
target_link_libraries( ${EXECUTABLE} PRIVATE
)
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_OBJCOPY} ARGS -O binary ${EXECUTABLE} ${PROJECT_NAME}.bin
COMMENT "Invoking: Make Binary"
)
#set_target_properties(${EXECUTABLE} PROPERTIES SUFFIX ".elf")
#add_custom_command(TARGET ${EXECUTABLE} POST_BUILD
# COMMAND arm-none-eabi-size --format=berkeley --totals "$<TARGET_FILE:${EXECUTABLE}>"
# COMMENT "Invoking: Cross ARM GNU Print Size")
> "CMakeLists.txt" 에 대하여 좀더 아시고 싶으신 분은
- https://github.com/lifeisforu/cmake_tutorial
- https://cmake.org/cmake/help/latest/manual/cmake-language.7.html
등을 참조 하셔요
5. "arm-none-eabi-gcc.cmake" 파일 만들기
> 소스 디렉토리에 "tools" 라는 디렉토리를 만들고 그 안에, "arm-none-eabi-gcc.cmake" 를 만든다.
> 아래 첨부한 파일에 들어 있읍니다.
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
#set(ARM_TOOLCHAIN_DIR "E:/_t/_d/_VSCode/gcc-arm-none-eabi-10.3-2021.10/bin")
if(DEFINED ENV{ARM_TOOLCHAIN_DIR})
set(ARM_TOOLCHAIN_DIR $ENV{ARM_TOOLCHAIN_DIR}/)
else()
if (WIN32)
message(FATAL_ERROR "ARM_TOOLCHAIN_DIR Not Defined")
endif()
endif()
message("ARM_TOOLCHAIN_DIR $ENV{ARM_TOOLCHAIN_DIR}")
find_program(CMAKE_MAKE_PROGRAM
NAMES make
make.exe
DOC "Find a suitable make program for building under Windows/MinGW"
HINTS E:/_t/_d/_VSCode/xpack-windows-build-tools-4.3.0-1/bin )
set(TOOLCHAIN_PREFIX ${ARM_TOOLCHAIN_DIR}arm-none-eabi-)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
if (WIN32)
set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}gcc.exe" CACHE FILEPATH "C Compiler path")
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}g++.exe" CACHE FILEPATH "C++ Compiler path")
else()
set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}gcc" CACHE FILEPATH "C Compiler path")
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}g++" CACHE FILEPATH "C++ Compiler path")
endif()
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "objcopy tool")
set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}size CACHE INTERNAL "size tool")
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
# Disable compiler checks.
set(CMAKE_C_COMPILER_FORCED TRUE)
set(CMAKE_CXX_COMPILER_FORCED TRUE)
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)
> 본 파일 안에 make.exe 파일 경로, 파일명을 지정 할 수 있읍니다. 적당하게 수정 하여 주셔요
> 퍼 온것은 MinGW 어쩌고 하지만 여기서는 "xpack-windows-build-tools" 를 이용 한것이니 그 경로를 넣었읍니다.
즉 여기서는 MinGW 는 쓰지 않읍니다.
6. Build ( Compile ) 하기
> Build 는 두단계 입니다.
1) cmake.exe 로 CMakeLists.txt 에서 makefile 만드는 단계
2) make.exe makefile 에서 bin 만들기 단계 - 하지만 여기서는 이 역시도 cmake 를 이용하여 합니다.
그럼 해 볼까요
>. cmake 로 CMakeLists.txt 에서 makefile 만들기
사실 설정 다 끝나서 간단 합니다.
그냥 cmake -S . -B build -G "MinGW Makefiles" 명령만 치면 끝납니다.
성공적으로 끝나면, build 디렉토리 안에 Makefile 이 만들어 져 있는것을 볼 수 있읍니다.
>. cmake 로 makefile 에서 bin 만들기
이 역시 앞에서 한것이 문제가 없다면 간단히 끝납니다
명령 cmake --build build -j16 를 치면 자동으로 됩니다.
실행이 성공적으로 끝나면, build 디렉토리 안에 바이너리 파일(~.bin, ~.elf) 만들어 져 있는것을 볼 수 있읍니다.
> 타겟 보드에 바이너리 파일 다운 로드 하면, 아래 그림과 같이 serial termanal 에서 결과를 볼 수 있읍니다.
수고 하셨읍니다.
*. 파일 첨부 합니다.
cmake-3.31.3-windows-x86_64.zip 45M 라 첨부 불가
gcc-arm-none-eabi-10.3-2021.10-win32.zip 200M 라 첨부 불가
xpack-windows-build-tools-4.3.0-1-win32-x64.zip
관련된 모든 파일은
https://1024terabox.com/s/14o6ublK_ChNyk_kNX44mLA
에서 받을 수 있읍니다.
다음글 은
3. Visual Source VS Code 로 nuvoton Build(Compile) 하기 ( https://bahk33.tistory.com/185 )
입니다.
==========================
수고 하셨읍니다.
도움이 되셨으면, 댓글 부탁합니다. 댓글 하나에 힘이 됩니다.
고맙읍니다.
'개발 > embed' 카테고리의 다른 글
make (makefile) 기초 (0) | 2025.02.06 |
---|---|
CMakeCache.txt: Error: unrecognized option '--major-image-version' (0) | 2025.01.21 |
Nuvoton 제공 Sample Code를 Keil 에서 Compile 하기 (0) | 2025.01.10 |
win11에 JTAGICE mkII driver설치 ( ATMega AVR Studio 4.19 ) (0) | 2024.12.10 |
c 로 trim ( white space 빈칸, 공백 등 삭제 ) 만들기, sample source (0) | 2024.08.06 |