硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5466|回复: 30
收起左侧

[有问必答] stm32在线升级过程中突然中断的问题?

  [复制链接]

28

主题

73

回帖

162

积分

初级会员

积分
162
发表于 2018-3-14 11:47:28 | 显示全部楼层 |阅读模式
本帖最后由 月霜寒 于 2018-3-14 13:20 编辑

在程序中加入了在线升级功能,但是发现一个问题,在在线升级过程中如果在线升级突然中断,虽然可以再次升级,但是万一一直中断就就一直进不来用户程序,现在的想法是在在线升级中如果中断后2min还未再次升级则将在线升级标志位清零,跳转到原来的用户函数中,我用在线仿真发现在跳转的时候会进入hardfault,可能是已经改变了用户程序,请问在线升级时如何保存完整的用户程序备用呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-3-14 16:03:28 | 显示全部楼层
这个最好弄个备份Flash区域,先把他升级了,升级失败还能退回来。
回复

使用道具 举报

28

主题

73

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2018-3-15 08:34:35 | 显示全部楼层
eric2013 发表于 2018-3-14 16:03
这个最好弄个备份Flash区域,先把他升级了,升级失败还能退回来。

这种如何操作呢,有没有这方面的资料
回复

使用道具 举报

2

主题

58

回帖

64

积分

初级会员

积分
64
发表于 2018-3-15 09:20:15 | 显示全部楼层
月霜寒 发表于 2018-3-15 08:34
这种如何操作呢,有没有这方面的资料

假设flash大小为512K,前50K为IAP启动程序用来更新程序,中间231K为系统正常运行程序,后面的231K为更新进来的程序,在启动程序内判断后面更新进来的程序是否完整,不完整则不将后面程序更新如应用程序端,否则直接更新。
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-15 10:30:58 | 显示全部楼层
升级分两个步骤 第一步下载到本地  MD5校验或者其他校验  第二步:校验没有问题在写到指定地址的flash空间  跳转到指定的地址开始执行新的程序   难道你是下一包写一包数据  这样网络不好就会影响你的升级 难免会中断
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2018-3-15 13:12:16 | 显示全部楼层
hanzixiangel 发表于 2018-3-15 10:30
升级分两个步骤 第一步下载到本地  MD5校验或者其他校验  第二步:校验没有问题在写到指定地址的flash空间  ...

这个方法不错
回复

使用道具 举报

28

主题

73

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2018-3-16 08:30:41 | 显示全部楼层
对于flash中如何将代码备份到一个区域,然后校验完成后再拷贝到运行区
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2018-3-17 01:20:29 | 显示全部楼层
bootloader+双备份
回复

使用道具 举报

28

主题

73

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2018-3-17 08:42:27 | 显示全部楼层

双备份怎么实现?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-3-17 11:30:57 | 显示全部楼层
回复

使用道具 举报

6

主题

130

回帖

148

积分

初级会员

积分
148
发表于 2018-3-17 17:31:59 | 显示全部楼层
eric2013 发表于 2018-3-14 16:03
这个最好弄个备份Flash区域,先把他升级了,升级失败还能退回来。

这样子内存开销非常大,不过貌似没有其他啥办法
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2018-3-18 02:27:55 | 显示全部楼层
月霜寒 发表于 2018-3-17 08:42
双备份怎么实现?

看你做到那种级别了,我们产品里是2级boot+双备份,升级永远只升级app2,app2升级完成后,软复位到boot里,将app2拷贝到app1,然后启动app1。除了硬汉推荐的mcuboot,你也可以看看nxp的kboot
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-18 11:01:25 | 显示全部楼层
eric2013 发表于 2018-3-17 11:30
学习这个MCUboot即可:

http://www.armbbs.cn/forum.ph ... 9&highlight=MCUboot

不错啊,,我昨天才调试好了 iap升级。

我把所有的中断都关闭了,就可以正常下载了。
但是的确没考虑过升级失败的问题。

目前的app程序有点大,放103芯片里面空间不够用。。好纠结~
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-18 11:02:41 | 显示全部楼层
hanzixiangel 发表于 2018-3-15 10:30
升级分两个步骤 第一步下载到本地  MD5校验或者其他校验  第二步:校验没有问题在写到指定地址的flash空间  ...

我想问下,bin文件怎么计算md5校验和?

