搜索
bottom↓
回复: 77

终于搞清晰了IAP的思路

  [复制链接]

出0入0汤圆

发表于 2011-10-29 04:27:12 | 显示全部楼层 |阅读模式
思路终于搞清晰了。参考http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3821056&bbs_id=9999

为了便于查找,不对参考贴回帖,开个新贴。

采用51楼方案1,参照64楼的pdf,整理IAP思路:

1。将flash分为boot、a、b三个区;
2。应用程序总是运行a区代码;
3。在a区设有两个标记:a区代码有效标记和升级请求标记;
4。在b区设有一个标记:b区代码有效标记;
5。对flash破_处时使用JTAG工具同时写入boot代码、应用程序代码到a区、应用程序代码到b区(可选)、擦除升级请求标记、设置a区代码有效标记、设置b区代码有效标记(可选);
6。上电时首先进入boot区,boot代码检查有无升级请求,若没有升级请求,则检查a区代码是否有效,若a区代码有效,则执行a区代码;很明显,flash破_处后满足这一要求,a区代码被执行。
7。运行时若有升级请求,则应用程序响应升级请求,但只是在a区打上升级请求标记,然后放狗咬人;
8。咬人狗导致系统复位后,boot代码查到升级请求标记,转入升级程序;
9。升级程序擦除b区代码有效标记、擦除b区代码(看出对flash破_处时,为什么应用程序代码到b区是可选的);
10。升级程序写入新代码到b区、设置b区代码有效标记;
11。升级程序擦除a区代码有效标记、擦除a区代码;
12。升级程序拷贝b区代码到a区、设置a区代码有效标记;
13。升级程序擦除升级请求标记。
14。升级程序转入a区运行新代码。
15。如果上位机中途放弃升级,应有明确的放弃指令下传。下位的升级程序检查a区代码是否有效,若a区代码有效,则擦除升级请求标记,同意放弃升级。

可以看出,由于擦除升级请求标记是最后的步骤,如果某一步不成功,则会要求重新升级。如果a区代码有效时放弃升级,则仍执行a区代码。

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

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

出0入0汤圆

发表于 2011-10-29 05:35:33 | 显示全部楼层
不太明白,可能理解能力力差,先标志

出0入0汤圆

发表于 2011-10-29 06:49:08 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-10-29 08:18:51 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-10-29 08:41:44 | 显示全部楼层
记号一下.

出0入0汤圆

发表于 2011-10-29 08:47:10 | 显示全部楼层
很清晰的思路,受教。

出0入0汤圆

发表于 2011-10-29 08:50:01 | 显示全部楼层
IAP 一直想实现。。

出0入0汤圆

发表于 2011-10-29 09:14:06 | 显示全部楼层
关注一下,有空学习下

出0入0汤圆

发表于 2011-10-29 10:53:40 | 显示全部楼层
记号

出0入0汤圆

 楼主| 发表于 2011-10-29 11:00:50 | 显示全部楼层
按照马超的文章建议。http://www.ourdev.cn/machao_about_avr_iap.html

有了IAP,还要考虑下载协议保密,以免病毒程序下载。

此外也要考虑给应用程序hex文件加密,以免盗版。

出0入0汤圆

发表于 2011-10-29 11:04:22 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-10-29 11:33:32 | 显示全部楼层
很好,收藏了,谢谢楼主的分享!

出0入0汤圆

发表于 2011-10-29 22:09:55 | 显示全部楼层
这样的思路比较简单,问题是要拿一半的空间作为临时存放区,有点浪费。
我用另外两种不同的方案,不需要在单片机内部保留一个临时存放区
1,升级功能完全放在bootloader里。在主程序里收到升级请求的时候,跳转到bootloader里进行升级即可
2,外挂一片SPI flash代替b区。SPI flash还可以在系统里存放一些别的数据。即使完全不存放别的数据,2M字节的SPI flash才一两块钱而已,比用片内flash做升级文件临时存放区便宜多了。

出140入0汤圆

发表于 2011-10-29 23:18:30 | 显示全部楼层
好帖子,顶~!

出0入0汤圆

 楼主| 发表于 2011-10-29 23:22:42 | 显示全部楼层
LS的外挂一片SPI flash代替b区确实是很好的改进。据说有些只在RAM中运行程序的嵌入式系统是依靠外挂SPI flash或I2C eeprom存放所有boot, a, 和b区。

