搜索
bottom↓
回复: 44

STM32程序升级时,如何检查BIN文件的有效性呢?

[复制链接]

出0入0汤圆

发表于 2016-5-11 11:54:49 | 显示全部楼层 |阅读模式
如题,我想用IAP升级程序。但前提是如何检查BIN文件的有效性呢?不可能无效的BIN文件也可以升级啊!大家是怎么处理的呢?

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2016-5-11 12:07:52 | 显示全部楼层
在文件末尾增加CRC

出0入0汤圆

发表于 2016-5-11 12:13:21 | 显示全部楼层
对整个bin文件加校验,一般CRC就够了

出0入0汤圆

发表于 2016-5-11 12:35:14 | 显示全部楼层
CRC只是完整性.
有效性,应该包含bin文件中,特定地址数据的判别.

出0入0汤圆

发表于 2016-5-11 12:42:12 | 显示全部楼层
加个版本号判断,产品标准识别,然后再CRC校验。

出0入0汤圆

发表于 2016-5-11 12:43:03 | 显示全部楼层
这个看你了

出0入0汤圆

发表于 2016-5-11 12:46:28 来自手机 | 显示全部楼层
shian0551 发表于 2016-5-11 12:35
CRC只是完整性.
有效性,应该包含bin文件中,特定地址数据的判别.

正解……

出0入0汤圆

发表于 2016-5-11 12:46:29 | 显示全部楼层
我的产品是这么做的
自定义文件格式,增加文件头,内置:硬件ID,程序版本,编译日期,等信息
负责升级的程序,先读取这些信息,再读取硬件已有程序的信息,再做决定如何做

出0入0汤圆

发表于 2016-5-11 12:53:26 来自手机 | 显示全部楼层
iap是自己做的吗?我最近也在研究这个

出0入0汤圆

发表于 2016-5-11 14:09:33 | 显示全部楼层
仅BIN文件自身不能判断是否有效。
需要在发送BIN文件后附加该BIN的版本号、识别代码、CRC校验码,通过附加信息进行校验和识别。

出0入0汤圆

 楼主| 发表于 2016-5-11 16:04:06 | 显示全部楼层
McuPlayer 发表于 2016-5-11 12:46
我的产品是这么做的
自定义文件格式,增加文件头,内置:硬件ID,程序版本,编译日期,等信息
负责升级的程 ...

就是说将BIN文件加工,在前面增加一些信息?然后写入时校验并去掉这些信息?

出0入0汤圆

发表于 2016-5-11 16:46:42 | 显示全部楼层
我自己在文件头尾加标识,然后分包成每n个字节插入一个CRC字段

出0入0汤圆

发表于 2016-5-11 16:55:04 | 显示全部楼层
自己加校验以及产品的型号,版本等

出0入0汤圆

发表于 2016-5-11 17:24:49 来自手机 | 显示全部楼层
pigy0754 发表于 2016-5-11 16:04
就是说将BIN文件加工,在前面增加一些信息?然后写入时校验并去掉这些信息? ...

你也可以先发信息,然后再一包bin 嘛,然后根据信息检验。bin大的话,考虑多发几次。办法总是人想的

出0入0汤圆

发表于 2016-5-11 17:28:34 | 显示全部楼层
8楼提到的文件头,可以在升级之后写到程序区最后一个扇区未尾,用于下次升级时比较板本号之类的操作。

出0入8汤圆

发表于 2016-5-11 17:34:19 | 显示全部楼层
文件头:版本信息、编译日期、文件MD5等信息
内容:bin文件

出0入663汤圆

发表于 2016-5-11 17:38:27 | 显示全部楼层
判断有效性最好的方法是数字签名。

出0入0汤圆

发表于 2016-5-11 19:34:50 | 显示全部楼层
我就是分包 校验 只是完整性

出0入0汤圆

发表于 2016-5-11 20:08:41 | 显示全部楼层

