目录
Project_Settings 这是启动文件
SDK 这是将寄存器封装成函数调用接口
Generated_Code S32DS组件库,调用SDK生成模块对应接口函数
Suorces 自己的文件,包含函数
这是我们主要要移植的代码,顺序从上往下不能混淆。
二、cmake移植文件目录
.vscode 配置文件
build 生成文件bin文件目录
cmake cmake执行脚本,从最下面的txt进入
code 移植代码
三 开始执行脚本
最下面txt,cmake脚本
# cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
# min 需要最低版本的 cmake max 最高版本 。。。 区间
cmake_minimum_required(VERSION 3.19)
# project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
# project(<PROJECT-NAME>
# [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
# [LANGUAGES <language-name>...])
# 为整个项目设置名称、版本和启用语言
project(tpms
VERSION 6.0.0
LANGUAGES C ASM
)
# SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
# list(LENGTH <list><output variable>)
# list(GET <list> <elementindex> [<element index> ...]<output variable>)
# list(APPEND <list><element> [<element> ...])
# list(FIND <list> <value><output variable>)
# list(INSERT <list><element_index> <element> [<element> ...])
# list(REMOVE_ITEM <list> <value>[<value> ...])
# list(REMOVE_AT <list><index> [<index> ...])
# list(REMOVE_DUPLICATES <list>)
# list(REVERSE <list>)
# list(SORT <list>)
#
# LENGTH 返回list的长度
# GET 返回list中index的element到value中
# APPEND 添加新element到list中
# FIND 返回list中element的index,没有找到返回-1
# INSERT 将新element插入到list中index的位置
# REMOVE_ITEM 从list中删除某个element
# REMOVE_AT 从list中删除指定index的element
# REMOVE_DUPLICATES 从list中删除重复的element
# REVERSE 将list的内容反转
# SORT 将list按字母顺序排序
# 将当前目录下的cmake文件夹加入环境变量
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
# 从文件或模块加载和运行 CMake 代码
# include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>][NO_POLICY_SCOPE])
#
include(utilities)
# add_compile_definitions(<definition> ...)
# 将预处理器定义添加到源文件的编译中。 宏定义
add_compile_definitions(
CPU_S32K144HFT0VLLT
USING_OS_RTTHREAD
)
# add_subdirectory(source_dir [binary_dir][EXCLUDE_FROM_ALL])
# 将子目录添加到构建中
add_subdirectory(code)
# 设置源文件
set(SOURCES code/Sources/main.c)
# add_executable(<name> [WIN32] [MACOSX_BUNDLE]
# [EXCLUDE_FROM_ALL]
# source1 [source2 ...])
# 使用指定的源文件向项目添加可执行文件
# main.c 启动文件
#
# set_target_properties(target1 target2 ...
# PROPERTIES prop1 value1
# prop2 value2 ...)
# 目标可以具有影响其构建方式的属性。
# 链接库 后缀
#
# target_link_options(<target> [BEFORE]
# <INTERFACE|PUBLIC|PRIVATE> [items1...]
# [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
# 向目标添加链接选项。
# PRIVATE和PUBLIC
function(create_target TARGET STARTUP LINKER)
add_executable(${TARGET}
${SOURCES}
${STARTUP}
)
set_target_properties(${TARGET}
PROPERTIES
LINK_DEPENDS ${LINKER}
SUFFIX ".elf"
)
target_link_options(${TARGET}
PUBLIC
-T${LINKER} -Wl,-Map=${TARGET}.map
)
target_link_libraries(${TARGET}
-Wl,--whole-archive
# -Wl,--start-group
sdk
Generated_Code
source
# -Wl,--end-group
-Wl,--no-whole-archive
)
create_bin_output(${TARGET})
create_hex_output(${TARGET})
firmware_size(${TARGET})
# symbol_size(${TARGET})
endfunction()
set(LINKER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/code/Project_Settings/Linker_Files/S32K144_64_flash.ld")
set(STARTUP_FILE "${CMAKE_CURRENT_LIST_DIR}/code/Project_Settings/Startup_Code/startup_S32K144.S")
create_target(${PROJECT_NAME} ${STARTUP_FILE} ${LINKER_SCRIPT})
四、cmake目录
utilities.cmake 生成文件时会打印文件大小
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# 低于最低版本报错,平常是警告
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
# Create the bin output 创建二进制输出文件
# function(<name>[arg1 [arg2 [arg3 ...]]])
# COMMAND1(ARGS ...)
# COMMAND2(ARGS ...)
# ...
# endfunction(<name>)
# 定义一个函数名为<name>,参数名为arg1 arg2 arg3(…)。
# 函数体内的命令直到函数被调用的时候才会去执行。
# 其中ARGC变量表示传递给函数的参数个数。
# ARGV0, ARGV1, ARGV2代表传递给函数的实际参数。
# ARGN代表超出最后一个预期参数的参数列表,
# 例如,函数原型声明时,只接受一个参数,那么调用函数时传递给函数的参数列表中,
# 从第二个参数(如果有的话)开始就会保存到ARGN。
#
# 在很多时候,需要在cmake中创建一些目标,如clean、copy等等,
# 这就需要通过add_custom_target来指定。
# 同时,add_custom_command可以用来完成对add_custom_target生成的target的补充。
# add_custom_target(Name [ALL] [command1 [args1...]]
# [COMMAND command2 [args2...] ...]
# [DEPENDS depend depend depend ... ]
# [BYPRODUCTS [files...]]
# [WORKING_DIRECTORY dir]
# [COMMENT comment]
# [JOB_POOL job_pool]
# [VERBATIM] [USES_TERMINAL]
# [COMMAND_EXPAND_LISTS]
# [SOURCES src1 [src2...]])
#
# ALL:表明该目标会被添加到默认的构建目标,使得它每次都被运行;
# COMMAND:指定要在构建时执行的命令行;
# DEPENDS:指定命令所依赖的文件;
# COMMENT:在构建时执行命令之前显示给定消息;
# WORKING_DIRECTORY:使用给定的当前工作目录执行命令。如果它是相对路径,它将相对于对应于当前源目录的构建树目录;
# BYPRODUCTS:指定命令预期产生的文件。
#
# 调用arm-none-eabi-objcopy.exe
# D:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2020-q4-major\bin
# 将elf转换为bin hex
# 带路径的文件 指令 源文件 生成文件
function(create_bin_output TARGET)
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin)
endfunction()
# Creates output in hex format 创建八进制输出文件
function(create_hex_output TARGET)
add_custom_target(${TARGET}.hex ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
endfunction()
# Add custom command to print firmware size in Berkley format
# 添加自定义命令以伯克利格式打印固件大小
function(firmware_size TARGET)
add_custom_target(${TARGET}.size ALL
DEPENDS ${TARGET}
# COMMAND ${CMAKE_SIZE_UTIL} -B ${TARGET}.elf
COMMAND ${CMAKE_SIZE_UTIL} ${TARGET}.elf
# COMMAND ${CMAKE_SIZE_UTIL} -B ${TARGET}.hex
# COMMAND ${CMAKE_SIZE_UTIL} --format=berkeley ${TARGET}.elf ${TARGET}.hex
)
endfunction()
# Output size of symbols in the resulting elf
# 打印十六进制文件大小
function(symbol_size TARGET)
add_custom_target(${TARGET}.nm ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_NM_UTIL} --print-size --size-sort --radix=d ${TARGET}.elf)
endfunction()
arm-gcc-cortex-m4.cmake 编译条件
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
set(MCPU_FLAGS "-mthumb -mcpu=cortex-m4")
set(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(LD_FLAGS "")
set(SPECS_FLAGS "-specs=nano.specs -specs=nosys.specs")
include(${CMAKE_CURRENT_LIST_DIR}/arm-gcc-toolchain.cmake)
arm-gcc-toolchain.cmake 编译工具
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TARGET_TRIPLET "arm-none-eabi-")
# do some windows specific logic 一些特定于Windows的逻辑
# 执行一个或多个子进程。
# COMMAND CMake使用操作系统的APIs直接执行子进程。所有的参数逐字传递。
# 没有中间脚本被使用
# 将二进制文件变成window可执行文件
if(WIN32)
set(TOOLCHAIN_EXT ".exe")
execute_process(
COMMAND ${CMAKE_CURRENT_LIST_DIR}/vswhere.exe -latest -requires Component.MDD.Linux.GCC.arm -find **/gcc_arm/bin
OUTPUT_VARIABLE VSWHERE_PATH
)
else()
set(TOOLCHAIN_EXT "")
endif(WIN32)
# default to Release build 默认为发布构建
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
"Choose the type of build, options are: Debug Release."
FORCE)
endif()
# 查找程序 arm-none-eabi-gcc.exe
find_program(COMPILER_ON_PATH "${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT}")
if(DEFINED ENV{ARM_GCC_PATH})
# use the environment variable first 首先使用环境变量
file(TO_CMAKE_PATH $ENV{ARM_GCC_PATH} ARM_TOOLCHAIN_PATH)
message(STATUS "Using ENV variable ARM_GCC_PATH = ${ARM_TOOLCHAIN_PATH}")
elseif(COMPILER_ON_PATH)
# then check on the current path 然后检查当前路径
get_filename_component(ARM_TOOLCHAIN_PATH ${COMPILER_ON_PATH} DIRECTORY)
message(STATUS "Using ARM GCC from path = ${ARM_TOOLCHAIN_PATH}")
elseif(DEFINED VSWHERE_PATH)
# try and find if its installed with visual studio
# 试着看看它是否安装了visual studio
file(TO_CMAKE_PATH ${VSWHERE_PATH} ARM_TOOLCHAIN_PATH)
string(STRIP ${ARM_TOOLCHAIN_PATH} ARM_TOOLCHAIN_PATH)
message(STATUS "Using Visual Studio install ${ARM_TOOLCHAIN_PATH} yes")
# else()
# # otherwise just default to the standard installation
# set(ARM_TOOLCHAIN_PATH "C:/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/bin")
# message(STATUS "Using ARM GCC from default Windows toolchain directory ${ARM_TOOLCHAIN_PATH}")
endif()
# perform compiler test with the static library 使用静态库执行编译器测试
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 设置编译工具的路径 arm-none-eabi-gcc.exe
# D:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2020-q4-major\bin
set(CMAKE_C_COMPILER ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
set(CMAKE_CXX_COMPILER ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}g++${TOOLCHAIN_EXT})
set(CMAKE_ASM_COMPILER ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
set(CMAKE_LINKER ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
set(CMAKE_SIZE_UTIL ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}size${TOOLCHAIN_EXT})
set(CMAKE_OBJCOPY ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objcopy${TOOLCHAIN_EXT})
set(CMAKE_OBJDUMP ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objdump${TOOLCHAIN_EXT})
set(CMAKE_NM_UTIL ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}nm${TOOLCHAIN_EXT})
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)
set(CMAKE_COMMON_FLAGS " -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wunused -Wuninitialized -Wall")
set(CMAKE_C_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${SPECS_FLAGS} ${CMAKE_COMMON_FLAGS}")
set(CMAKE_CXX_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${SPECS_FLAGS} ${CMAKE_COMMON_FLAGS}")
set(CMAKE_ASM_FLAGS " -Wa,-mimplicit-it=thumb -mcpu=cortex-m4 -x assembler-with-cpp ${VFP_FLAGS} ${SPECS_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${LD_FLAGS} -Wl,--gc-sections,-print-memory-usage")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_CXX_ASM_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_C_ASM_FLAGS_DEBUG "-g3")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "")
set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_ASM_FLAGS_RELEASE "")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto")