引言

目的

主要介绍单片机 IAP 开发的设计思路,如何不使用下载烧录器的方式对单片机的程序进行升级,升级区域包括 bootloader 和用户程序的升级,升级方式有 UASRT 通信、CAN 通信和 OTA 升级。
本文目前介绍的是 bootloader 对 Bootloader 程序区升级的开发设计思路。

术语及缩写

BOOT:Bootloader 程序
APP:用户程序

参考资料


详细设计

前言

单片机程序都是在 FLASH(ROM)中,通过 单片机 IAP 功能基础开发篇之APP升级(一) 知道, APP 的程序升级是在 Bootloader 中实现的,那么 Bootloader 的程序升级是在哪实现的呢?还是 Bootloader。

实现方式

通过 Bootloader 升级 Bootloader,方法目前我了解的有两种。

Bootloader 互相升级

通过一个 Bootloader 升级另一个 Bootloader,即该程序中存在两个 Bootloader,严格来说的有三个,只不过其中一个和其他两个 Bootloader 的功能不一样,可以称其 Bootloader 的引导程序。

内存分配图如下:

MCU 分区 内容描述 备注
引导程序区 中断向量表
引导可执行程序 决定执行哪一个 Bootloader
Bootloader 1 程序区 重定向的中断向量表 需要软件配置
BOOT 可执行程序
Bootloader 2 程序区 重定向的中断向量表 需要软件配置
BOOT 可执行程序
用户程序区(APP) 重定向的中断向量表 需要软件配置
APP 可执行程序
数据储存区 系统需要下电保存的数据 可选择划分该区域

执行流程

通过引导程序,检测 Bootloader 1 和 Bootloader 2 的最新状态,校验通过后执行最新的 Bootloader ,然后再进行跳转 APP。其中 Bootloader 1 和Bootloader 2 的功能一致,不同只在于升级 Bootloader 时擦写FLASH的地址不同;
该设计方式较为复杂,需要四个独立的工程,若可实现 Bootloader 的配置,则只需要三个独立的工程即可(Bootloader 的功能相同,其他地址信息不同)

引导程序流程图

Created with Raphaël 2.2.0

开始

系统初始化

BOOT 至少一个有效

BOOT 1 符合

跳转至 BOOT 1 运行

结束

跳转至 BOOT 2 运行

yes

no

yes

no

Boot程序流程图

仅介绍升级 boot 程序的流程图,APP可看 单片机 IAP 功能基础开发篇之APP升级(一) 的 boot 流程图,其中,升级流程一致,不同的是 BOOT 升级或 APP 升级时的校验、擦写 FLASH 地址等信息的不同。

Created with Raphaël 2.2.0

开始

系统初始化

升级请求

根据升级指令分别实现

对BOOT和APP的升级

升级完成

APP 程序存在

BOOT 退出处理

跳转至APP运行

结束

计数超时

yes

no

yes

no

yes

no

yes

no

Bootloader 自升级

通过 Bootloader 升级 Bootloader,即该程序中只存在一个 Bootloader。
内存分配图如下:

MCU 分区 内容描述 备注
Bootloader 程序区 中断向量表
BOOT 可执行程序
用户程序区(APP) 重定向的中断向量表 需要软件配置
APP 可执行程序
数据储存区 系统需要下电保存的数据 可选择划分该区域

执行流程

由于单片机的程序是在 Flash 中运行的,如果按照普通的做法,通过 Bootloader 自升级,则会出现在收到升级指令后,会将 Bootloader Flash 的程序全部擦除,这样就会导致程序跑飞,最后成了“板砖”。
要实现 Bootloader 自升级,而且需要保证不会因为擦除了FLASH导致程序无法运行,就需要将程序运行在 RAM 中,在 RAM 中擦除 FLASH 的程序,并不影响 RAM 中的程序执行,即在程序启动后,需要将 Bootloader 的程序拷贝至 RAM 中执行。

当然并不是在程序中简单的通过拷贝函数将 FLASH 的程序拷贝到 RAM 中就可以了,而是需要通过修改链接文件,甚至还需要修改启动文件等才能实现该功能

Boot程序流程图

Created with Raphaël 2.2.0

开始

将 Boot FLASH 的程

序拷贝至 RAM 中

系统初始化

升级请求

升级中

升级完成

APP 程序存在

BOOT 退出处理

跳转至APP运行

结束

计数超时

yes

no

yes

no

yes

no

yes

no

实现方式对比

Bootloader 互相升级

优点

  • 系统升级功能稳定,基本不会出现升级失败后成为“板砖”
  • 不用担心 RAM 的大小

缺点

  • 实现复杂,至少三个独立工程(如果 boot 不能配置,则四个)
  • FLASH 需要较大的内存

使用场景

  • BOOT 升级需求度高,BOOT 的更新迭代相对多一点
  • 对 BOOT 升级的稳定性比较严格,OTA 升级等

Bootloader 自升级

优点

  • 适用于 FLASH 不够大的MCU
  • 功能实现相对简单,两个独立工程

