cmake编译S32K的bin文件(2)

目录

一、S32DS文件目录

二、cmake移植文件目录

三 开始执行脚本

四、cmake目录


 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")

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值