S32DS Build Command 技巧

前言

这一篇与上一篇介绍 Keil MDK IDE 基本一致,所以直接引用上一篇的前言。

Keil MDK 是嵌入式开发中高频使用的 IDE 工具,许多芯片的 SDK 都包含 keil 对应的开发工程。

最近在使用过程中,同事提出了一个需求,希望将编译的输出文件(如 bin、hex、axf、map)统一输出到整个项目的根目录,便于统一管理,这样就不用每次进入项目里,一层一层的查找输出的文件。这些文件还可能分布在不同的地方,例如 ./Listings 目录中存放 .bin.map 文件,而 ./Objects 目录中存放 .axf.hex 文件。这对不了解项目结构的工程师非常不友好。

对于他的考虑,我完全赞同,因为在一个项目中,后续接手的人可能不需要了解代码的具体实现和工程结构,他们只需要找到对应的输出文件,拿来对芯片进行烧录。

既然需求有了,那么就需要考虑怎样实现了,原先我想的是在根目录里,写一个 python 脚本,直接运行定位到具体文件路径并拷贝出来,但是这样还需要多一个步骤,就是手动运行脚本,所以不是特别的自动化,那么有没有办法直接在运行的过程中,就将文件处理好呢?

当然是有的,不然就没有这篇文章了,Keil 提供的 Command Items,可以实现上面的需求。

Build Command

S32DS 提供的 Build Command,在 菜单栏 - Project - Properties - C/C++ Build - Settings - Build Steps 里,可以找到以下选项:

  • Pre-build steps - 编译前运行
  • Post-build steps - 编译后运行

提供了一条可运行项,用户可以根据自己的需求填入相应的命令,实现所需的功能。

基于上面提出的需求,需要在编译之后,将输出文件拷贝到指定目录。因此,我们需要利用 Post-build steps 功能,在编译完成后执行相关命令,将输出文件拷贝到目标文件夹中。

首先,在工程目录中(即 .mex 文件所在的目录),创建一个 .bat 文件。我将其命名为 build_script.bat,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
REM Check if ProjName parameter is provided
if "%1"=="" (
echo Usage: build_script.bat ProjName
exit /b 1
)

REM Set ProjName Variable
set ProjName=%1

REM Set Build Path Variable
set OUTPUT_PATH="..\build_out"

REM Create build_out directory if it doesn't exist
if not exist %OUTPUT_PATH% mkdir %OUTPUT_PATH%

REM Execute objcopy commands with ProjName
copy %ProjName%.elf %OUTPUT_PATH% >nul
copy %ProjName%.map %OUTPUT_PATH% >nul
arm-none-eabi-objcopy -O srec %ProjName%.elf %OUTPUT_PATH%\%ProjName%.s19
arm-none-eabi-objcopy -O ihex %ProjName%.elf %OUTPUT_PATH%\%ProjName%.hex
arm-none-eabi-objcopy -O binary %ProjName%.elf %OUTPUT_PATH%\%ProjName%.bin

echo Compilation completed successfully. Output files copied to build_out folder.

在 S32DS 中,在 菜单栏 - Project - Properties - C/C++ Build - Settings - Build Steps 中的 Post-build steps 中填入以下命令:../build_script.bat ${ProjName}

这个 .bat 文件的主要功能如下:

  1. 接收参数:通过 set ProjName=%1 接收传入的参数,对应 S32DS 工程的名称 ${ProjName}
  2. 设置输出路径:使用 set OUTPUT_PATH="..\build_out" 指定输出文件的路径。
  3. 创建输出目录:使用 if not exist %OUTPUT_PATH% mkdir %OUTPUT_PATH% 判断输出目录是否存在,如果不存在则创建它。
  4. 复制文件:使用 copy 命令将生成的 .elf.map 文件复制到输出目录中。
  5. 生成其他格式文件:使用 arm-none-eabi-objcopy 命令将 .elf 文件转换为 .s19.hex.bin 格式,并存放在输出目录中。
  6. 完成提示:脚本执行完成后,打印提示信息 Compilation completed successfully. Output files copied to build_out folder.

通过上述步骤,我们可以在编译完成后,自动将所有需要的输出文件统一拷贝到指定的目录中,从而实现统一管理,简化后续操作。

所以每次编译完,就会运行对应的 .bat 脚本,将输出的内容 copy 到对应的文件,这样,就完成了之前提出的需求了。

结语

上述就是针对 S32DS 这个 IDE,运用其提供的对应的 Build Command,完成我们需要的一些需求,当然不局限于我上述的,可以根据自己的需求,利用该功能定制化实现。