出0入0汤圆

 楼主| 发表于 2011-10-29 23:23:56 | 显示全部楼层
动作慢了点,应是LS的LS了。

出0入0汤圆

发表于 2011-10-30 12:34:32 | 显示全部楼层
若在“擦除a区代码或将b区代码复制到a区”这个过程中上位机意外中断(此时未发送有效的撤销升级指令),那升级过程失败的同时源文件是否会受损?

ps:疑问内容

出0入0汤圆

发表于 2011-10-30 12:50:23 | 显示全部楼层
是不是复杂了点?

出10入0汤圆

发表于 2011-10-30 13:22:55 | 显示全部楼层
mark一下!

出0入0汤圆

发表于 2011-10-30 13:32:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-31 00:56:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-31 08:03:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-31 08:11:48 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2011-10-31 08:23:40 | 显示全部楼层
mark.

出0入0汤圆

发表于 2011-10-31 08:52:58 | 显示全部楼层
前几年做过这方面的工作,很简单也很复杂,实现功能简单,做到健壮可靠很复杂。
1、准确。通讯过程准确--如果用串口通讯的,就需要选择有包号并且有重发机制的协议。
2、安全。目标代码加密,不怕别人获取目标代码反汇编。要能识别出目标代码是合法有效代码,否则会被别人随便乱下点什么进去了。
3、完整。如果加密的目标代码被修改,要能识别出被改动,不会被人为的破坏。
4、健壮。异常情况可逆可溯。在整个更新过程中都要保证任何失败的情况都要有一个可以执行的代码(即使是老代码,升级往往是修复bug但基本功能是不会有太大影响,但是如果升级导致设备不能正常工作是不能被谅解的)
5、高效。时间短,人工干预度低,方式多样:SPI/Com/USB。
抛砖引玉,流程图如附件:

IAP流程图ourdev_690213GDICQF.pdf(文件大小:33K) (原文件名:流程图.pdf)

出0入0汤圆

发表于 2011-10-31 09:09:25 | 显示全部楼层
回复【14楼】xsmjc98  
好帖子,顶~!
-----------------------------------------------------------------------

现在不少宽带路由器就是

出0入0汤圆

发表于 2011-10-31 09:10:25 | 显示全部楼层
我现在的项目就是这样做的。

出0入0汤圆

发表于 2011-10-31 09:19:41 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-10-31 09:19:47 | 显示全部楼层
mark  bootloader

出0入0汤圆

发表于 2011-10-31 09:41:40 | 显示全部楼层
回复【13楼】qllaoda
-----------------------------------------------------------------------

回复【13楼】qllaoda
这样的思路比较简单,问题是要拿一半的空间作为临时存放区,有点浪费。
我用另外两种不同的方案,不需要在单片机内部保留一个临时存放区
1,升级功能完全放在bootloader里。在主程序里收到升级请求的时候,跳转到bootloader里进行升级即可
2,外挂一片spi flash代替b区。spi flash还可以在系统里存放一些别的数据。即使完全不存放别的数据,2m字节的spi flash才一两块钱而已,比用片内flash做升级文件临时存放区便宜多了。
-----------------------------------------------------------------------

请问你说的这个flash的型号是什么?

出0入0汤圆

发表于 2011-10-31 10:17:49 | 显示全部楼层
回复【31楼】yzhu  
回复【13楼】qllaoda
-----------------------------------------------------------------------
回复【13楼】qllaoda
这样的思路比较简单,问题是要拿一半的空间作为临时存放区,有点浪费。
我用另外两种不同的方案,不需要在单片机内部保留一个临时存放区
1,升级功能完全放在bootloader里。在主程序里收到升级请求的时候,跳转到bootloader里进行升级即可
2,外挂一片spi flash代替b区。spi flash还可以在系统里存放一些别的数据。即使完全不存放别的数据,2m字节的spi flash才一两块钱而已,比用片内flash做升级文件临时存放区便宜多了。
------------------------------------------------------------------......
-----------------------------------------------------------------------

很多,MXIC的MX25xxx系列,Winbond的W25Pxx系列,ST的M25Pxx系列

出0入0汤圆

发表于 2011-10-31 10:20:55 | 显示全部楼层
留个记号,以后用得上

出0入0汤圆

发表于 2011-10-31 11:23:38 | 显示全部楼层
MARK

