搜索
bottom↓
回复: 93

[分享]一个小技巧在SMT32程序HEX文件中加入固件版本信息

  [复制链接]

出0入0汤圆

发表于 2020-6-28 13:10:41 | 显示全部楼层 |阅读模式
本帖最后由 icode 于 2020-6-28 17:01 编辑

分享一个小技巧,使用MDK编译器,让STM32程序HEX文件中加入固件版本信息,估计很多老手都已经在使用(你有好的方法欢迎分享,希望我的砖能引来你的玉),该方法献给新手或初学者。
代码如下:(已更新!!! 根据5楼坛友 wudicgi 建议更新, 之前没想到常量字符串还可以这样连接...^|^...),使用的一些细节问题见 [14楼]
  1. //------------------------------------------------------------------------------
  2. #include <absacc.h>

  3. //------------------------------------------------------------------------------
  4. #define VERINFO_ADDR_BASE   (0x8009F00) // 版本信息在FLASH中的存放地址
  5. const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Hardware: 1.0.0";
  6. const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20)))  = "Firmware: 1.0.0";
  7. const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
  8. const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;

  9. //------------------------------------------------------------------------------
复制代码


选项配置中:Flash地址与大小不用做任何修改!


HEX文件:


串口打印输出:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2020-6-28 14:55:15 | 显示全部楼层
wudicgi 发表于 2020-6-28 14:19
"Date: " __DATE__ 就可以了,字符串常量编译时可以连接

感谢你的分享, 之前没想到常量字符串还可以这样连接



出0入0汤圆

 楼主| 发表于 2020-6-28 15:26:04 | 显示全部楼层
本帖最后由 icode 于 2020-6-28 16:14 编辑
xiaomu 发表于 2020-6-28 14:58
这样可以, 但是有一个缺点,就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。

其 ...

是的, 程序末尾 到 VERINFO_ADDR_BASE地址这一段会被填充成0x00, 根据需要可以修改 VERINFO_ADDR_BASE 减小地址 或者说 不强制指定地址,  由编译器自动分配, 但这样就要去找相应的版本标识字符串了。
不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。
方法如下:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2020-6-28 15:39:54 | 显示全部楼层
wudicgi 发表于 2020-6-28 15:17
现在 LZ 位的代码有点问题,少空格了
另外这么放一块的话,printf() 输出的时候貌似就比较别扭了

LZ位上更新的代码复制粘贴上去的,应该没问题的(测试过了的)
大佬分享的这个不错哈

出0入0汤圆

 楼主| 发表于 2020-6-28 16:16:56 | 显示全部楼层

IAR没有试过,不过应该是可以的,方法思路是差不多的。

出0入0汤圆

 楼主| 发表于 2020-6-28 16:51:05 | 显示全部楼层
meirenai 发表于 2020-6-28 16:48
我一般都是把git的版本信息自动添加到bin文件里面

这方法也不错, 不过可能要使用工具或者脚本程序了

出0入0汤圆

 楼主| 发表于 2020-6-28 16:58:25 | 显示全部楼层
hall 发表于 2020-6-28 16:50
有没有办法把这些信息放到前面的?不用必须最前面,但是最好一打开hex文件在第一页就能看到的。 ...

可以的,但是不能去把中断向量的那部分地址给占了哈

  

出0入0汤圆

 楼主| 发表于 2020-6-28 17:13:52 | 显示全部楼层
shiva_shiva 发表于 2020-6-28 17:06
这样岂不是编译一次crc变一下

只要这个几版本常量所在的文件没变动过 或者 程序没有 build all, 编译的日期时间标识符就不会变化


出0入0汤圆

 楼主| 发表于 2020-6-28 21:38:56 | 显示全部楼层
vjcmain 发表于 2020-6-28 20:54
如何能放到最前面? 这样用外部工具就可以读取bin格式固件的信息了。

你把 VERINFO_ADDR_BASE 设置到前面的地址即可,例如:0x8000200 // 注意不要占用中断向量地址!!!

出0入0汤圆

 楼主| 发表于 2020-6-28 21:58:05 | 显示全部楼层
arris9 发表于 2020-6-28 21:50
如何确保你写的地址不会被编译的程序覆盖

这个是放在FLASH中指定位置的常量,编译器会自动避开的

出0入0汤圆

 楼主| 发表于 2020-6-28 22:37:36 | 显示全部楼层
jjj 发表于 2020-6-28 17:34
砸场子的来了,
startup_stm32xxx.s 中这个位置修改如下:
__Vectors       DCD     __initial_sp          ...

看了一下你这个本质应该是差不多的, (uint32_t)Image$$ER_IROM1$$RO$$Base)+28,通过Linker把地址算好的, 与直接指定地址是差不多的
同理:要在boot获取当前APP的版本信息, 直接去读取FLASH中指定位置的版本信息即可

出0入0汤圆

 楼主| 发表于 2020-6-30 22:25:18 | 显示全部楼层
252514251 发表于 2020-6-30 17:04
固定位置感觉不是很好,我喜欢做个特征值由编译器分配到flash,使用的时候搜索出来 ...

使用指定地址与让编译器自动分配本质没什么太大的区别, 但指定地址会更加方便一,比如:
1) 一打开HEX文件就能很方便的看到程序的版本信息。
2) 使用工具会很方便的识别到HEX的版本信息(比如用自己的下载工具,一些加密处理的HEX)。
3) 一些带IAP功能的程序,在boot程序中也可以很方便的去读取FLASH中当前APP的版本信息。


出0入0汤圆

 楼主| 发表于 2020-7-1 11:10:43 | 显示全部楼层
252514251 发表于 2020-7-1 10:56
主要是怕自己给的地址不合适
不给固定地址,只能加特征值,用的时候从hex文件中搜索出来 ...

只要你不放在最最最...前面把中断向量的地址给占了,一般没什么问题, 如果还是不放心:可以让它紧跟在程序使用空间的后面(这个地址要自己算一下)  或者 放在FLASH空间的末尾处。

出0入0汤圆

 楼主| 发表于 2020-8-26 14:35:50 | 显示全部楼层
Years丶 发表于 2020-8-26 14:21
编译完的hex是用 winhex查看的嘛?  为啥我这看不到定义的版本信息

用J-Flash,STVP,WinHex等等,任何一个烧写工具都可以,左边显示HEX值,右侧显示的ASCII字符,这样就能比较直观的看到HEX文件具体信息了

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 08:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表