我这两天也在考虑这个问题。比如我的app.bin写好了,是用keil转换工具制作的。那md5我也可以通过外部的程序计算得到。但是这两个怎么合并写入到一个bin里面,您有什么好的操作方法?
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-18 12:58:38 | 显示全部楼层
hanzixiangel 发表于 2018-3-15 10:30
升级分两个步骤 第一步下载到本地  MD5校验或者其他校验  第二步:校验没有问题在写到指定地址的flash空间  ...

你有校验的工具不,最好是命令行方式的,
回复

使用道具 举报

28

主题

73

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2018-3-19 08:35:59 | 显示全部楼层
谢谢大家,我研究下大家的推荐方法
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-19 10:44:57 | 显示全部楼层
mioc_hust 发表于 2018-3-18 11:02
我想问下,bin文件怎么计算md5校验和?

我这两天也在考虑这个问题。比如我的app.bin写好了,是用keil ...

不用将md5和bin文件合并  我们之前用的是http get方法下载升级   我bin文件上传到服务器  你用http下载的时候http head是包含md5信息的  还有大小等所有的信息  你只需要下载完之后进行md5校验即可  校验一样即认为文件没有问题  可以进行升级  至于怎么校验有标准的C代码可以移植   也很简单  lwip里面就有md5校验的源码   

另外如你的想法也是可以的   网上有md5生成的工具  你可以找一个   把生成的md5值保存未bin文件  然后通过bin文件合成工具将两个bin文件合并在一起  当然这个需要你去约束地址  下载完之后要把md5部分提取出来 并从固件中剔除  希望能帮到你  
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-19 10:45:55 | 显示全部楼层
mioc_hust 发表于 2018-3-18 12:58
你有校验的工具不,最好是命令行方式的,

校验工具我没有现成的  网上应该很多  你上网找找 或者自己移植一个 编译一下  做一个命令行控制的工具
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-20 10:39:10 | 显示全部楼层
hanzixiangel 发表于 2018-3-19 10:44
不用将md5和bin文件合并  我们之前用的是http get方法下载升级   我bin文件上传到服务器  你用http下载的 ...

其实你这个是基于已经存在了文件系统的情况下,以文件的方式查看的。
实际上在项目中,是没有外部的存储器的,只有使用内部的flash

目前没有做网口和文件系统。iap我用的串口xmodem协议传输的
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-20 10:40:12 | 显示全部楼层
hanzixiangel 发表于 2018-3-19 10:45
校验工具我没有现成的  网上应该很多  你上网找找 或者自己移植一个 编译一下  做一个命令行控制的工具

恩 软件我有。但是都是图形化的。我想找一个可以和linux一样 用命令行的
这样方便保存计算以后的值到文件里面。
最后我把值和bin一起合并传输。最后在处理器里面整体教研
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-20 10:44:08 | 显示全部楼层
mioc_hust 发表于 2018-3-20 10:39
其实你这个是基于已经存在了文件系统的情况下,以文件的方式查看的。
实际上在项目中,是没有外部的存储 ...

没有文件系统  没有网络  没有外部flash   你有了xmodem同样可以实现   如果你每部的flash不足够分成两份的话你可以传一包数据 校验 检验成功写入到flash  从flash读取写入的数据  再校验  如果校验一致则说明这一包数据写入成功  继续传下一包数据   这样靠谱些    我做的远程升级是把完成的固件下载到本地进行的校验  到写入到内部flash也是使用了上述的校验方法   必须保证成功写入
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-20 10:47:40 | 显示全部楼层
mioc_hust 发表于 2018-3-20 10:40
恩 软件我有。但是都是图形化的。我想找一个可以和linux一样 用命令行的
这样方便保存计算以后的值到文 ...

命令行的如果找不到的话就自己写个把  移植了源码编译一下
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-20 14:44:48 | 显示全部楼层
hanzixiangel 发表于 2018-3-20 10:44
没有文件系统  没有网络  没有外部flash   你有了xmodem同样可以实现   如果你每部的flash不足够分成两份 ...

现在我就是这样做的,采用xmodem1K协议,每1K校验一次。每2K写入一次数据

但是还是存在一定的问题的。假设主控端的原因导致传输数据中途停止。那么对于接收端来说可能无法得知整个bin文件是不是完全正确,或者完全接受。 有一定的概率出现程序前段正确而后端失败的问题。

