0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于IAP的嵌入式系统升级方案

西西 来源:f 作者:电子发烧友网 2019-01-01 08:40 次阅读

一、 需求引入

现有嵌入式设备:基于ARM Cortex-M3处理器、带以太网通讯功能。为降低设备维护成本节省宝贵的时间和金钱,需要设计网口升级固件功能。

本文描述了基于IAP和网口升级该嵌入式系统的方法,其中处理器为NXP公司的ARM Cortex-M3,开发环境为IAR Embedded Workbench for ARM。

IAP( In Applicatin Programming)在应用编程,一般指MCU可以通过通信端口UART口、网口等)从外部接收应用程序镜像并烧录到FLASH中实现固件升级。

基于IAP的嵌入式系统升级方案

图1网口升级固件

二、 原理介绍

先温习下小知识:一个典型的嵌入式软件地址空间如图2所示,程序代码(RO段)和初始化数据(RW段)都是存储在ROM(常见为FLASH)中,当系统上电运行时,BootLoader程序会把RW段数据从ROM中拷贝到RAM中(.data),同时它会清零未初始化数据段(.bss),设置栈(.stack)和堆(.heap),之后系统就可以正常运行了。

这里会有2个疑问:为什么要拷贝RW段呢?还有BootLoader程序是什么?第一个问题很简单,既然是RW(Read&Write)数据,那就只能保存在RAM中,因为ROM是无法执行“写数据”的操作。第二个问题很容易让程序员忽视,它的实现有2种,一种是由芯片的Boot代码(固化在ROM中)来执行拷贝,另一种是由编译器自带的代码(如IAR就有__iar_program_start函数)

基于IAP的嵌入式系统升级方案

图2软件地址空间

基于IAP固件升级一般会把软件设计成2部分:BOOT和应用程序,其中BOOT相当于PC机的BIOS负责升级固件和引导应用程序,它对于用户是不可见的;应用代码就是常见的嵌入式软件。这2个软件的存储如图3所示:

基于IAP的嵌入式系统升级方案

图3存储地址视图

我们再一起来看看BOOT和APP启动时序。当系统上电时,它首先从0地址找到中断向量表,取出Reset_Handler中断服务代码,该代码先初始化芯片(如PLL和中断寄存器),然后调用BootLoader代码执行搬运工作,把存储空间布置成图2右边的“运行地址视图”,之后跳转到用户代码的main()函数,此时BOOT软件启动完成。

BOOT代码开始检测是否需要升级固件,如果需要就从外部取APP镜像文件并烧录FLASH,最后一步都是启动APP软件。

那么BOOT代码如何启动APP代码呢?其实很简单,因为APP代码它自身包含中断向量表和BootLoader代码,BOOT代码只需要告诉MCU新的中断向量表地址,然后跳转到APP代码区。之后,APP的BootLoader会把自己的RW数据搬运到RAM中,同样也会布置存储空间如图2右边所示,最终跳转到APP代码的用户main()函数,这样APP代码完成了启动。

三、 IAP关键技术

首先,APP代码需要将程序地址重定向,在本例中需要把代码地址重定向到0x0001 0000。为什么要执行如此操作呢?我们看一个实例,假设代码中有调用f1(),如果没有执行重定向,那么f1()可能被链接器分配在0x1234,当PC寄存器导入该地址并解析指令执行时,致命的错误发生了——该地址根本没有f1()代码,因为APP代码是从0x0001 0000开始存储的。重定向就是告诉链接器,请从0x0001 0000开始定位程序代码,这样在本例中f1()将分配在0x0001 1234,才能正确调用f1()。

在IAR环境下程序空间重定向操作如下:打开“Options”-》“Linker”-》“Config”,点击“Edit”,在弹出的窗口中设置如图4所示地址空间。

基于IAP的嵌入式系统升级方案

图4链接器重定向代码地址

然后,BOOT代码在使用外设后,一定要De-Initialize该外设再启动APP代码,即要让APP代码认为MCU只是刚上电运行,而不是跑完一个系统再调用自己。如果BOOT代码没有执行该动作,当APP代码运行时,MCU的外设处于不确定状态(尤其是中断未关闭),可能会带来一些预料不到的错误。

再次,BOOT代码操作FLASH是通过调用IAP函数来实现的(NXP公司的IAP库函数提供Erase()/Write()/Compare()等),其中写FLASH函数一次操作只能接收256/512/1024/4096字节,如果不足也需要填充。

