You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CMake实现跨架构编译并生成统一boot启动镜像

多异构处理器统一CMake构建方案实现

核心实现思路

该场景属于典型的异构多核心嵌入式项目构建需求,CMake原生支持通过外部项目模块实现跨架构的分级构建,完全可以满足与CMake Tools插件的集成要求,无需额外写三方调度脚本。

关键用到的CMake能力

  • ExternalProject 模块:用于定义每个处理器架构的独立构建任务,支持指定不同的工具链、编译参数、源码路径、输出路径
  • add_custom_command + add_custom_target:用于定义boot文件的生成规则,把各个架构输出的elf文件作为依赖,调用镜像整合工具生成最终boot文件
  • target_depends/DEPENDS 参数:用于绑定全链路依赖关系,确保修改任意架构的源码都会触发对应重编译,最后自动更新boot文件

具体实现示例

1. 参考项目目录结构

项目根目录
├── CMakeLists.txt          # 总控CMake配置,即下文要编写的文件
├── cortex_m/               # Cortex核心的源码、专属CMake配置、工具链文件
├── dsp0/                   # 第一个DSP核心的源码、专属CMake配置、工具链文件
├── dsp1/                   # 第二个DSP核心的源码、专属CMake配置、工具链文件
└── tools/                  # 镜像整合工具、段合并脚本等

2. 总控CMakeLists.txt核心代码

cmake_minimum_required(VERSION 3.16)
project(multi_core_boot ASM C CXX)
# 引入外部项目模块
include(ExternalProject)

# 定义Cortex核心构建任务
ExternalProject_Add(cortex_build
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cortex_m
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/cortex_m
    CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cortex_m/arm_gcc_toolchain.cmake
    INSTALL_COMMAND "" # 禁用默认安装步骤
    BUILD_ALWAYS 0 # 仅源码变更时才触发重编译
)

# 定义第一个DSP核心构建任务
ExternalProject_Add(dsp0_build
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dsp0
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/dsp0
    CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/dsp0/dsp_toolchain.cmake
    INSTALL_COMMAND ""
    BUILD_ALWAYS 0
)

# 定义第二个DSP核心构建任务
ExternalProject_Add(dsp1_build
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dsp1
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/dsp1
    CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/dsp1/dsp_toolchain.cmake
    INSTALL_COMMAND ""
    BUILD_ALWAYS 0
)

# 定义各核心输出elf文件路径,替换为你实际的输出文件名
set(CORTEX_ELF ${CMAKE_CURRENT_BINARY_DIR}/build/cortex_m/cortex_app.elf)
set(DSP0_ELF ${CMAKE_CURRENT_BINARY_DIR}/build/dsp0/dsp0_app.elf)
set(DSP1_ELF ${CMAKE_CURRENT_BINARY_DIR}/build/dsp1/dsp1_app.elf)

# 定义boot文件生成规则,COMMAND替换为你实际的镜像整合命令
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/final_boot.bin
    DEPENDS cortex_build dsp0_build dsp1_build ${CORTEX_ELF} ${DSP0_ELF} ${DSP1_ELF}
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/boot_packer 
        --cortex-elf ${CORTEX_ELF} 
        --dsp0-elf ${DSP0_ELF}
        --dsp1-elf ${DSP1_ELF}
        --output ${CMAKE_CURRENT_BINARY_DIR}/final_boot.bin
    COMMENT "Packing final boot file..."
)

# 定义默认构建目标,CMake Tools会自动识别
add_custom_target(boot ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/final_boot.bin)

3. 跨核心依赖处理(比如Cortex镜像依赖DSP生成的头文件)

如果存在核心间的依赖关系,只需要在对应ExternalProject_Add中添加DEPENDS参数即可,例如Cortex需要等待DSP0构建完生成头文件后再编译:

ExternalProject_Add(cortex_build
    # 原有配置保持不变
    DEPENDS dsp0_build
)

同时在Cortex的CMake配置中把DSP0构建输出的头文件路径加入头文件搜索目录,依赖链路就会自动生效。

VSCode CMake Tools适配

该方案无需额外配置,CMake Tools会自动识别总控项目的所有目标,点击构建默认会触发boot目标的全链路构建,修改任意核心的源码都会自动触发对应核心的重编译,最终生成新的boot文件。

内容的提问来源于stack exchange,提问作者Russ Schultz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:15:04