为什么不是在文件头加呢?

出0入0汤圆

发表于 2016-5-11 21:11:05 | 显示全部楼层
我们这里是先把文件拆开若干个包 包尾有CRC
然后iap程序确定数据包完整性以后才有正确返回
如果每一个数据包都被正确编程 就证明bin文件正确载入了

出0入4汤圆

发表于 2016-5-11 21:19:28 | 显示全部楼层
在升级文件的文件头(上传的第一包)里含有基本校验信息,如适用的设备型等信息,

如果不对就终止升级,当第一包的基本信息校验通过,才允许上传整个BIN文件,

当上传完毕后进行CRC校验,无误则升级成功,否则恢复还原升级前的版本,并上报升级失败等。。。

出0入0汤圆

发表于 2016-5-11 22:02:08 来自手机 | 显示全部楼层
tarzar 发表于 2016-5-11 21:19
在升级文件的文件头(上传的第一包)里含有基本校验信息,如适用的设备型等信息,

如果不对就终止升级,当第 ...

发现升级有问题,怎么恢复原来的版本呢?

出0入0汤圆

发表于 2016-5-11 23:00:11 来自手机 | 显示全部楼层
编译日期有不有自动加入的手法?请指教!

出0入0汤圆

发表于 2016-5-11 23:21:14 | 显示全部楼层
重庆酱油仔 发表于 2016-5-11 23:00
编译日期有不有自动加入的手法?请指教!

const  char c_date[]  __attribute__((at(0x08001000))) = __DATE__;        //指定地址存放日期
const  char c_time[]  __attribute__((at(0x08002000))) = __TIME__;        //指定地址存放时间

出0入0汤圆

发表于 2016-5-12 00:26:55 来自手机 | 显示全部楼层
可以参考路由器升级,需要特定头文件

出0入4汤圆

发表于 2016-5-12 08:16:43 | 显示全部楼层
creep 发表于 2016-5-11 22:02
发现升级有问题,怎么恢复原来的版本呢?

我的应用是这样的:
STM32内部FLASH分为:BOOT+APP1(主)+APP2(临时)+数据区(模拟EEPROM)

出0入4汤圆

发表于 2016-5-12 08:19:04 | 显示全部楼层
creep 发表于 2016-5-11 22:02
发现升级有问题,怎么恢复原来的版本呢?

如果内部不够,可以外挂一个SPI FLASH,就可以放好几份APP程序

出0入0汤圆

发表于 2016-5-12 08:43:06 | 显示全部楼层
tarzar 发表于 2016-5-12 08:16
我的应用是这样的:
STM32内部FLASH分为:BOOT+APP1(主)+APP2(临时)+数据区(模拟EEPROM)
...

再请教下具体是不是这样做:主APP1和临时的APP2是一样的,或者说APP2就是APP1的备份。
升级过程中用新的APP去升级主APP1,如果检测到新的APP有问题就用APP2恢复到上一个版本,如果没有问题,把APP2也升级为最新的版本APP.
目前的确遇到FLASH不够用的问题,所以没法去备份一个临时的APP,因为我是使用SD升级的,所以在想是不是升级前用SD卡把旧的版本一次,所以发现新的有问题还能恢复过去。

出0入4汤圆

发表于 2016-5-12 08:58:38 | 显示全部楼层
creep 发表于 2016-5-12 08:43
再请教下具体是不是这样做:主APP1和临时的APP2是一样的,或者说APP2就是APP1的备份。
升级过程中用新的A ...

理解正确。
这里我再提一个建议,最好有三份APP的空间
一份是用于升级暂存,另外两个为最新两个版本(注意,这两个版本都是可以正常正确的,可以正常运行的)
这样的好处于是,不管是升级文件上传是否正确都不会影响到升级前后两个版本的任意切换运行。
即:当升级文件上传失败时,也不会影响当前已经成功升级的最新两个版本,可以随意节换运行。

