Keil5 Build Command 技巧

前言

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

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

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

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

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

Build Command

Keil 提供的 Command Items,在 Keil - 魔术棒 - User 里,分别提供了几个选项:

  • Before Compile C/C++ File - 编译 C/C++ 文件之前运行
  • Before Build/Rebuild - 编译之前运行
  • After Build/Rebuild - 编译之后运行

每个选项提供了两条可运行的命令,我们需要根据需求在 User Command 中填入相应的命令,以实现所需功能。

基于我们之前的需求,即在编译之后运行命令将输出文件拷贝到目标目录,我们需要使用 After Build/Rebuild 选项。然而,Keil 只提供了两条可运行的命令,这对于我们的需求显然是不够的。所以我保留了一条用于将 .axf 文件转换为 .bin 的命令,将另一条命令用来实现文件的拷贝操作。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
set BUILD_NAME=%1
set OUTPUT_PATH="..\..\build_out"

mkdir %OUTPUT_PATH% 2>nul

copy Listings\%BUILD_NAME%.bin %OUTPUT_PATH% >nul
copy Listings\%BUILD_NAME%.map %OUTPUT_PATH% >nul
copy Objects\%BUILD_NAME%.hex %OUTPUT_PATH% >nul
copy Objects\%BUILD_NAME%.axf %OUTPUT_PATH% >nul

echo Done

exit /b 0

在 Keil 中,填写的命令如下图所示:

命令为:.\build_script.bat test_project

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

  1. 设置变量:通过 set BUILD_NAME=%1 接收传入的参数,对应项目的名称。
  2. 设置输出路径:使用 set OUTPUT_PATH=“…..\build_out” 指定输出文件的路径。
  3. 创建输出目录:使用 mkdir %OUTPUT_PATH% 2>nul 判断输出目录是否存在,如果不存在则创建它。
  4. 复制文件:使用 copy 命令将生成的 .bin、.map、.hex 和 .axf 文件复制到输出目录中。
  5. 完成提示:脚本执行完成后,打印提示信息 Done 并退出。

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

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

结语

所以善用,Keil 的 Build Command,可以实现不同的效果,不需要局限与我上述的需求例子。