关注、星标公众,不错过精彩内容

转自公号:最后一个bug

二次整理:strongerHuang

做软件开发的人,都知道程序升级。升级的方式有很多,今天就来讲讲升级的软件的设计思路。

一、ISP/ICP/IAP名称解释

在我们学习MCU的过程中经常看到IAP、ISP、JTAG等等一些与在线编程相关的专业名词,可能很多小伙伴到现在都迷迷糊糊的,这里简单为大家介绍一下:

1)ICP -(In-circuit programmer)  

ICP表示在电路编程,MCU内部不需要有程序,直接上电就能够进行对程序存储区域进行编程的方式,我们平时使用JTAG或者SWD等等就属于这种方式。

2)ISP - (In-system programer) 

ISP表示在系统编程,通过MCU专用的串行编程接口进行编程,那也就是说MCU需要具有运行的外部条件,比如需要有晶振等等。比如说平时使用的stm32通过设置boot引脚设置对应启动模式,然后通过串口等对内部Flash进行升级,可以说这种方式就是厂家在芯片内部固化了一个BootLoader程序。

3)IAP - (In-application programer) 

IAP表示在应用编程,这种名词应该是大家在平时学习过程中见得比较多的,相当于自己定制一个BootLoader程序,自己通过编程设计可以实现各种升级的方式比如串口、CAN、以太网等等,非常的灵活。其实这个BootLoader程序也是我们自己设计的程序,你也可以认为是一个App程序,相当于通过对App划分职责对自己进行更新和升级。这种方式也就是我们今天话题的主角。

二、MCU软件升级设计思路

对于我们的MCU现在大部分的都是使用Flash来存储程序,同时程序内部也会有读写Flash的接口函数,中断也可以方便的重定位,这样就非常适合IAP程序的开发。

1)IAP升级V1.0

升级软件设计图:

我们把MCU的Flash分区分为如上图所示的三个部分,Bootloader就是我们所要编写的启动程序,App程序为项目的实际应用程序,Param区域是用于存储相应的版本App的版本信息以及完整性校验标志序列等传递数据区域。

工作方式1:当MCU启动以后运行Bootloader程序,检测到Param参数区域是否存在App记录,如果存在App直接运行App程序即可,如果不存在,则向PC机请求App文件。

工作方式2:当MCU运行App过程中,接收到PC机的升级请求,更新Param参数区域,并跳转到BootLoader进行App程序的接受和升级,升级完成以后处理Param参数区域并运行对应的新App程序。

V1.0算是比较常规的应用案例,我们都知道对MCU内部Flash进行编程一般会有解锁、擦除、写入和验证几个阶段,当我们擦除原来MCU存储的App程序以后如果手头上没有相关的固件,基本上就不能恢复了,这样如果我们想退回到之前的版本不可能了!于是升级方案还需要在改善一下。

2)IAP升级V2.0 

为了解决V1.0提出的问题我们App分成了两部分如下图所示:

解析一下:上面两张图的原理是一样的,都是把接收到的新App保存起来(如果你用于备份老的App也是可以的),图1是通过把MCU内部Flash进行划分,一部分用于存储新App,另外一部分是原来运行的App区域,这样的话,当我们通过bootloader接收完完整的新App进行校验、解密处理以后便可以写入到平时运行的App区域,从而防止了V1.0在升级过程中掉电、通信异常导致擦除了App的问题。

同时,我们也可以把上一版本App备份到我们预留的内部Flash或者外部存储设备中,如果想还原系统即可直接通过PC发送相应命令进行恢复即可。

好了,又有小伙伴提出问题,大家都知道我们自己编写的BootLoader是非常灵活的,可以支持多种通信协议的升级模式,不过在前期我们可能没有考虑完善,后续想进一步完善相应功能就需要我们对Bootloader进行升级,那么我们可以通过App对Bootloader进行升级操作,一般这种方式就可以满足需求,不过如果在升级BootLoader过程中发生故障,那Bootloader全部被擦除导致整个MCU变成了个砖头。好吧,是时候上V3.0版本的IAP程序了。

3)IAP升级V3.0 

为了解决V2.0问题,作者设计了第三种升级方式:

解析一下:在V2.0的基础上我们增加了Bootloader2,对于Bootloader1相当于固化在MCU中自定义的一种升级方式,而Bootloader2是可以根据我们启动升级需求进行升级的区域,这样即使在升级过程中擦除,我们也可以通过BootLoader1或者App2来进行恢复Bootloader2。

不过具体的实现过程会设计到较多的逻辑处理,大家在实现该方案的同时需要前期进行软件上的设计和梳理。