缺点

  • 系统升级功能不稳定,升级失败后若断电,则会成为“板砖”(只要不断电,就可以反复升级直到成功)
  • RAM 太小不适合(bootloader的程序大小小于 RAM 大小,且相关变量也占用了 RAM 空间)

使用场景

  • BOOT 升级需求度低,BOOT 的更新迭代基本不需要
  • 对 BOOT 升级的稳定性没有过度严格,每次升级都至少保证现场有开发人员,防止升级失败成“板砖”

单片机 IAP 功能进阶开发篇之BOOT升级(一)的更多相关文章

  1. ArcGIS Engine开发鹰眼图的功能(代码优化篇)

    在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇) 上一篇的实现效果图如下, 如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖. 如果红色框包括整张图的话, ...

  2. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

  3. Spring Boot上传文件功能的开发

    Spring Boot上传文件功能的开发 Spring Boot使用Servlet 3的API javax.servlet.http.Part来支持文件上传.Spring Boot在类Multipar ...

  4. 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  5. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)

    一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...

  6. STC单片机 IAP(EEPROM)的使用

    STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...

  7. 华清远见金牌讲师名家大讲堂Android开发篇成功举办

    2014年3月5日.12日华清远见金牌讲师名家大讲堂(以下简称名家大讲堂)在线讲座全新升级开讲,至此拉开了新一年名家大讲堂的序幕! 华清远见名家大讲堂作为业内颇具影响力的公益免 费线上课程,自2009 ...

  8. nginx模块开发篇 (阿里著作)

    背景介绍 nginx历史 使用简介 nginx特点介绍 nginx平台初探(100%) 初探nginx架构(100%) nginx基础概念(100%) connection request 基本数据结 ...

  9. E8.Net工作流平台开发篇

    E8.Net开发篇(一)   E8.Net开发框架有哪些源程序模型? E8.Net开发框架为开发企业流程应用系统提供了最佳实践的开发架构.范例及源代码,包括待办事项的组织.流程启动模型.处理模型.母版 ...

  10. 单片机IAP学习

    1.IAP是什么--简介 IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可 ...

随机推荐

  1. 解决Xshell/Xftp提示“要继续使用此程序必须应用到最新的更新或者新版本”(临时规避和彻底解决方案)

    一.xshell与xftp登录时提示,但是更新却又每次都失败,无法登录 二. 临时规避方案:手动修改日期为1年前,问题解决软件可以打开,但是每次启动都要手动修改,甚是麻烦  三.彻底解决方案,修改xs ...

  2. Go 标准库之 io.Copy 和 ioutil.ReadAll

    1. go 标准库之 io.Copy 和 ioutil.ReadAll 1.1 介绍 go 标准库中通过 ioutil.ReadAll 实现数据流的读取,io.Copy 实现数据流的读取和写入. 那两 ...

  3. 05-逻辑仿真工具VCS-执行过程

    Verilog Simulation Event Queue 主要了解VCS是如何处理交给它的代码的 Verilog的仿真事件队列,介绍VCS如何处理交给它的代码.VCS是Synopsys公司的,支持 ...

  4. VSCODE配置tasks.json

    1.新建配置任务tasks.json 选择gcc.exe 可以在其中按需修改 { "version": "2.0.0", "tasks": ...

  5. 聊聊x86计算机启动发生的事?

    大家好,我是呼噜噜,最近在看linux早期内核0.12的源码,突然想到一个困扰自己好久的问题:当我们按下电源键,计算机发生了什么?神秘地址0x7C00究竟是什么?操作系统又是如何被加载到硬件中的?带着 ...

  6. Mygin实现分组路由Group

    本篇是Mygin第五篇 目的 实现路由分组 为什么要分组 分组控制(Group Control)是 Web 框架应该提供的基础功能之一,对同一模块功能的开发,应该有相同的前缀.或者对一部分第三方接口, ...

  7. [转帖]1. awk基础,awk介绍,awk基本语法,直接使用action,打印列,初识列和行,\$0、\$NF、NF,基础示例,begin模式,end模式

    文章目录 前言 awk介绍 awk基本语法 直接使用action 打印列 初识列和行 \$0.\$NF.NF 基础示例 初识模式(begin end) 总结 友情链接 前言 本小节是awk基础入门课程 ...

  8. [转帖]jmeter编写测试脚本大全

    目录 一.背景 二.按照功能划分 2.1 加密处理.验签处理 2.2 jmeter 使用beanshell 编写脚本 2.3 jmeter脚本报错大全 2.4 jmeter打印log 2.5 jmet ...

  9. [转帖]「更易用的OceanBase」|OceanBase 4.0 一体化安装包 - 把简单留给用户

    https://www.modb.pro/db/565842 1. OceanBase 3.x 版本安装浅谈 我是在 OceanBase 3.1.4 版本的时候开始尝试入手测试的.刚开始 OB 3.x ...

  10. Nginx的再学习

    第一部分 Nginx的版本 Nginx官网提供了三个类型的版本 Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版 Stable version:最 ...