OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6578|回复: 33

要做个网络远程升级固件的IAP代码,升级前要将flash中的APP1区域数据复制到APP2区域,APP2不能运行的问题

[复制链接]

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
发表于 2017-9-4 17:50:18 | 显示全部楼层 |阅读模式
如题:要做个网络远程升级固件的IAP代码,升级前要将flash中的APP1区域中的APP数据复制到APP2区域,APP在APP1区域中能正常运行,但是复制到APP2区域后,由于APP2所需要的中断向量表偏移量和flash的起始地址设置跟APP1不一样,所以APP2不能运行,请教各位大神,这该如何解决??????????????????????????
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2017-9-12 11:17:29 | 显示全部楼层
本帖最后由 adlu 于 2017-9-12 11:36 编辑
ylsljp 发表于 2017-9-11 08:41
就是要程序备份,防止升级过程中断网后导致设备不可运行

QQ截图20170912111334.jpg

程序启动后,从Boot区运行,读取App_flag
if(1==App_flag){
         跳转到APP1
} else {
         跳转到APP2
}

如果当前运行APP1区,则APP2区作为升级区,升级过程如下:
接收APP2代码,写入APP2区;
对APP2代码进行校验;
if(校验成功){
         修改App_flag为2;
         跳转到APP2区;
} else{
         跳转到Boot区;//相当于重启程序,也可以只跳转到APP1开始处,或者只是退出升级函数
}

如果当前运行APP2区,则APP1区作为升级区,升级过程如下:
接收APP1代码,写入APP1区;
对APP1代码进行校验;
if(校验成功){
         修改App_flag为1;
         跳转到APP1区;
} else{
         跳转到Boot区;//相当于重启程序,也可以只跳转到APP2开始处,或者只是退出升级函数
}

升级前需要准备好APP1,APP2两个版本的代码。
主机端先获取App_flag的值,以决定发送APP1还是APP2。

这样,无论升级是否成功,都有可运行的版本。

回复 支持 2 反对 0

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11964
金钱
11964
注册时间
2013-3-8
在线时间
1274 小时
发表于 2017-9-4 19:56:47 | 显示全部楼层
在APP1区域可以运行的,简单复制到APP2区域是肯定不会运行的。要修改中断向量表及flash起始地址,相当于两个程序了
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-5 11:51:31 | 显示全部楼层
augustedward 发表于 2017-9-4 19:56
在APP1区域可以运行的,简单复制到APP2区域是肯定不会运行的。要修改中断向量表及flash起始地址,相当于两 ...

能有什么办法解决吗?领导非要我这样做,妈的,头痛了。。。
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11964
金钱
11964
注册时间
2013-3-8
在线时间
1274 小时
发表于 2017-9-5 13:03:24 | 显示全部楼层
ylsljp 发表于 2017-9-5 11:51
能有什么办法解决吗?领导非要我这样做,妈的,头痛了。。。

程序升级时把网络传来的代码先写到APP2的地方,传完后,系统软复位,然后在IAP程序里把APP2地址的数据再拷到APP1的地方,然后跳转到APP1地址执行。
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-9-4
在线时间
19 小时
发表于 2017-9-5 14:11:08 | 显示全部楼层

可否这样,在烧完程序或升级后,更新一个标志位
                 APP在APP1位置时,在FLASH某个位置写一个标志位A=0X5A5A
                 APP在APP2位置时,在FLASH相同位置写一个标志位A=0XA5A5
程序进入main之后根据标志位的数值确定中断向量表之类的参数。
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-5 14:27:46 | 显示全部楼层
龙兄 发表于 2017-9-5 14:11
可否这样,在烧完程序或升级后,更新一个标志位
                 APP在APP1位置时,在FLASH某个位置写 ...

这样能解决中断向量表的偏移量的问题,但是flash的起始地址问题还是没解决啊
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2017-9-5 18:30:11 | 显示全部楼层
龙兄 发表于 2017-9-5 14:11
可否这样,在烧完程序或升级后,更新一个标志位
                 APP在APP1位置时,在FLASH某个位置写 ...

正解。