出0入4汤圆

发表于 2011-10-31 11:53:54 | 显示全部楼层
最近也准备搞这个

出0入0汤圆

 楼主| 发表于 2011-11-1 00:39:40 | 显示全部楼层
回复【26楼】yinqiu009
前几年做过这方面的工作,很简单也很复杂,实现功能简单,做到健壮可靠很复杂。
1、准确。通讯过程准确--如果用串口通讯的,就需要选择有包号并且有重发机制的协议。
2、安全。目标代码加密,不怕别人获取目标代码反汇编。要能识别出目标代码是合法有效代码,否则会被别人随便乱下点什么进去了。
3、完整。如果加密的目标代码被修改,要能识别出被改动,不会被人为的破坏。
4、健壮。异常情况可逆可溯。在整个更新过程中都要保证任何失败的情况都要有一个可以执行的代码(即使是老代码,升级往往是修复bug但基本功能是不会有太大影响,但是如果升级导致设备不能正常工作是不能被谅解的)
5、高效。时间短,人工干预度低,方式多样:spi/com/usb。
抛砖引玉,流程图如附件:
iap流程图 (原文件名:流程图.pdf)  

-----------------------------------------------------------------------

流程图很漂亮,直接贴一下:

(原文件名:New Bitmap Image.JPG)

出0入0汤圆

发表于 2011-11-1 12:09:34 | 显示全部楼层
我不会贴图:)
核心思路:支持更新程序,但是如果如果更新过程中发生任何异常,导致更新没有完成,但是原设备起码还要能继续执行原来的程序。
这个流程图基本可以保证在更新的任何一个过程发生任何异常,设备都可以有一个起码可以运行的程序继续运行。

出0入0汤圆

发表于 2011-11-1 13:29:03 | 显示全部楼层
不错。。。。。。。。。。

出0入0汤圆

发表于 2011-11-1 13:37:55 | 显示全部楼层
好东西。

出0入0汤圆

发表于 2011-11-1 14:36:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-1 15:22:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-1 15:28:46 | 显示全部楼层
mark,学习

出0入0汤圆

发表于 2011-11-1 16:29:43 | 显示全部楼层
同意13楼的
另外还可以
BOOT只写个简单的串口引导,下载复杂的IAP程序到RAM运行
这样BOOT可以很简单,IAP程序还可以变化,实现不同的功能

出0入0汤圆

 楼主| 发表于 2011-11-2 23:37:24 | 显示全部楼层
回复【37楼】yinqiu009
我不会贴图:)
核心思路:支持更新程序,但是如果如果更新过程中发生任何异常,导致更新没有完成,但是原设备起码还要能继续执行原来的程序。
这个流程图基本可以保证在更新的任何一个过程发生任何异常,设备都可以有一个起码可以运行的程序继续运行。
-----------------------------------------------------------------------

贴图不难,只要是小尺寸的JPG文件,就会自动贴图。PDF及其他文件都是按附件显示。

出0入0汤圆

发表于 2011-11-3 05:41:07 | 显示全部楼层
mark 这个不错

出0入0汤圆

发表于 2011-11-4 09:29:57 | 显示全部楼层
mark,我正在做st的产品,用到升级,正不知道改怎么做呢。

出0入0汤圆

发表于 2011-11-17 17:00:51 | 显示全部楼层
"FLASH 破_处","放狗咬人" ,楼主灰常幽默!
比喻形象,思路清晰!顶一下^_^

出0入0汤圆

发表于 2012-1-10 23:15:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 23:27:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 15:39:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 16:53:51 | 显示全部楼层

出0入0汤圆

发表于 2012-1-11 17:57:07 | 显示全部楼层
记下

出0入0汤圆

发表于 2012-7-15 16:41:34 | 显示全部楼层
非常不错,过来学习一下。

出0入0汤圆

 楼主| 发表于 2012-8-21 00:06:15 | 显示全部楼层
参考贴应是这个:
http://www.amobbs.com/forum.php? ... 6&highlight=iap

出0入0汤圆

发表于 2012-8-21 09:20:39 | 显示全部楼层
mark iap      

出0入0汤圆

发表于 2012-8-21 10:22:43 来自手机 | 显示全部楼层
学习了……

出0入0汤圆

发表于 2013-7-5 14:14:24 | 显示全部楼层
mark一下,马上就要使用远程升级功能。

