[STM32F1] 如何在十六进制文件名称中添加版本号和 8 位哈希值

[复制链接]
412|13
小库里 发表于 2025-11-14 12:52 | 显示全部楼层 |阅读模式
如何在十六进制文件名称中添加版本号和 8 位 Git 哈希值,并在程序中访问这些信息?
有一个名为 Foo 的 STM32 项目,编译后会生成名为 Foo.hex 的英特尔十六进制文件,用于现场设备的程序升级。
我希望在文件名中添加以下信息:版本号,例如 10.1 或 10_1、Git 哈希值的最后 8 位,以及自上次 Git 提交后的编译次数。具体需求如下:
若我们提交的版本为 10.1,对应提交的 Git 哈希值后 8 位为 63245699,希望生成的文件名为 Foo10_1_0_63245699.hex;
当通过 I2C 询问版本时,Foo 程序需返回 10_1_0 或 10_1_0_63245699;
若电脑上的文件版本高于 STM32 板载程序版本,则激活引导程序,通过 I2C 升级软件;
再次编译程序时,自上次提交后的编译次数加 1,文件名变为 Foo10_1_1_63245699.hex;
第三次编译则为 Foo10_1_2_63245699.hex;
当我们再次提交代码时,手动升级版本号,自上次提交后的编译次数重置为 0,同时 Git 哈希值更新,例如生成文件名 Foo10_2_0_23798241.hex。
问题是如何将包含这些信息的文件名或对应的版本信息嵌入到程序中,使得程序通过 I2C 询问版本时,能输出相关内容?
此前已有同事在 Microchip 编译器 / IDE 中实现了该功能,现在我需要在 STM32CubeIDE 的编译流程中添加相同的功能。
在 Microchip IDE 中,他们通过修改 Makefile 实现,但 STM32CubeIDE 生成的 Makefile 标注有 “自动生成文件,请勿编辑”, 如果我强行修改,后续 IDE 升级可能会覆盖我的修改,导致功能失效,该如何处理?

公羊子丹 发表于 2025-12-8 07:25 | 显示全部楼层
我之前做 F1 的量产升级也遇到过类似需求,后来是用 pre-build 脚本生成一个 version.h,把 Git hash 和版本号写进去,程序里直接引用,这样不用动 CubeIDE 生成的 Makefile。
周半梅 发表于 2025-12-8 07:26 | 显示全部楼层
你可以试试自定义一个 shell 脚本,每次编译前自动读 Git 信息,然后拼出文件名,再把这些值写进两个常量区,用 I2C 回传的时候直接读,基本不影响原流程。
帛灿灿 发表于 2025-12-8 07:27 | 显示全部楼层
我以前用过 CubeIDE 的 Post-build steps,写一行 bash 调用 python,把 .hex 重命名,还顺便输出一个 C 文件存版本号,感觉比直接改 Makefile 安全得多,IDE 升级也不会覆盖。
童雨竹 发表于 2025-12-8 07:28 | 显示全部楼层
如果你担心编译次数记录不下来,可以把计数写到一个本地 txt 文件,脚本每次读、加一、再写回,这样跟 Git 解耦,不用依赖 commit 变化。
万图 发表于 2025-12-8 07:29 | 显示全部楼层
我试过用 git describe --dirty --long 的方式拿版本信息,其实很方便,版本号和 hash 都能一次拿全,你要的最后 8 位也可以直接切。
Wordsworth 发表于 2025-12-8 07:30 | 显示全部楼层
也可以考虑把版本号放进 linker script,定义几个 symbol,在程序里通过 extern 声明拿值,和 bootloader 交互时读这些 symbol 就行了。
Bblythe 发表于 2025-12-8 07:30 | 显示全部楼层
感觉你的需求更像 CI 流程做的事,如果你本地编译也要连续计数的话,最好把脚本放在工程目录,CubeIDE 只调用它,避免工程升级影响。
Pulitzer 发表于 2025-12-8 07:31 | 显示全部楼层
我以前见过有人直接在 .ld 加一段 KEEP(*(.version)),用 objcopy 从一个小文本文件转换成 .o 文件再链接进去,文件名和程序内部版本天然同步。
Uriah 发表于 2025-12-8 07:33 | 显示全部楼层
其实你也可以反过来,让程序用 const char version_string[] = "10_1_0_63245699" 这种形式,然后 Post-build 时读取 elf 里的这个符号来生成文件名,也不用再维护两份信息。
Clyde011 发表于 2025-12-8 07:33 | 显示全部楼层
我比较好奇你们升级流程里对版本比较的规则怎么定的,是字符串比对还是拆成数字?如果拉到 Git hash,可能要注意别把 hash 当成数值去比较。
734774645 发表于 2025-12-12 17:26 | 显示全部楼层
在十六进制文件名称中添加版本号和 8 位哈希值,核心是先计算文件的哈希值(截取 8 位)、确定版本号规则,再重命名文件。
jiekou001 发表于 2026-2-8 11:50 | 显示全部楼层
可以基于文件内容(保证唯一性)生成哈希值(如 MD5),再截取前 8 位并转为十六进制。
xinpian101 发表于 2026-2-11 16:18 | 显示全部楼层
你想要在十六进制格式的文件名称里,添加版本号和 8 位的哈希值,核心需求应该是生成一个包含这些信息的规范文件名,同时保证哈希值是 8 位且文件名称符合十六进制相关的命名规则。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

110

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0