这样做,烧录到APP1位置的和烧到APP2的APP代码是两个工程。

LZ要同样的bin烧录到不同的位置,还要求都能运行,是不可能的吧。
因为bin里面已经包含了中断向量的位置信息,位置不对当然会异常。
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2017-9-5 18:33:49 | 显示全部楼层
不知道LZ这样做有什么意义。程序备份吗?
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-11 08:41:46 | 显示全部楼层
adlu 发表于 2017-9-5 18:33
不知道LZ这样做有什么意义。程序备份吗?

就是要程序备份,防止升级过程中断网后导致设备不可运行
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-10-31
在线时间
8 小时
发表于 2017-9-11 09:32:30 | 显示全部楼层
我做过,可以实现的,编译2个版本的bin文件,分别对应a区和b区,下载时根据当前版本区选择下载另外的一个区的升级版本到另一个区,若下载完后运行失败,则回到原来的区运行,永远会有一个能运行的正确版本。。。可以提供源代码及技术支持,需要付费。若有意请加qq:7376220
回复 支持 反对

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-9-11 10:11:35 来自手机 | 显示全部楼层
ylsljp 发表于 2017-9-11 08:41
就是要程序备份,防止升级过程中断网后导致设备不可运行

如果只是为了防止失败,可以先把本地APP保存到其他存储器里,成功了不用管,失败了再把APP拷回去。
回复 支持 反对

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2017-9-12 19:05:37 | 显示全部楼层
ylsljp 发表于 2017-9-11 08:41
就是要程序备份,防止升级过程中断网后导致设备不可运行