出0入0汤圆

发表于 2013-7-5 15:05:35 | 显示全部楼层
标记。。。。

出0入0汤圆

发表于 2013-7-5 15:15:26 | 显示全部楼层
很不错,特别是那个流程图

出0入0汤圆

发表于 2013-7-5 15:26:27 | 显示全部楼层
IAP  GOOD  MARK

出0入0汤圆

发表于 2013-7-5 15:31:10 | 显示全部楼层
同意楼上的观点。

出0入0汤圆

发表于 2013-7-5 23:12:55 来自手机 | 显示全部楼层
这对我来说是解惑贴,谢谢啦。

出0入0汤圆

发表于 2013-7-6 00:04:56 | 显示全部楼层
学习下            

出0入0汤圆

发表于 2013-7-7 21:36:10 | 显示全部楼层
学习楼主宝贵经验!!!

出0入0汤圆

发表于 2013-7-8 13:11:48 | 显示全部楼层
好东东,学习了

出0入0汤圆

发表于 2013-7-8 20:26:18 | 显示全部楼层

之前移植过但是一直没怎么弄清楚,谢谢lz了

出0入0汤圆

发表于 2013-7-19 14:15:21 | 显示全部楼层
收了。又一个IAP方案讨论。

出0入0汤圆

发表于 2013-7-24 15:56:16 | 显示全部楼层
楼主,有几个问题求解决:
1.IAP是否一定要用*.bin文件?bin文件内部并没有地址参数,不像hex文件 ,是怎么写到编译地址的?
2.能否片断式编译,在指定的地址空间写指定的函数?  从而iap更新部分函数。(不过可以用多段APP代替)

出0入0汤圆

 楼主| 发表于 2013-7-24 20:29:38 | 显示全部楼层
leahcim89 发表于 2013-7-24 15:56
楼主,有几个问题求解决:
1.IAP是否一定要用*.bin文件?bin文件内部并没有地址参数,不像hex文件 ,是怎么 ...

第一个问题可以回答。IAP不一定要用*.bin文件,hex文件也能用,但是*.bin文件会容易一些。其实*.bin文件是默认连续地址,中间无代码区用0xff填充;而hex文件对每段代码指定起始地址,中间无代码区跳过去而已。
第二个问题不知道答案。

出0入0汤圆

发表于 2013-7-24 23:25:22 来自手机 | 显示全部楼层
多谢楼主,记号先

出0入0汤圆

发表于 2013-7-25 02:26:12 | 显示全部楼层
mark,学习

出0入0汤圆

发表于 2013-7-25 09:58:32 | 显示全部楼层
本帖最后由 leahcim89 于 2013-7-25 10:05 编辑
xizi 发表于 2013-7-24 20:29
第一个问题可以回答。IAP不一定要用*.bin文件,hex文件也能用,但是*.bin文件会容易一些。其实*.bin文件 ...


.hex的iap为麻没有应用实例呢?按理说,它有地址定义,烧起来会更方便呀。



还有就是:.bin既然没有地址信息,那iap要写到IROM(0X800 2000)是什么进去的?程序上应该是BOOTLOADER控制的,但是.bin文件对应的.hex在keil编译时,为什么一定要把IROM指定到那里呢?
否则下进去也不正常。
下图是我APP在keil中编译时四种版本,Size大小不影响.bin。但前者会影响到.hex从而改变.bin.求解?



本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2013-7-25 10:19:55 | 显示全部楼层
leahcim89 发表于 2013-7-25 09:58
.hex的iap为麻没有应用实例呢?按理说,它有地址定义,烧起来会更方便呀。
还有就是:.bin既然没有地址信 ...

1. 之所以不用.hex烧写,可能是因为实际烧写过程要求连续地址传送数据。
2. .bin没有地址信息,但是使用默认地址。使用什么地址应是iap职责。

出0入0汤圆

发表于 2013-7-25 10:42:38 | 显示全部楼层
讨论帖,,,好东西,,,,,

出0入0汤圆

发表于 2014-8-9 20:45:12 | 显示全部楼层
这个逻辑不错,但是为什么不直接在b区运行呢

出0入0汤圆

发表于 2014-8-9 22:29:15 | 显示全部楼层
貌似直接在B区执行可行 直接在固定位置一个跳转地址
Boot直接跳转到B区执行

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 06:39

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

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