文章目录
- 前言
- 1 软件、工具和插件安装
- 1.1 vscode安装
- 1.2 cmake安装
- 1.3 安装LLVM
- 1.4 安装Ninja
- 1.5 vscode插件安装
- 2 工具链和CMakeLists
- 2.1 工具链(toolchain.cmake)
- 2.2 CMakeLists.txt
- 2.3 基本语法注释
前言
本文是一个使用vscode的小白扫盲贴。
所谓工欲善其事必先利其器,作为码农的生产工具,vscode的开发配置是生产的第一步。
1 软件、工具和插件安装
本章内容主要参考下面这篇文章。
链接:vscode + cmake + ninja + ARMCC 配置stm32开发环境(构建篇)
以下做一些简单补充。
1.1 vscode安装
没啥好说的,官网下载,无脑安装。
1.2 cmake安装
参考上面链接文章,讲的很详细。
1.3 安装LLVM
链接: LLVM Release
链接: github 安装包
GitHub的跳转总是会抽,可以尝试用git clone下载。
本文提供下载好的文件,有需要自取。
LLVM 是一套编译器基础设施项目,以 C++ 写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、执行时期以及“闲置时期”的优化。LLVM广泛应用于高性能计算、嵌入式系统、移动设备等多种领域。
1.4 安装Ninja
Ninja的安装和编译需要特殊说明一下:
Ninja的使用需要安装visual studio(VS的IDE),并安装C++开发的一些工具,要不然找不到vcvarsall.bat这个文件,无法完成Ninja的编译,也无法完成后续的cmake configuration。
Ninja的安装可以直接下载发布版(ninja-win.zip,无需编译),并直接解压后将Ninja加入环境变量。
Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。
1.5 vscode插件安装
Clangd
CMake
CMake Tools
CMake Language Support
2 工具链和CMakeLists
2.1 工具链(toolchain.cmake)
在settings.json中添加如下参数,编译时引用TOOLCHAIN,省的每次编译都要输路径。
"cmake.configureArgs": ["-DCMAKE_TOOLCHAIN_FILE=${sourceDir}/armcc_toolchain.cmake"]
armcc_toolchain.cmake
简单写了一个demo。
注意:cmake对armcc的识别有版本兼容要求,我在测试armcc v5.06版本时,cmake始终无法识别编译器,因此CMAKE_C_COMPILER 一直是clang,output显示“The C compiler identification is unknown”。
下面demo将路径切换到armclang,可以识别。
option(USE_ARMCC "USE_ARMCC" OFF)
option(USE_ARMCLANG "USE_ARMCLANG" ON)if (USE_ARMCLANG)message(NOTICE "USE_ARMCLANG")set(TOOLCHAIN_PATH "D:/Program Files/Keil_v5/ARM/ARM_Compiler_5.06u7/bin")set(TOOLCHAIN_PATH "D:/Program Files/Keil_v5/ARM/ARMCLANG/bin")set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/armclang.exe")set(CMAKE_C_COMPILER_ID "ARMCC")message(NOTICE ${CMAKE_C_COMPILER})set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH}/armclang.exe")set(CMAKE_CXX_COMPILER_ID "ARMCC")set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PATH}/armasm.exe")set(CMAKE_ASM_COMPILER_ID "ARMASM")set(CMAKE_C_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlink.exe")set(CMAKE_CXX_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlink.exe")set(CMAKE_ASM_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlink.exe")set(CMAKE_C_ARCHIVE_CREATE "${TOOLCHAIN_PATH}/armar.exe")set(FROMELF "${TOOLCHAIN_PATH}/armar.exe")# set(CMAKE_TRY_COMPILE_TARGET_TYPE STAIC_LIBRARY)endif()
注意如下的output信息。toolchain生效和armclang识别。
2.2 CMakeLists.txt
以下是个DEMO,其中还有很多不足,根据具体项目需要调整。
其中,cmake_policy(SET CMP0123 NEW)不是必须的,根据选用的编译器设置。
cmake_minimum_required(VERSION 3.20) ##支持的cmake最低版本
cmake_policy(SET CMP0123 NEW)set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION "0.0.1")
set(CMAKE_SYSTEM_PROCESSOR Cotex-M0+)
set(CORE_TYPE ac780x)set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)# project setting
project("FOC" VERSION 0.0.1 LANGUAGES C ASM)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)message(NOTICE "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")if (USE_ARMCLANG)# 设置C编译器标志# -mcpu=cortex-m0+: 目标 CPU 架构为 Cortex-M0+。# -mthumb: 生成 Thumb 代码。# -mfpu=fpv4-sp-d16: 浮点单元为 FPv4。# -O2: 较强的优化。# -g: 包含调试信息。# -Wall -Wextra: 开启所有警告和额外警告。# --apcs=interwork 选项意味着编译器将生成支持 interworking 的代码,即能够在 Thumb 和 ARM 状态之间平滑切换的代码。set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=${CMAKE_SYSTEM_PROCESSOR} -mthumb -O2 --pd '__EVAL SETA 1' -g --apcs=interwork --pd '__MICROLIB SETA 1' -Wall -Wextra")# 设置ASM编译器标志set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mcpu=${CMAKE_SYSTEM_PROCESSOR} -mthumb -O2 --apcs=interwork")endif()set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
set(ELF_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf)#file(GLOB_RECURSE C_SOURCES CONFIGURE_DEPENDS *.c *.h)
set(C_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Code/Application/main.c)
message(NOTICE "C_SRC_DIR: ${C_SOURCES}")include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Code/Application${CMAKE_CURRENT_SOURCE_DIR}/Code/Configuration${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers/ATC_Driver/Inc${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers/Device/Include${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers/Device/Include/CMSIS${CMAKE_CURRENT_SOURCE_DIR}/Code/Foc_Lib/include${CMAKE_CURRENT_SOURCE_DIR}/Code/Math${CMAKE_CURRENT_SOURCE_DIR}/Code/Motor)add_executable(${PROJECT_NAME} ${C_SOURCES} )
link_libraries(${CMAKE_CURRENT_SOURCE_DIR}/Code/Foc_Lib/src/Foc_Lib.lib)add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMENT "Building ${HEX_FILE}"COMMAND ${ARMCC_FROMELF} --i32combined --output="${HEX_FILE}" "${ELF_FILE}")