1 前言

上一篇单片机 IAP 功能基础开发篇之APP升级(二)讲到了单片机给 APP 程序升级具体的设计方案,这篇介绍的是升级进阶功能,如何在编译后在程序结束地址自动加上校验标志(可以通过脚本工具,但这里介绍的是在程序中编译后添加)。

1.1 目的

本文所写的是如何不通过下载器的方式实现单片机中的程序更新,目前介绍的是 STM32 的 BootLoader 进阶设计方案。


2 前期准备

2.1 编译过程

首先我们先了解一下 C 源代码编译一共经过以下的过程:预处理 -> 编译 -> 汇编 -> 链接 -> 执行文件

预处理:    展开头文件/宏替换/去掉注释/条件编译
编译:        检查语法,生成汇编
汇编:        汇编代码转换机器码
链接:        链接到一起生成可执行程序

而 MDK 的编译过程如图所示(借网上的)

2.2 分散加载文件

ARM 的链接器提供了一种分散加载机制,在链接时可以根据分散加载文件(.scf 文件)中指定的存储器分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址。这样,当嵌入式系统在复位或重新上电时,在对 MCU 相应寄存器进行初始化后,首先执行 ROM 存储器的 Bootloader 代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,这样,定位在 RAM 存储器的代码和数据就在RAM 存储器中运行,而不再从 ROM 存储器中取数据或取指令,从而大大提高了 MCU 的运行速率和效率。

应用场景:有时候用户希望将不同代码放在不同存储空间,也就是通过编译器生成的映像文件需要包含多个域,每个域在加载和运行时可以有不同的地址。要生成这样的映像文件,必须通过某种方式告知编译器相关的地址映射关系(在 MDK/ADS/IAR 等编译工具中,可通过分散加载机制实现。分散加载通过配置文件实现,这样的文件称为分散加载文件)这里不做详细介绍,有兴趣的可自行百度(周立功单片机:分散加载文件浅释.pdf)。


3 APP 工程应用

3.1 修改分散加载文件

设置指定的分散加载文件(拷贝默认的文件至指定路径,然后重新选择即可)

STM32 的默认分散加载文件内容如下:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; ************************************************************* LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}

需要修改成以下的内容,添加通用信息段(code_info)和代码结束段(CodeEndFlag)

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; ************************************************************* LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*(.code_info, +First)
*.o (RESET)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
*(.CodeEndFlag, +Last)
}
}

3.2 定义和声明

在程序中定义结束标志(方便升级时擦除时就只需要擦除升级程序需要的内存了)

/* FLASH分区校验码 */
#define FLASH_EFFECTIVE_VALUE (uint32_t)0x5555AAAA /**
* @brief Flash分区通用内容信息结构体定义.
*/
typedef struct {
uint32_t effective; /*!< 有效校验码 */
uint32_t startAddr; /*!< 起始地址 */
uint32_t endAddr; /*!< 结束地址 */
uint32_t reserve[13]; /*!< 预留 */
} FlashComInfoType; /* app 程序 FLASH 分区程序段起始/结束地址 */
#define CODE_FLASH_START_ADDR (uint32_t)Load$$ER_IROM1$$Base
#define CODE_FLASH_END_ADDR (uint32_t)(Load$$RW_IRAM1$$RW$$Limit - 0x4) // -4 的原因是减掉 section(".CodeEndFlag") 的大小 extern uint8_t Load$$ER_IROM1$$Base[]; /* 程序在 FLASH 的起始地址 */
extern uint8_t Load$$RW_IRAM1$$RW$$Limit[]; /* 程序在 FLASH 的结束地址(Code + RO + RW) */ /** Flash扇区结束标志 */
static volatile uint32_t sg_appEndFlagend __attribute__((used, section(".CodeEndFlag"))) = FLASH_EFFECTIVE_VALUE; /**
* @brief APP 代码Flash扇区的信息.
* @note 随编译自动在Flash中储存以下信息,
* 由于系统运行时不会在RAM中分配空间(地址为Flash对应的地址), 则只读.
* 在外部引用时会报错.
*/
const FlashComInfoType gc_appFlashInfo __attribute__((used, section(".code_info"))) = {
FLASH_EFFECTIVE_VALUE,
CODE_FLASH_START_ADDR,
CODE_FLASH_END_ADDR,
{0}
};

3.3、编译

编译完成后可以打开hex文件查看(从地址看起始地址为 0x08000000,结束地址为 0x08000D38,结束地址后紧跟代码结束校验标志)

