一种实现软件更新和软件备份的嵌入式系统及其实现方法
技术领域
本发明涉及嵌入式系统领域,具体涉及一种实现软件更新和软件备份的嵌入式系统及其实现方法。
背景技术
随着信息产业的发展,以微控制器(MCU)/微处理器(MPU)为核心的嵌入式系统的应用越来越广泛。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。嵌入式系统是硬件和软件的结合体,在硬件不变的情况下,运行不同的软件可以实现不同的功能,很多时候设计者都是先设计成一款通用的硬件平台,然后再设计不同的软件,通过更换不同软件配套不同产品来实现不同的产品功能,如何实现方便的软件更新、升级和维护是嵌入式系统设计的重点。
目前应用比较广泛的嵌入式系统有采用8位MCU和32位MCU/MPU的嵌入式系统。采用32位MCU/MPU的嵌入式系统由于MCU/MPU处理能力比较强,通常都可以运行比较高级的嵌入式操作系统,如uCLinux、Linux、Vxworks、WinCE等,因此实现软件更新比较简单。而对于采用8位MCU的嵌入式系统,由于MCU处理能力比较弱,软件基本都是采用前后台设计或运行简单的多任务内核,由于没有文件系统支持,实现软件更新比较困难,要实现更进一步的软件备份则更加困难。
虽说32位MCU/MPU比8位MCU性能高,但其在产品中性价比却不一定高,在很多应用场合采用8位MCU就足以胜任了,没有必要用到32位MCU/MPU。这是因为采用32位MCU/MPU的嵌入式系统的成本是比较高的,不仅在处理器价格上,在外围器件价格、开发工具投入、操作系统投入以及人员投入上,都要比采用8位MCU的嵌入式系统高得多。
对于软件更新,一些8位MCU厂商已考虑到了这种需求,在MCU设计上支持一定程度的软件更新。其实现方案通常是通过MCU自带程序存储器支持IAP功能来实现。将程序存储器分为引导程序存储器和应用程序存储器,系统在引导程序存储器启动后,判断是否有IAP请求,如果有则将应用程序存储器擦除,并下载更新为新程序。采用这种方案来实现软件更新的优点是简单,不足之处是不支持软件备份,即软件更新时原软件被擦除,然后更新成新软件,如果下载失败则系统不能运行,另外受MCU自身程序存储器大小限制(通常是几K~十几K),需要下载的软件不能太大。
微控制器(MCU)的体系结构一般分为两种:冯.诺依曼结构和哈佛结构。两者的区别在于:冯.诺依曼结构对程序存储块和数据存储块进行统一编址,即程序空间和数据空间地址不允许重叠;而哈佛结构对程序存储块和数据存储块进行分开编址,即程序空间和数据空间地址允许重叠。
8位数据总线/16位地址总线的冯.诺依曼结构MCU的存储器结构如图1所示,它的地址空间范围是0x0000~0xFFFF,所有的MCU资源都在该地址空间范围内统一分配,图1中程序存储块和数据存储块的地址在0x0000~0xFFFF中是不重叠的。典型芯片如MC68HC11系列MCU。
8位数据总线/16位地址总线的哈佛结构MCU的存储器结构如图2所示,与冯.诺依曼结构不同的是哈佛结构的地址空间有内部地址空间和外部地址空间之分,两部分地址空间范围都是0x0000~0xFFFF,都可分配给程序存储块和数据存储块,图2中程序存储块分配在内部地址空间上,数据存储块同时分配在内部地址空间和外部地址空间上,分别是数据存储块(内部)和数据存储块(外部),且外部数据存储块的地址和内部程序存储块、内部数据存储块的地址是重叠的。典型芯片如MCS-51系列MCU。
发明内容
本发明的目的在于克服上述现有技术的缺点和不足,提供一种实现软件更新和软件备份的嵌入式系统,本发明适用于采用8位MCU嵌入式系统的软件更新和软件备份,能同时实现嵌入式系统的软件更新和软件备份。
本发明的目的还在于提供上述实现软件更新和软件备份的嵌入式系统实现软件更新和软件备份的方法。
本发明目的通过下述技术方案实现:一种实现软件更新和软件备份的嵌入式系统,包括MCU、程序存储器,所述MCU内置或者外接有数据存储器,本发明嵌入式系统还包括用于存储“运行要求数据”的非易失性随机访问存储器(NVRAM),该NVRAM与MCU信号连接;
所述程序存储器包括应用程序存储块和启动/公共程序存储块,同时,启动/公共程序存储块与应用程序存储块占用不同的地址空间;
所述应用程序存储块包括相互独立的应用程序存储块-页1和应用程序存储块-页2;
本发明嵌入式系统还包括用于使启动/公共程序存储块上电即刻有效、使应用程序存储块-页1和应用程序存储块-页2分时有效的片选逻辑模块。
所述片选逻辑模块由复杂可编程逻辑器件(CPLD)将所连接的MCU的地址总线、读/写线、片选线和GPIO线等进行逻辑组合生成,CPLD通过片选逻辑时钟(CS)信号线与程序存储器信号连接。所述复杂可编程逻辑器件(CPLD)包括与门、反相器,片选逻辑时钟(CS)信号线分别和与门、反相器的输入端以及应用程序存储块-页1相连接,反相器的输出端接应用程序存储块-页2,与门的输出端接启动/公共程序存储块。
所述启动/公共程序存储块存储有启动代码、下载函数代码及相关代码。
所述应用程序存储块-页1和应用程序存储块-页2存储具体的应用程序。而且,启动/公共程序存储块和应用程序存储块-页1和应用程序存储块-页2需共同访问的变量和缓冲区地址是一样的,并将需共同访问的变量和缓冲区地址统一固定到不变的物理地址上。
所述程序存储器的容量最大可支持到64kByte。
本发明嵌入式系统应用时,在应用程序存储块-页1和应用程序存储块-页2同时存放同样的应用程序软件就做到了软件备份,存放不同的应用程序软件就可做到根据不同的功能要求运行不同的应用程序软件,存放新老版本的应用程序软件则可实现新老版本应用程序软件的选择使用,即软件更新。
利用上述实现软件更新和软件备份的嵌入式系统实现软件更新和软件备份的方法,包括软件更新方法和软件备份方法。
其中,软件更新方法步骤如下:
A、系统复位启动后,MCU强制从启动/公共程序存储块的起始地址开始运行并读取启动代码,MCU根据读取的启动代码从NVRAM中取出“运行要求数据”,根据“运行要求数据”从应用程序存储块-页1、应用程序存储块-页2中选择其中一个作为当前应用程序页,则另一个即作为当前备份应用程序页,然后执行从MCU连接到CPLD的GPIO置低电平指令或高电平指令,将当前应用程序页映射到应用程序区物理地址上,然后执行跳转指令跳转到应用程序区的物理起始地址,并从该物理起始地址开始往下执行当前应用程序页中的应用程序;若当前应用程序页中的应用程序能正常启动和运行,则进行步骤C操作,若当前应用程序页中的应用程序不能正常启动和运行,则进行步骤B操作;
B、若当前应用程序页的应用程序不能正常启动和运行,则将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,然后返回步骤A操作;
C、运行当前应用程序页的应用程序,当当前应用程序页的应用程序收到上位机传来的软件下载命令时,立即跳转并执行位于启动/公共程序存储块中的下载函数,当当前应用程序页的应用程序接收完一帧数据后,通过置“接收到数据标志”通知下载函数已完成一帧数据接收,下载函数清空下载缓存数据存储器,向当前应用程序页的应用程序回应允许接收下载数据命令;
D、下载函数不断检测是否有“接收到数据标志”,当下载函数检测到“接收到数据标志”后,下载函数保存下载数据到下载缓存数据存储器,然后根据下载函数接收到的下载数据是否为最后一帧数据,分别进行步骤E或F操作;
E、当步骤D中下载函数接收到的下载数据不是最后一帧数据,且下载缓存数据存储器存储未满时,下载函数向当前应用程序页的应用程序回应允许接收下载数据命令,然后返回步骤D操作;
当步骤D中下载函数接收到的下载数据不是最后一帧数据,且下载缓存数据存储器存储已满时,下载函数将当前备份应用程序页映射到应用程序区物理地址上,然后将下载缓存数据存储器中的数据写入应用程序地址的所在程序存储器中,当写程序存储器操作完成后,再将所述当前应用程序页映射回当前应用程序区物理地址上,即恢复到了写入数据到程序存储器前的工作状态,下载函数向当前应用程序页的应用程序回应允许接收下载数据命令,然后返回步骤D操作;
F、下载函数接收到的下载数据为最后一帧数据时,下载函数将当前备份应用程序页映射到应用程序区物理地址上,然后将下载缓存数据存储器中的数据写入应用程序地址的所在程序存储器中,当写程序存储器操作完成后,再将所述当前应用程序页映射回当前应用程序区物理地址上,即恢复到了写入数据到程序存储器前的工作状态,然后将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,下载函数向当前应用程序页的应用程序回应下载成功信息,并自动复位系统,然后返回步骤A操作。
由上所述,即可实现本发明嵌入式系统的软件更新。
本发明嵌入式系统实现软件备份的方法,其步骤如下:系统复位启动后,MCU强制从启动/公共程序存储块的起始地址开始运行并读取启动代码,MCU根据读取的启动代码从NVRAM中取出“运行要求数据”,根据“运行要求数据”从应用程序存储块-页1、应用程序存储块-页2中选择其中一个作为当前应用程序页,则另一个即作为当前备份应用程序页,然后采用本发明上述软件更新的方法更新一份应用程序到当前备份应用程序页,这样,系统就同时存在了所述当前应用程序页的应用程序以及所述当前备份应用程序页的更新的应用程序,然后将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,并自动复位系统,系统复位启动后,启动/公共程序存储块根据NVRAM中新的“运行要求数据”将所述当前备份应用程序页映射到应用程序区物理地址上,并执行所述当前备份应用程序页中的应用程序;
此时,如果所述当前备份应用程序页中所更新的应用程序不能正常执行时,启动/公共程序存储块将修改NVRAM中的“运行要求数据”,将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM作为“运行要求数据”,并自动复位系统,系统复位启动后重新运行所述当前应用程序页中的应用程序。
所述软件备份方法中,当所更新的应用程序为新版本应用程序时,即实现了上一版本的软件备份;当所更新的应用程序与所述当前应用程序页的应用程序为同一份软件时,即实现了当前版本的软件备份。
上述方法中,下载函数主要负责缓存接收到的下载数据,位于当前应用程序页的应用程序负责接收下载数据。
本发明相对于现有技术具有以下优点:本发明通过将程序存储器设计成3部分,即启动/公共程序存储块、应用程序存储块-页1和应用程序存储块-页2,使应用程序存储块-页1、应用程序存储块-页2占用相同的地址空间,启动/公共程序存储块与应用程序存储块-页1、应用程序存储块-页2占用不同的地址空间;通过片选逻辑模块使启动/公共程序存储块上电即刻有效、使应用程序存储块-页1和应用程序存储块-页2分时有效即同一时刻只有页1或页2被映射到地址空间上,实现了在同一地址空间上分时使用应用程序存储块-页1、应用程序存储块-页2,从而使本发明系统同时实现了软件更新和软件备份,即根据需要可在两个应用程序存储页中各存储一份不同功能的软件,根据实际需要选择不同功能软件;当更新软件后,前一版本的软件也得到了保存,必要时可恢复使用前一版本软件;当新下载软件失败时,下载前版本软件并未破坏/丢失,可自动恢复使用升级前版本软件使用,不会因为下载失败而导致系统死掉。
附图说明
图1为8位数据总线/16位地址总线的冯.诺依曼结构微控制器的存储器结构示意图;
图2为8位数据总线/16位地址总线的哈佛结构微控制器的存储器结构示意图;
图3为本发明中冯.诺依曼结构微控制器采用的存储器的结构示意图;
图4为本发明中哈佛结构微控制器采用的存储器的结构示意图;
图5为本发明系统硬件结构示意图;
图6为本发明实现软件更新和软件备份的嵌入式系统实现软件更新的方法的流程图;
图7为本发明实现软件更新和软件备份的嵌入式系统实现上一版本软件备份方法的流程图;
图8为本发明实现软件更新和软件备份的嵌入式系统实现当前版本软件备份方法的流程图。
具体实施方式
下面结合实施例及附图,对本发明作进一步地详细说明,但本发明的实施方式不限于此。
实施例
图5为本发明系统的硬件结构。本发明一种实现软件更新和软件备份的嵌入式系统,硬件上包括微控制器(MCU)、复杂可编程逻辑器件(CPLD)、程序存储器和用于存储“运行要求数据”的非易失性随机访问存储器(NVRAM),其中,所述MCU内置或者外接有数据存储器,该NVRAM与MCU信号连接。
所述程序存储器包括应用程序存储块和启动/公共程序存储块,同时,启动/公共程序存储块与应用程序存储块占用不同的地址空间;所述应用程序存储块包括相互独立的应用程序存储块-页1和应用程序存储块-页2。
所述CPLD将所连接的MCU的地址总线、读/写线、片选线和GPIO线等进行逻辑组合生成片选逻辑模块,CPLD通过片选逻辑时钟(CS)信号线与程序存储器信号连接。所述复杂可编程逻辑器件(CPLD)包括与门、反相器,片选逻辑时钟(CS)信号线分别和与门、反相器的输入端以及应用程序存储块-页1相连接,反相器的输出端接应用程序存储块-页2,与门的输出端接启动/公共程序存储块。这样,就使得片选逻辑模块具备了使启动/公共程序存储块上电即刻有效即被映射到地址空间上、使应用程序存储块-页1和应用程序存储块-页2分时有效即同一时刻只有页1或页2被映射到地址空间上,即实现在同一地址空间上分时使用两块独立的程序存储块(应用程序存储块-页1、应用程序存储块-页2)的技术效果,也即片选逻辑模块形成存储器地址和地址映射。
本发明嵌入式系统根据NVRAM中的“运行要求数据”自动选择当前需要运行的应用程序存储块。
所述启动/公共程序存储块存储有启动代码、下载函数代码及相关代码。
所述应用程序存储块-页1和应用程序存储块-页2存储具体的应用程序。而且,启动/公共程序存储块和应用程序存储块-页1和应用程序存储块-页2需共同访问的变量和缓冲区地址是一样的,并将需共同访问的变量和缓冲区地址统一固定到不变的物理地址上。
所述程序存储器的容量最大可支持到64kByte。
微控制器的体系结构一般分为两种:冯.诺依曼结构和哈佛结构。其中,本发明中冯.诺依曼结构微控制器采用的存储器的结构如图3所示;本发明中哈佛结构微控制器采用的存储器的结构。其中存储器包括程序存储器和数据存储器如图4所示。
利用上述实现软件更新和软件备份的嵌入式系统实现软件更新和软件备份的方法,包括软件更新方法和软件备份方法,其中,软件更新方法如图6所示,步骤如下:
A、系统复位启动后,MCU强制从启动/公共程序存储块的起始地址开始运行并读取启动代码,MCU根据读取的启动代码从NVRAM中取出“运行要求数据”,根据“运行要求数据”从应用程序存储块-页1、应用程序存储块-页2中选择其中一个作为当前应用程序页,则另一个即作为当前备份应用程序页,然后执行从MCU连接到CPLD的GPIO置低电平指令或高电平指令,将当前应用程序页映射到应用程序区物理地址上,然后执行跳转指令跳转到应用程序区的物理起始地址,并从该物理起始地址开始往下执行当前应用程序页中的应用程序;若当前应用程序页中的应用程序能正常启动和运行,则进行步骤C操作,若当前应用程序页中的应用程序不能正常启动和运行,则进行步骤B操作;
B、若当前应用程序页的应用程序不能正常启动和运行,则将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,然后返回步骤A操作;
C、运行当前应用程序页的应用程序,当当前应用程序页的应用程序收到上位机传来的软件下载命令时,立即跳转并执行位于启动/公共程序存储块中的下载函数,当当前应用程序页的应用程序接收完一帧数据后,通过置“接收到数据标志”通知下载函数已完成一帧数据接收,下载函数清空下载缓存数据存储器,向当前应用程序页的应用程序回应允许接收下载数据命令;
D、下载函数不断检测是否有“接收到数据标志”,当下载函数检测到“接收到数据标志”后,下载函数保存下载数据到下载缓存数据存储器,然后根据下载函数接收到的下载数据是否为最后一帧数据,分别进行步骤E或F操作;
E、当步骤D中下载函数接收到的下载数据不是最后一帧数据,且下载缓存数据存储器存储未满时,下载函数向当前应用程序页的应用程序回应允许接收下载数据命令,然后返回步骤D操作;
当步骤D中下载函数接收到的下载数据不是最后一帧数据,且下载缓存数据存储器存储已满时,下载函数将当前备份应用程序页映射到应用程序区物理地址上,然后将下载缓存数据存储器中的数据写入应用程序地址的所在程序存储器中,当写程序存储器操作完成后,再将所述当前应用程序页映射回当前应用程序区物理地址上,即恢复到了写入数据到程序存储器前的工作状态,下载函数向当前应用程序页的应用程序回应允许接收下载数据命令,然后返回步骤D操作;
F、下载函数接收到的下载数据为最后一帧数据时,下载函数将当前备份应用程序页映射到应用程序区物理地址上,然后将下载缓存数据存储器中的数据写入应用程序地址的所在程序存储器中,当写程序存储器操作完成后,再将所述当前应用程序页映射回当前应用程序区物理地址上,即恢复到了写入数据到程序存储器前的工作状态,然后将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,下载函数向当前应用程序页的应用程序回应下载成功信息,并自动复位系统,然后返回步骤A操作。
由上所述,即可实现本发明嵌入式系统的软件更新。
本发明嵌入式系统实现两种软件备份的方法,分别是上一版本软件备份和当前版本软件备份,其步骤如下:
上一版本软件备份方法如图7所示:应用程序存储块-页1和应用程序存储块-页2可各自独立存放一份独立的软件代码,系统运行时取出NVRAM存储的“运行要求数据”自动选择一份软件运行。当系统的当前应用程序页是应用程序存储块-页1时,即系统运行应用程序存储块-页1的旧版本的应用程序1时,采用上述的软件更新的方法更新一份新版本的应用程序2到应用程序存储块-页2后,系统就同时存在旧版本的应用程序1和新版本的应用程序2两份软件,然后将“应用程序存储块-页2和应用程序存储块-页1在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,并自动复位系统。
这样,当系统复位启动后启动/公共程序存储块根据NVRAM中的“运行要求数据”就可将应用程序存储块-页2映射到应用程序区物理地址,并执行应用程序存储块-页2的新版本的应用程序2,此时如果新版本的应用程序2不能正常执行时,启动/公共程序存储块将修改NVRAM中的“运行要求数据”,将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM作为“运行要求数据”,并自动复位启动系统后重新运行程序存储块-页1中的旧版本的应用程序1;当系统的当前应用程序页是应用程序存储块-页2时,应用程序执行过程与上述类似。这样保证了即使更新了错误的软件或更新过程中软件代码发生了变化,导致更新的软件不能执行时,系统也能“回滚”到更新之前软件继续运行,保证了系统不会因为更新了错误的代码而崩溃。
当前版本软件备份方法如图8所示:应用程序存储块-页1和应用程序存储块-页2可各自独立存放一份独立的软件代码,系统运行时取出NVRAM存储的“运行要求数据”自动选择一份软件运行。当系统的当前应用程序页是应用程序存储块-页1时,即系统运行应用程序存储块-页1的应用程序1时,采用上述的软件更新的方法更新一份同一版本的应用程序1到应用程序存储块-页2后,系统就同时存在两份相同应用程序1软件,然后将“应用程序存储块-页2和应用程序存储块-页1在系统复位启动后相互调换”的数据写入NVRAM,作为新的“运行要求数据”,并自动复位系统。
这样,当系统复位启动后启动/公共程序存储块根据NVRAM中的“运行要求数据”就可将应用程序存储块-页2映射到应用程序区物理地址,并执行应用程序存储块-页2的应用程序1,此时如果页2的应用程序1不能正常执行时,启动/公共程序存储块将修改NVRAM中的“运行要求数据”,将“当前备份应用程序页和当前应用程序页在系统复位启动后相互调换”的数据写入NVRAM作为“运行要求数据”,并自动复位启动系统后重新运行程序存储块-页1中的应用程序1;当系统的当前应用程序页是应用程序存储块-页2时,应用程序执行过程与上述类似。
对于可靠性要求比较高且软件很少更新的系统,为预防代码意外丢失造成系统不能运行,采取该方法可实现页1和页2两份软件互为备份,当其中一份软件意外丢失时,系统还能继续用备份的软件继续运行。
上述方法中,下载函数主要负责缓存接收到的下载数据,位于当前应用程序页的应用程序负责接收下载数据。
本发明嵌入式系统根据NVRAM中的“运行要求数据”自动选择当前需要运行的应用程序存储块。
上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。