完全下载完毕 校验成功后在IAP升级  这样不就解决了此问题  我是这样做的   唯一不好的就是会占用大量RAM   有外部SDRAM可以这么做
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-14 10:30:34 | 显示全部楼层
adlu 发表于 2017-9-12 11:17
程序启动后,从Boot区运行,读取App_flag。if(1==App_flag){         跳转到APP1区} else {          ...

你这个办法我知道,但是问题是领导要一个版本的代码在APP1和APP2区域都能运行,我就没办法让在APP1能运行的代码在APP2也能运行了,求帮忙
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-14 10:35:33 | 显示全部楼层
cromarti 发表于 2017-9-11 10:11
如果只是为了防止失败,可以先把本地APP保存到其他存储器里,成功了不用管,失败了再把APP拷回去。

这个办法是可以的,我也做了一份这样的,领导想要在APP1区域运行的代码在APP2区域也能运行,这样可以少复制少出错。如果最后没办法了我也只能将APP1代码复制到APP2,等APP1代码不能运行了再复制APP2代码到APP1运行,这是最后的方法
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-14 10:37:46 | 显示全部楼层
slyant 发表于 2017-9-11 09:32
我做过,可以实现的,编译2个版本的bin文件,分别对应a区和b区,下载时根据当前版本区选择下载另外的一个区 ...

跟着我念一万遍:我好穷啊我好穷,我好穷啊我好穷,我好穷啊我好穷......
回复 支持 反对

使用道具 举报

5

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2014-8-7
在线时间
59 小时
发表于 2017-9-14 10:42:28 | 显示全部楼层
ylsljp 发表于 2017-9-14 10:30
你这个办法我知道,但是问题是领导要一个版本的代码在APP1和APP2区域都能运行,我就没办法让在APP1能运行 ...

他怎么知道你的一个版本代码是运行在APP1还是APP2?
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2017-9-14 10:44:34 | 显示全部楼层
ylsljp 发表于 2017-9-14 10:30
你这个办法我知道,但是问题是领导要一个版本的代码在APP1和APP2区域都能运行,我就没办法让在APP1能运行 ...

你的目的是“防止升级过程中断网后导致设备不可运行”,实现了就行。
为什么非要写一个APP1区和APP2区都能运行的代码呢?去庙里烧香,说不定神仙可以帮你
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2017-9-14 10:50:52 | 显示全部楼层
ylsljp 发表于 2017-9-14 10:30
你这个办法我知道,但是问题是领导要一个版本的代码在APP1和APP2区域都能运行,我就没办法让在APP1能运行 ...

还有一个办法,APP1和APP2的代码相同,boot程序先把APP1或APP2的代码拷贝到RAM中,再跳到RAM运行。
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-14 21:37:40 | 显示全部楼层
ndthome 发表于 2017-9-14 10:42
他怎么知道你的一个版本代码是运行在APP1还是APP2?

领导也是写代码出身的,做完的项目都要把源码给他,他有时候也会检查流程图和代码的
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-14 21:41:22 | 显示全部楼层
adlu 发表于 2017-9-14 10:44
你的目的是“防止升级过程中断网后导致设备不可运行”,实现了就行。
为什么非要写一个APP1区和APP2区都 ...

好办法,周六上香去,说不定还能偶遇神仙姐姐呢
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-15 10:06:28 | 显示全部楼层
adlu 发表于 2017-9-14 10:50
还有一个办法,APP1和APP2的代码相同,boot程序先把APP1或APP2的代码拷贝到RAM中,再跳到RAM运行。

没有外部SDRAM, SRAM只有64K,不够用
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-18 17:49:01 | 显示全部楼层
augustedward 发表于 2017-9-4 19:56
在APP1区域可以运行的,简单复制到APP2区域是肯定不会运行的。要修改中断向量表及flash起始地址,相当于两 ...

大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-18 17:49:23 | 显示全部楼层
龙兄 发表于 2017-9-5 14:11
可否这样,在烧完程序或升级后,更新一个标志位
                 APP在APP1位置时,在FLASH某个位置写 ...

大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-18 17:49:52 | 显示全部楼层
cromarti 发表于 2017-9-11 10:11
如果只是为了防止失败,可以先把本地APP保存到其他存储器里,成功了不用管,失败了再把APP拷回去。

大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-18 17:50:06 | 显示全部楼层
adlu 发表于 2017-9-12 11:17
程序启动后,从Boot区运行,读取App_flag。if(1==App_flag){         跳转到APP1区} else {          ...

大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-18 17:50:43 | 显示全部楼层
hanzixi_angel 发表于 2017-9-12 19:05
完全下载完毕 校验成功后在IAP升级  这样不就解决了此问题  我是这样做的   唯一不好的就是会占用大量RAM ...

大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2017-9-18 17:51:03 | 显示全部楼层
ndthome 发表于 2017-9-14 10:42
他怎么知道你的一个版本代码是运行在APP1还是APP2?

大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11964
金钱
11964
注册时间
2013-3-8
在线时间
1274 小时
发表于 2017-9-18 18:37:27 | 显示全部楼层
ylsljp 发表于 2017-9-18 17:49
大神,升级完一个设备后,我想把同一个网段上的所有设备都升级,怎么实现啊?求思路!!!

可以试试广播,不过我没用过。
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2014-2-4
在线时间
71 小时
发表于 2018-2-2 11:30:02 | 显示全部楼层
adlu 发表于 2017-9-12 11:17
程序启动后,从Boot区运行,读取App_flag。if(1==App_flag){         跳转到APP1区} else {          ...

请问这个APP的代码怎么校验是否接受成功
回复 支持 反对

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2018-2-2 11:50:23 | 显示全部楼层
哈哈哈哈或或或或或或或或或或或或或或
回复 支持 反对

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2018-2-2 14:36:17 | 显示全部楼层
呵呵呵开西寨 发表于 2018-2-2 11:50
哈哈哈哈或或或或或或或或或或或或或或

什么鬼
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2018-2-3 09:25:23 | 显示全部楼层
hu9977 发表于 2018-2-2 11:30
请问这个APP的代码怎么校验是否接受成功

比如,生成的APP代码为bin文件,则在该文件末尾增加几个字节作为校验和,或者CRC校验码。接收的时候,计算和比对一下,就可以知道了。
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2014-2-4
在线时间
71 小时
发表于 2018-2-3 14:27:11 | 显示全部楼层
adlu 发表于 2018-2-3 09:25
比如,生成的APP代码为bin文件,则在该文件末尾增加几个字节作为校验和,或者CRC校验码。接收的时候,计 ...

好的,谢谢。我试试
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 05:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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