返回首页

STM32 使用 GNU Make 通过 IAR 构建:CI/CD 自动化

本文描述了使用 IAR 编译器通过 GNU Make 自动构建 STM32 固件的设置过程。它涵盖了关键 IAR 实用工具、Makefile 结构、编译和链接选项的配置,以及与 CI/CD 系统集成用于工业开发的益处。

使用 IAR 和 Make 自动化 STM32 构建以用于 CI/CD
Advertisement 728x90

使用 IAR 和 GNU Make 自动化 STM32 固件构建,实现 CI/CD

将 IAR 编译器与 GNU Make 集成,能为嵌入式系统开发带来工业级自动化水平,摆脱对 IDE 的依赖,简化 CI/CD 流水线。这种方法允许你直接从命令行构建 STM32 微控制器固件,确保可重复性、可扩展性和与持续集成系统的无缝对接。

IAR 工具链及其命令行工具详解

IAR Embedded Workbench 内置了丰富的命令行工具,覆盖编译和链接的每一个步骤。主要组件包括:

  • iasmarm.exe — ARM 汇编器。
  • iccarm.exe — ARM C/C++ 编译器。
  • ilinkarm.exe — 链接器。
  • ielftool.exe — 生成二进制文件(HEX、BIN)的工具。

这些工具在 IDE 图形化构建时后台调用,你也可以在脚本中直接调用。通过查看 IAR IDE 的构建日志,就能精确提取每个工具的命令行参数。例如,iccarm.exe 编译器的常见选项包括 --cpu=Cortex-M4--fpu=VFPv4_sp--debug,以及禁用优化的标志如 --no_inline--no_cse

Google AdInline article slot

为 IAR 编写 Makefile

核心目标是创建一个 Makefile,能正确调用 IAR 工具并传入合适参数。脚本应通过 IAR_PATH 环境变量或系统 PATH 灵活定位工具。以下是定义工具变量的示例:

ifdef IAR_PATH
    CC = $(IAR_PATH)/iccarm.exe
    AS = $(IAR_PATH)/iasmarm.exe
    LD = $(IAR_PATH)/ilinkarm.exe
    ELF_TOOL = $(IAR_PATH)/ielftool.exe
else
    CC = iccarm.exe
    AS = iasmarm.exe
    LD = ilinkarm.exe
    ELF_TOOL = ielftool.exe
endif

Makefile 的关键部分包括:

  • 编译标志 (CFLAGS):IAR 专属选项,如目标核心选择、FPU 设置和调试信息。
  • 汇编标志 (ASFLAGS):处理汇编文件的参数。
  • 链接标志 (LDFLAGS):链接器选项,包括配置文件 (.icf) 和入口点。
  • 构建规则:将源文件 (.c、.s) 编译成目标文件 (.o),并链接成可执行文件 (.out)。

编译器配置与关键选项

要实现可靠构建,必须精确配置 IAR 编译器选项。对于典型的 STM32F407 (Cortex-M4) 项目,常见标志包括:

Google AdInline article slot
  • --cpu=Cortex-M4:指定目标 CPU 核心。
  • --fpu=VFPv4_sp:启用浮点单元。
  • --endian=little:设置字节序。
  • -e:启用 IAR C 语言扩展。
  • --debug:添加调试信息。
  • 优化控制,如 --no_inline 禁用内联函数。

这些选项汇总到 Makefile 中的 COMPILE_IAR_OPT 变量。你还可以用 --diag_suppress 抑制特定编译器警告。

链接过程与最终产物生成

IAR 链接器 (ilinkarm.exe) 使用链接脚本 (.icf) 将目标文件合并,并映射到微控制器内存。主要链接选项:

  • --config $(LDSCRIPT):指向链接配置文件。
  • --entry __iar_program_start:定义程序入口点。
  • --semihosting:启用半主机调试。
  • --map $(BUILD_DIR)/$(TARGET).map:生成内存映射。

.out 文件生成后,ielftool.exe 将其转换为可烧录格式:

Google AdInline article slot
  • --ihex 生成 HEX 文件。
  • --bin 生成二进制镜像。

CI/CD 集成与核心优势

将 GNU Make 与 IAR 结合,为专业嵌入式开发带来颠覆性优势:

  • 自动化:在 CI/CD 服务器(如 Jenkins、GitLab CI)上自动触发构建,无需手动干预。
  • 可重复性:Makefile 确保跨机器结果一致,不像 IDE 设置受环境影响。
  • 可扩展性:只需修改几行代码,即可添加新构建配置(如不同设备型号),无需调整大量 IDE 设置。
  • IDE 独立:使用任意编辑器或 IDE,不被 IAR Embedded Workbench 锁定。
  • 编译器对比:轻松切换编译器(如 IAR 和 GCC),便于交叉验证和排查 bug。

一步步实施指南

  • 安装 IAR Embedded Workbench,确保命令行工具在 PATH 中,或设置 IAR_PATH 变量。
  • 分析现有 IAR 项目(如 STM32CubeMX 生成的项目),从 IDE 构建日志提取编译标志。
  • 创建基础 Makefile,包含工具变量、编译/链接标志和构建规则。
  • 调整链接脚本 (.icf),适配目标平台。
  • 命令行测试构建,验证 HEX/BIN 输出。
  • 接入 CI/CD,在流水线中添加 make 调用。

关键要点

  • 构建自动化:GNU Make 完全自动化 IAR 固件编译,消除 IDE 手动操作。
  • 配置灵活:通过 Makefile 轻松管理多构建变体,对产品线项目至关重要。
  • CI/CD 集成:无缝接入持续集成/交付,加速开发周期。
  • 工具独立:开发者摆脱特定 IDE 束缚,提升工作流灵活性。
  • 代码质量提升:多编译器构建能发现隐藏 bug,提高代码可移植性。

— Editorial Team

Advertisement 728x90

继续阅读