免责声明:本文转自最后一个bug,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

推荐阅读:

几种常见的校验算法

为什么IoT设备的操作系统选用RTOS

分享一篇专治MCU各种 HardFault 的库

关注微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。

长按前往图中包含的公众号关注

剖析MCU的IAP升级软件设计思路相关推荐

  1. 保护你的聊天隐私---“外挂式”加密软件设计思路

    保护你的聊天隐私---"外挂式"加密软件设计思路<?xml:namespace prefix = o /> Jack zhai 即时通讯工具(常用的是聊天软件与网上电话 ...

  2. Pinterest 3.0 for iOS设计过程——升级iOS7设计思路详解

    Pinterest 3.0 for iOS设计过程--升级iOS7设计思路详解 时间2013-12-11 11:39:31  苹果开发中文站 原文  http://www.cocoachina.com ...

  3. QQ开心农场外挂软件设计思路

    今天玩了一下QQ的开心农场,我有一堆朋友在玩.每次去偷别人的东西时,都要一个一个地点选,看看是否有可摘的东西.然后还要一个个地点摘取,这样才算偷到,感觉好像有点太麻烦了. 有时候朋友的东西可摘了,但是 ...

  4. 双色球软件设计思路及初步源码

    软件功能: 一.双色球共1107568注二等奖,这些注里可以过滤掉的垃圾号如下: 1.六连号.五连号.四连号.三连号.甚至二连号 2.全偶数.全气数奇数 3.已经开过的奖号 4.已经开过的奖号的五重号 ...

  5. 项目开发团队分配管理软件设计思路

    1.首先构建三个包分别为domain(领域),service(服务),view(视图),用来保存创建的各个类 2.首先创建登录注册的服务(loginService)和视图(loginView),创建对 ...

  6. 无图言屌?YYImage 设计思路,实现细节剖析

    点击上方"iOS开发",选择"置顶公众号" 关键时刻,第一时间送达! 前言 图片的历史早于文字,是最原始的信息传递方式.六书中的象形文构造思想就是用文字的线条或 ...

  7. 现场升级方案:LPC1788采用U盘方式进行程序IAP升级功能的实现

    现场升级方案:LPC1788采用U盘方式进行程序IAP升级功能的实现 闲来无事,总结一下前段时间做过的U盘升级项目.一个新手的成长之路在于善于总结,生活也是一样扯远了,我准备了两个软件环境,一个带操作 ...

  8. 《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程

    本节书摘来异步社区<挖掘管理价值:企业软件项目管理实战>一书中的第2章,第2.4节,作者: 徐勤 责编: 杨海玲, 更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  9. 软件设计是怎样炼成的(1)——什么是优秀的设计?

    摘要: 某项目的设计文档评审会上,各路技术大牛进行了"热烈"的讨论,讨论的焦点是怎样的设计才漂亮!大家围绕着如何OO,如何高内聚低耦合,如何反转控制等话题进行了"热烈&q ...

最新文章

  1. 与后台交互方法一 ——Ajax
  2. visual studio 运行java_Visual Studio 支持 Java?谣言止于智者
  3. 好爽!我在上海被机器人“马杀鸡”了
  4. linux 打开文件错误 too many open files 解决 ulimit 简介
  5. Swift之高德地图自定义标注弹出气泡样式
  6. php uncaught thrown,PHP异常详解
  7. 单利 java_Java设计模式-单利模式
  8. BZOJ1901: Zju2112 Dynamic Rankings
  9. 七、MySql-锁与事物
  10. windows下git安装配置
  11. 计算机基础硬件知识试题及答案,计算机基础知识试题及答案大全(总结一)
  12. android随机抽奖代码_Android自己定义效果——随机抽奖
  13. What Music简单的全网音乐播放器
  14. NTP时间服务器安装配置详解
  15. 7-2 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承) (10 分)
  16. C语言博客作业--一二维数组
  17. 微信公众号使用:在微信公众号文章中嵌入小程序的方法
  18. 下载测试视频网站分享
  19. HTML的style属性(替代font等标签)
  20. 编写configure.ac

热门文章

  1. 1.算法设计的基本方法(一)
  2. Html中识别换行符‘\n‘
  3. TypeScript基础语法
  4. 独立域名博客的生存之道
  5. Redis安装,配置
  6. 上海基诺墙绘 DIY打造居家黑板涂鸦墙 个案例精图细化
  7. 单一职责原则(Single Responsibility Principle)
  8. python的浮点数占多少个字节_float占几个字节
  9. 美颜相机 01 - 图像的重绘
  10. java drawimage图片不完整,调了一天没调对,是drawImage问题,说是空指针