千万要注意的是调用IAP函数期间中断需要特别处理,一起看看NXP官方的说明文档(原为英文,翻译如下)“当IAP函数调用期间,芯片的BootLoader会暂时禁止访问用户ROM空间数据。用户ROM空间被映射到一些配置数据区以便于IAP调用。因此原来的中断向量地址没有包含正确的中断向量。所以当IAP调用正在处理时如果一个中断发生,该中断将不能被正确对待同时MCU的行为是不确定的。在一些情况下,当中断不能被正确处理时MCU将会复位。”

解决该问题有2种方法:如果中断是至关重要的(任何时候都不能禁止),那么需要把中断向量表和ISR重定向到SRAM中;另外一个简单的办法是调用IAP函数之前先禁止中断,调用完成之后再使能中断。在本固件升级中,采用第二种方法,毕竟短暂地关闭中断对于本设计是可以接受的。

最后,当APP代码被引导运行时,中断向量表不再位于0地址了,在本例中位于0x0001 0000,因此需要将这个新地址告诉MCU,有一专门寄存器VTOR(Vector Table Offset Register)用来存储该地址。该工作必须由BOOT代码来完成,因为一旦跳转到APP代码MCU第一件事情就是访问中断向量表。

千万小心的一个错误是:APP代码不要再对VTOR寄存器进行任何操作,否则MCU将因为无法访问中断向量表而紊乱。(本人就遇到这个错误,APP代码中的汇编文件startup_LPC17xx.s启动时“静悄悄地”调用了NXP库函数SystemInit,该函数会重置VTOR导致APP的中断不能使用,这个错误查了整整一天呀!)。

四、 网口下载镜像

本部分内容是偏向策略进行设计,因此很多地方值得商榷,在这里坚持的原则是——简单就是美。

首先,通信帧直接建立在802.3以太网协议上,这样保证简单化;然后,不管镜像文件实际长度,一律向1KB取整,不足则填充0;其次,因为以太网MTU为1518字节,通信帧每次传输1KB镜像文件;再次,嵌入式系统与PC机通讯采用“停等+ACK”机制,即PC机只有接收到第i帧确认后才能传输第i+1帧;最后,为确保镜像文件在传输中不受损,每帧都包含CRC校验码。

图5较好地描述了升级固件时PC与嵌入式设备的通讯逻辑。当设备发出握手帧连续10次无应答后,BOOT代码将直接引导原APP程序启动,即无需升级固件;正常升级固件时,首先有3次握手,接下来是分片传输镜像文件,最后嵌入式设备会回应“升级成功”帧;如果某分片通讯时发生错误,嵌入式设备会回应“错误原因”帧,当重传达到5次仍出错时PC机需要提醒用户,最好还能说明错误原因。

基于IAP的嵌入式系统升级方案

图5升级固件通讯时序

嵌入式设备回应PC的数据帧直接封装字符串,这样做的好处是可以通过截取数据包查明通信内容;而PC机传输给设备的数据帧采用二进制,主要是照顾嵌入式系统较弱的计算和存储能力,该二进制通讯帧格式如图6所示。

基于IAP的嵌入式系统升级方案

图6二进制通讯帧格式

FLASH一般是由Sector组成的,并且在写操作之前需要擦除该Sector。本系统中使用的FLASH共30个Sector,前16个均为4KB,后14个为32KB,为了简化设计,将BOOT放置在前16个Sector中,共计64KB,APP镜像放置在后14个32KB的Sector中,共448KB。

这样安排程序依赖如下设定:镜像文件起始位置为0x0001 0000,每接收与写入FLASH字节数为1024,当写入FLASH地址为Sector之首时需要擦除该分区,逻辑流程如图7所示。

基于IAP的嵌入式系统升级方案

图7分片写镜像文件

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9091

    浏览量

    367507
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3590

    浏览量

    129463
  • IAP
    IAP
    +关注

    关注

    2

    文章

    163

    浏览量

    24284