最bug的可能是,用户自己都不知道程序前大部分对的,可能bin也可以执行。但是当程序需要跳转到最后的flash执行时,可能就异常了。

所以才想能不能在这样的情况下,采用全局的bin文件校验的方式,完成在没有文件系统,没有网络的情况下,实现对文件齐备性的校验。


PPS。其实现在IAP已经可以下载了,程序也可以执行,只是想的有点多。完美点整个过程
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-20 14:46:34 | 显示全部楼层
hanzixiangel 发表于 2018-3-20 10:47
命令行的如果找不到的话就自己写个把  移植了源码编译一下

嗯  这个可以有,你提醒我了,,,,在stm32上的md5就是我移植的。
结果我还傻傻的找window下面的命令代码。。。直接再编译 个在window下执行就好了。。

顺带用脚本一起把产生的md5直接和原始的bin合并得到一个全新的带校验头的bin
一举多得。简单好用
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-20 19:36:34 | 显示全部楼层
mioc_hust 发表于 2018-3-20 14:46
嗯  这个可以有,你提醒我了,,,,在stm32上的md5就是我移植的。
结果我还傻傻的找window下面的命令代 ...

对  就是这个意思
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-20 19:44:52 | 显示全部楼层
mioc_hust 发表于 2018-3-20 14:44
现在我就是这样做的,采用xmodem1K协议,每1K校验一次。每2K写入一次数据

但是还是存在一定的问题的。 ...

在资源限制的情况下实现全局校验确实有点难度  或者说实现不了  你可以加个私有协议  在传输bin文件之前先把bin文件的信息传输过去 比如大小 数据帧数等等  然后再一帧一帧传输bin文件  一帧一帧进行校验 保证每帧数据都成功的写入  如果中间断了你也是知道的  就不跳转到用户程序了 一直在bootloader运行  等待下一次传输   如果你的升级时人为干预的  这个过程就好控多了  在重新烧写一遍即可  如果是远程自动的更新固件那就做一些重发机制  失败了可以重新再来   
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-20 20:19:55 | 显示全部楼层
hanzixiangel 发表于 2018-3-20 19:44
在资源限制的情况下实现全局校验确实有点难度  或者说实现不了  你可以加个私有协议  在传输bin文件之前 ...

是的 你提醒我了。。。我原来想用md5作为校验的。标准一些。
但是下午实践了一下,发现实现的时候还是有点麻烦的。

当数据全部保持以后,无法知道flash中的具体大小。同时 md5校验的时候需要把数据读取到内存中计算,但是没有那么大的内存空间,

所以 我也想到了你说的方法,在bin文件增加头信息,就是文件的长度,比如我用xmodem打算传输的次数。一旦次数不正确,就表示异常。
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-21 12:03:05 | 显示全部楼层
mioc_hust 发表于 2018-3-20 20:19
是的 你提醒我了。。。我原来想用md5作为校验的。标准一些。
但是下午实践了一下,发现实现的时候还是有 ...

一帧一帧的分包校验就没必要用md5校验了  crc足够了  保证没包数据写入后读出来跟收到的一致就说明写入成功了  
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-21 20:33:42 | 显示全部楼层
hanzixiangel 发表于 2018-3-21 12:03
一帧一帧的分包校验就没必要用md5校验了  crc足够了  保证没包数据写入后读出来跟收到的一致就说明写入成 ...

其实我还是考虑如何解决在发送端,他没有完全发送完成,接收端不知道的情况
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-3-22 10:19:01 | 显示全部楼层
mioc_hust 发表于 2018-3-21 20:33
其实我还是考虑如何解决在发送端,他没有完全发送完成,接收端不知道的情况

上面不是已经说了吗  你发送bin之前先把bin文件的信息传给mcu   mcu接收bin文件的时候统计一下接收的字节数  这不就知道有没有接收完全了嘛
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-3-22 13:40:27 | 显示全部楼层
hanzixiangel 发表于 2018-3-22 10:19
上面不是已经说了吗  你发送bin之前先把bin文件的信息传给mcu   mcu接收bin文件的时候统计一下接收的字节 ...

是的 是的 现在就是这样干的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 06:57 , Processed in 0.263345 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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