出0入0汤圆

发表于 2016-5-12 09:01:43 | 显示全部楼层
tarzar 发表于 2016-5-12 08:58
理解正确。
这里我再提一个建议,最好有三份APP的空间
一份是用于升级暂存,另外两个为最新两个版本(注意 ...

明白了,谢谢!!

出0入4汤圆

发表于 2016-5-12 09:05:52 | 显示全部楼层
呵呵,客气了

出0入0汤圆

发表于 2016-5-12 09:11:31 来自手机 | 显示全部楼层
renjun_EMbest 发表于 2016-5-11 12:07
在文件末尾增加CRC

文件尾怎么弄的 先把文件全部收下没地方放吧

出0入0汤圆

发表于 2016-5-12 09:26:23 | 显示全部楼层

如何对一个bin在尾部加crc,是用什么工具么

出0入0汤圆

发表于 2016-5-12 09:42:30 | 显示全部楼层
部署网络服务,在线取得版本信息,校验本地BIN文件,成功才能升级。因而协议要保密。

出0入0汤圆

发表于 2016-5-19 12:58:41 | 显示全部楼层
michael.yang 发表于 2016-5-11 23:21
const  char c_date[]  __attribute__((at(0x08001000))) = __DATE__;        //指定地址存放日期
const  char c ...

思密达,谢谢!mark住了,马上添进去。

出0入0汤圆

发表于 2019-3-29 16:00:05 | 显示全部楼层
marker 一下,过后再看

出0入42汤圆

发表于 2019-3-29 16:21:07 | 显示全部楼层
gzhuli 发表于 2016-5-11 17:38
判断有效性最好的方法是数字签名。

就是这么好的功能大家怎么不用呢

出0入4汤圆

发表于 2019-3-29 17:05:27 | 显示全部楼层
albert_w 发表于 2019-3-29 16:21
就是这么好的功能大家怎么不用呢

单片机做通讯,怎么实现数字签名?

出0入42汤圆

发表于 2019-3-29 17:35:04 | 显示全部楼层
bolizhicheng204 发表于 2019-3-29 17:05
单片机做通讯,怎么实现数字签名?

消息签名和文件签名类似.  甚至预先烧个一样的key用来做hash也可以的

出0入0汤圆

发表于 2019-5-17 09:42:01 | 显示全部楼层
albert_w 发表于 2019-3-29 17:35
消息签名和文件签名类似.  甚至预先烧个一样的key用来做hash也可以的

数字签名占用RAM和ROM大吗?

出0入0汤圆

发表于 2019-5-17 09:54:33 | 显示全部楼层
在 Bin 尾部加上两个 Byte 的 Check Sum 及 两个 Byte 的 Check Sum 的补数即可,校验程序小,且快速方便。

出0入0汤圆

发表于 2019-5-17 09:54:49 | 显示全部楼层
本帖最后由 xyz.543 于 2019-5-17 09:56 编辑

在 Bin 尾部加上两个 Byte 的 Check Sum 及 两个 Byte 的 Check Sum 的补数即可,校验程序小,且快速方便。

编辑原因:不好意思,多发了!

出0入4汤圆

发表于 2020-8-28 18:26:18 | 显示全部楼层
xyz.543 发表于 2019-5-17 09:54
在 Bin 尾部加上两个 Byte 的 Check Sum 及 两个 Byte 的 Check Sum 的补数即可,校验程序小,且快速方便。 ...

有什么工具能自动添加吗

出0入0汤圆

发表于 2020-8-29 08:04:29 | 显示全部楼层
我avr时,是在avr的bin文件中断地址入口地址是否是中断指令

出0入0汤圆

发表于 2020-8-29 09:05:15 | 显示全部楼层
bolizhicheng204 发表于 2020-8-28 18:26
有什么工具能自动添加吗

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

本版积分规则

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

GMT+8, 2024-6-3 01:30

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

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