收藏 人收藏

    评论

    相关推荐

    实用的CAN总线分布嵌入式系统升级设计方案

    嵌入式系统具有智能化程度高、体积小、可靠性高、实时性强等诸多优点,已经越来越多地应用于消费电子、工业控制、汽车电子等各个行业。往往一个大的系统又由许多小的嵌入式
    的头像 发表于 01-13 07:30 8599次阅读
    实用的CAN总线分布<b class='flag-5'>式</b><b class='flag-5'>嵌入式</b><b class='flag-5'>系统升级</b>设计<b class='flag-5'>方案</b>

    一种嵌入式系统升级的设计和实现

    。本文提出了利用LPC2148的SD卡实现嵌入式系统升级的设计方案。  2、总体系统升级方案设计  厂家生产出产品后,用户购买回去使用,当设
    发表于 07-18 08:31

    利用SD卡实现嵌入式Linux系统的自动升级

    系统适应性。传统的嵌入式系统升级,首先通过JTAG接口将Bootloader烧写到目标板的Flash中,然后在Bootloader中,将内核映像文件和文件系统映像文件通过串口或者网络下
    发表于 12-07 09:24

    嵌入式系统怎么实现远程监控和升级

    网络、以电子邮件为载体的嵌入式系统远程监控和升级方案,达到远程修改系统参数、索取系统自检报告、索
    发表于 08-02 06:49

    嵌入式JavaPOS系统接口怎么测试?

    随着嵌入式计算机应用技术的发展,嵌入式技术已经广泛应用到现代生活的方方面面。在零售系统方面,零售收款机是嵌入式应用的一个重要领域。目前,市场上的收款机大体上可分为三类:第一类是基于PC
    发表于 10-08 08:05

    怎样去设计一种SFP+双MCU光收发模块嵌入式系统

    本文基于ADuC7023a的硬件平台和Keil4的软件平台,设计了一种SFP+双MCU光收发模块嵌入式系统升级方案
    发表于 05-24 06:02

    嵌入式系统在线升级流程是怎样的

    嵌入式系统在线升级流程:1.U-boot判断Boot Flag Param 分区中的Boot Flag == 02.启动Normal App系统,进入
    发表于 12-22 07:23

    Linux嵌入式系统升级的相关资料推荐

    Linux 嵌入式系统升级转载于:https://www.cnblogs.com/aaronLinux/p/6979963.html
    发表于 12-27 08:02

    基于GIS的多点嵌入式系统远程在线升级

    在利用嵌入式终端进行河流水质数据采集的分布系统中,由于终端数量众多,分布范围广,嵌入式系统升级非常困难。针对该困难,提出一种基于GIS的多
    发表于 07-08 15:09 13次下载

    基于LPC2148用SD卡实现嵌入式系统升级的应用设计

     在嵌入式系统中,为了实现设备终端的内核、文件系统升级和设备功能维护,一般是将目标板连接到主机,通过JTAG口、串口或网口来实现升级。在此,提出一种更为方便的升
    发表于 12-20 16:58 37次下载

    基于LPC2148的SD卡实现嵌入式系统升级设计

    嵌入式系统中,为了实现设备终端的内核、文件系统升级和设备功能维护,一般是将目标板连接到主机,通过JTAG口、串口或网口来实现升级。在此,提出一种更为方便的
    发表于 06-02 15:51 40次下载
    基于LPC2148的SD卡实现<b class='flag-5'>嵌入式</b><b class='flag-5'>系统升级</b>设计

    嵌入式设备远程在线升级技术的研究

    介绍了嵌入式系统远程在线升级的工作原理,并详细阐述了系统硬件平台及软件的设计原理,提出了基于Internet通信方式的嵌入式
    发表于 06-04 15:50 49次下载
    <b class='flag-5'>嵌入式</b>设备远程在线<b class='flag-5'>升级</b>技术的研究

    基于CAN总线的分布嵌入式系统升级方案

    汽车电子系统中的车载GPS、倒车雷达、发动机控制、仪表盘系统等,数控机床中的键盘显示系统、马达控制系统等,这些无一不是嵌入式
    发表于 01-22 11:57 1731次阅读
    基于CAN总线的分布<b class='flag-5'>式</b><b class='flag-5'>嵌入式</b><b class='flag-5'>系统升级</b><b class='flag-5'>方案</b>

    ARM在线升级的应用IAP代码

    ARM嵌入式应用程序架构设计实例精讲--ARM在线升级的应用IAP代码
    发表于 07-08 11:08 6次下载

    基于IAP远程升级技术在空间应用系统解决方案

    IAP可通过专门设计的固件程序来编程内部存储器,不需要硬件支持,所以IAP技术提高了嵌入式系统的可扩展性与可维护性,能在不变的硬件平台上升级
    发表于 11-27 17:19 2次下载
    基于<b class='flag-5'>IAP</b>远程<b class='flag-5'>升级</b>技术在空间应用<b class='flag-5'>系统</b>解决<b class='flag-5'>方案</b>