代码所在的内存图如:


4 Boot 工程代码应用

在 boot 代码中定义同样的结构体,通过结构体指针的方式指向 APP 区的Flash分区通用内容信息结构体。

const FlashComInfoType *gc_pAppFlashInfo = (FlashComInfoType *)APP_CODE_FLASH_START_ADDR;

通过该 APP 的信息在 boot 中得到代码结束地址,在升级时擦除至结束地址所在的 Flash 段即可,不必全部擦除,从而缩短升级时间,且在升级完成后 APP 跳转时检查 APP 代码结束地址的标志是否符合预期。

单片机 IAP 功能基础开发篇之APP升级(三)的更多相关文章

  1. 开发一款APP需要多少钱

    移动互联网近几年发展尤为迅速,越来越多的企业也开始将目光聚集到了移动互联网,这意味着移动互联网时代到来,而移动APP应用是竞争的一个因素.在移动互联网时代,移动APP开发已经不再是什么新鲜事了,许多的 ...

  2. Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...

  3. 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...

  4. C# Xamarin移动开发基础进修篇

    一.课程介绍 英文原文:C# is the best language for mobile app development. Anything you can do in Objective-C, ...

  5. 微信公众平台开发:进阶篇(Web App开发入门)

    本文转载至:http://blog.csdn.net/yual365/article/details/16820805  WebApp与Native App有何区别呢? Native App: 1.开 ...

  6. 【转载】salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载

    salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载   目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...

  7. 云小课|DGC数据开发之基础入门篇

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...

  8. 还在花钱搞开发?猿团YTFCloud,零基础照样做专业APP

    近日,猿团科技再推新品:YTFCloud.这是一套一体化的云端解决方案,用户可以通过平台提供的各类解决方案,一键创建应用,也就是说,YTFCloud实现了APP的DIY自制,用户无需懂得编程,零基础制 ...

  9. javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)

    引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...

  10. iOS开发基础:最新的APP打包上架流程

    之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...

随机推荐

  1. 介绍几种OPTIONS检测的方法

    概述 日常的VOIP开发中,OPTIONS检测是常用的网络状态检测工具. OPTIONS原本是作为获取对方能力的消息,也可以检测当前服务状态.正常情况下,UAS收到OPTIONS心跳,直接回复200即 ...

  2. Proxifier 2023年11月时最新版 激活教程

    前言 Proxifier 是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链.支持64位系统支持Xp,Vista,Win7,支持s ...

  3. 银行个人住房贷款LPR办理流程-建行app

    8月底之前即将需完成银行的个人住房贷款定价基准利率的转换.选择"LPR+浮动利率"或者"固定利率". 以下举例建行app上办理方法给大家参考下. 办理方案: 一 ...

  4. JVM 性能调优 及 为什么要减少 Full GC

    本文为博主原创,未经允许不得转载: 系统上线压测,需要了解系统的瓶颈以及吞吐量,并根据压测数据进行对应的优化. 对压测进行 JVM 性能优化,有两条思路: 第一种情况 : 使用压测工具 jmeter  ...

  5. cout对象在全局只能拥有一个

    1.问题 在学习符号重载的过程中,有一个想法 std::ostream& operator<<(std::ostream &cout, Person &p); 中s ...

  6. phpcms - 获取单网页 , 例如关于我们

       {pc:get sql="select * from phpcms_page where catid=2" num="1"}         {loop  ...

  7. Qt5.9 UI设计(四)——布局设计及自定义界面

    前言 前面我们已经创建了mainwindow ControlTabWidget ControlTreeWidget maintitlebar 4个UI几面,我们需要将其他三个UI放置到mainwind ...

  8. [转帖]ipv6相关内核参数配置的优化实践

    https://zhuanlan.zhihu.com/p/605217713 调整ARP缓存大小 这个参数通常需要在高负载的访问服务器上增加.比如繁忙的网络(或网关/防火墙 Linux 服务器),再比 ...

  9. SkyWalking的学习之二(性能优化以及log)

    SkyWalking的学习之二(性能优化以及log) 背景 周六在家学习了SkyWalking的交单部署和agent的方式获取日志. 万恶的周天上班到公司发现出现了宕机. 具体原因是我想进行SkyWa ...

  10. [转帖] Linux命令拾遗-网络抓包工具

    https://www.cnblogs.com/codelogs/p/16060684.html 简介# Linux中有很多抓包工具,如ngrep.tcpdump与tshark等,它们有很多用法与使用 ...