一种软件在线升级方法及系统
文献发布时间:2023-06-19 11:22:42
技术领域
本发明涉及软件升级技术领域,尤其涉及一种软件在线升级方法及系统。
背景技术
随着半导体技术的不断进步,嵌入式设备在军用和民用领域得到了广泛应用,但应用场景的复杂化多元化对嵌入式设备的维护、固件更新提出了新的要求。在设备的全生命周期中,因为需求更改或软件缺陷等原因,对设备进行维护是不可避免的环节,此时需要更新嵌入式设备软件程序。而现有的嵌入式设备的软件设计方案无法满足船用嵌入式设备的软件升级需求,一方面,现有软件设计方案需要进行设备拆卸,当前船舶应用领域中嵌入式设备体积较大,大多拆卸困难,采用将设备拆卸并替换新的设备的方式进行嵌入式设备的软件升级,费时费力且操作复杂,不便维护;另一方面,在船舶应用场景中,普遍应用的通信总线是CAN现场总线,CAN现场总线在升级中需要制定特殊的CAN升级协议,若系统协议比较复杂,可能会出现无法兼容已生产的设备,导致升级失败或者无法升级。
发明内容
针对现有技术中存在的问题,本发明提供一种软件在线升级方法,用于船用嵌入式设备,所述船用嵌入式设备包括一微控制器、分别连接所述微控制器的一串口通信接口以及一存储器,所述存储器预先配置有一第一存储区、一第二存储区、一第三存储区以及一第四存储区,所述第二存储区中保存有当前运行程序;
所述软件在线升级方法包括:
步骤S1,所述微控制器执行所述当前运行程序过程中实时监测外部的一上位机通过所述串口通信接口发送的升级指令,并在监测接收到所述升级指令后接收所述上位机发送的一固件升级程序;
步骤S2,所述微控制器将所述固件升级程序保存至所述第三存储区后,将所述第四存储区存储的一升级标志位配置为一第一预设值,随后重启所述船用嵌入式设备;
步骤S3,所述微控制器在所述船用嵌入式设备每次启动时,首先执行所述第一存储区中保存的一启动程序进行硬件初始化并读取所述升级标志位,判断所述升级标志位的值是否为所述第一预设值:
若是,则转向步骤S4;
若否,则转向步骤S5;
步骤S4,所述微控制器将所述固件升级程序拷贝至所述第二存储区,将所述固件升级程序作为所述当前运行程序并将所述升级标志位配置为一第二预设值,完成所述船用嵌入式设备的软件在线升级;
步骤S5,所述微控制器跳转执行所述当前运行程序,随后返回所述步骤S1。
优选的,所述步骤S1中,所述微控制器与所述上位机之间采用Ymodem协议进行通信实现接收所述固件升级程序。
优选的,所述步骤S4包括:
步骤S41,所述微控制器将所述固件升级程序拷贝至所述第二存储区;
步骤S42,所述微控制器读取所述第二存储区中的当前存储程序,并将所述当前存储程序与所述第三存储区中的所述固件升级程序进行比对,判断所述当前存储程序与所述固件升级程序是否一致:
若是,则转向步骤S43;
若否,则返回所述步骤S41;
步骤S43,所述微控制器擦除所述第三存储区中的所述固件升级程序,并将所述升级标志位配置为所述第二预设值。
优选的,执行所述步骤S41之前,还包括所述微控制器擦除所述第二存储区中存储的所述当前运行程序。
本发明还提供一种软件在线升级系统,应用上述的软件在线升级方法,用于对船用嵌入式设备进行软件在线升级,所述船用嵌入式设备包括:
存储器,所述存储器包括用于存储启动程序的一第一存储区、用于存储当前运行程序的一第二存储区、用于缓存固件升级程序的一第三存储区以及存储有升级标志位的配置值的一第四存储区;
微控制器,分别连接一串口通信接口和所述存储器,所述微控制器包括:
数据接收模块,用于在执行所述当前运行程序过程中实时监测外部的一上位机通过所述串口通信接口发送的升级指令,并在监测接收到所述升级指令后接收所述上位机发送的一固件升级程序;
数据处理模块,连接所述数据接收模块,用于将所述固件升级程序保存至所述第三存储区后,将所述第四存储区存储的一升级标志位配置为一第一预设值,随后重启所述船用嵌入式设备;
启动控制模块,用于在所述船用嵌入式设备每次启动时执行所述启动程序进行硬件初始化并读取所述配置值,在所述配置值为所述第一预设值时将所述固件升级程序拷贝至所述第二存储区,将所述固件升级程序作为所述当前运行程序并将所述升级标志位配置为一第二预设值,完成所述船用嵌入式设备的软件在线升级;
程序跳转模块,连接所述启动控制模块,用于在所述配置值不为所述第一预设值时或所述软件在线升级完成后跳转执行所述当前运行程序。
优选的,所述微控制器与所述上位机之间采用Ymodem协议进行通信实现接收所述固件升级程序。
优选的,所述启动控制模块包括:
程序拷贝单元,用于将所述固件升级程序拷贝至所述第二存储区;
数据比较单元,连接所述程序拷贝单元,用于读取所述第二存储区中的当前存储程序,并在所述当前存储程序与所述第三存储区中的所述固件升级程序不一致时重新拷贝所述固件升级程序,以及
在所述当前存储程序与所述固件升级程序一致时擦除所述第三存储区中的所述固件升级程序,并将所述升级标志位配置为所述第二预设值。
优选的,所述启动控制模块还包括一数据擦除单元,连接所述程序拷贝单元,用于在拷贝所述固件升级程序之前擦除所述第二存储区中存储的所述当前运行程序。
上述技术方案具有如下优点或有益效果:
1)能够在不更改任何硬件设备的前提下,实现通过上位机软件对微控制器嵌入式软件进行版本升级,且不影响设备的正常运行;
2)无需进行设备拆卸,从而有效避免设备拆卸可能引入的系统隐患,同时提高了设备的可维护性;
3)通过串口通信接口并基于Ymodem协议与上位机进行通信,保证固件升级程序能够准确无误地烧写至微控制器的存储器中,实现船用嵌入式设备的在线升级。
附图说明
图1为本发明的较佳的实施例中,一种软件在线升级方法的流程示意图;
图2为本发明的较佳的实施例中,固件升级程序拷贝过程的流程示意图;
图3为本发明的较佳的实施例中,一种软件在线升级系统的结构示意图。
具体实施方式
下面结合附图和具体实施例对本发明进行详细说明。本发明并不限定于该实施方式,只要符合本发明的主旨,则其他实施方式也可以属于本发明的范畴。
本发明的较佳的实施例中,基于现有技术中存在的上述问题,现提供一种软件在线升级方法,用于船用嵌入式设备,船用嵌入式设备包括一微控制器、分别连接微控制器的一串口通信接口以及一存储器,存储器预先配置有一第一存储区、一第二存储区、一第三存储区以及一第四存储区,第二存储区中保存有当前运行程序;
如图1所示,软件在线升级方法包括:
步骤S1,微控制器执行当前运行程序过程中实时监测外部的一上位机通过串口通信接口发送的升级指令,并在监测接收到升级指令后接收上位机发送的一固件升级程序;
步骤S2,微控制器将固件升级程序保存至第三存储区后,将第四存储区存储的一升级标志位配置为一第一预设值,随后重启船用嵌入式设备;
步骤S3,微控制器在船用嵌入式设备每次启动时,首先执行第一存储区中保存的一启动程序进行硬件初始化并读取升级标志位,判断升级标志位的值是否为第一预设值:
若是,则转向步骤S4;
若否,则转向步骤S5;
步骤S4,微控制器将固件升级程序拷贝至第二存储区,将固件升级程序作为当前运行程序并将升级标志位配置为一第二预设值,完成船用嵌入式设备的软件在线升级;
步骤S5,微控制器跳转执行当前运行程序,随后返回步骤S1。
具体地,本实施例中,上述微控制器可以是LPC17XX微控制器,上述存储器可以是片内FLASH存储器,上述船用嵌入式设备还包括时钟电路、复位电路、SWD电路、串口通信电路以及电源电路等常规电路。在需要进行软件在线升级时,可以通过USB数据线将上位机与一USB转串口模块连接,随后将该USB转串口模块与微控制器的串口通信接口连接,在连接完成后,上位机向微控制器发送升级指令,微控制器接收到升级指令后等待接收上位机发送的固件升级程序,进而实现软件在线更新。
进一步地,以LPC17XX微控制器为例,其提供了一个Flash加速模块,使得在Flash中运行代码可以达到较为理想性能。LPC17XX微控制器的FLASH存储器总大小为256KB,地址范围为0x00000000至0x0003FFFF,按照页码划分,则第0页的地址范围为0x00000000至0x000003FF,第1页的地址范围为0x00000400-0x000007FF,第2页的地址范围为0x00000800-0x00000BFF,依次类推,第255页的地址范围为0x0003FC00-0x0003FFFF。
本实施例中,采用IAP(In-Application Programming,应用编程)技术实现在应用程序正常运行的情况下,通过调用特定的IAP程序对另外一段程序Flash空间进行读/写操作实现软件在线升级。IAP程序必须满足两个要求:存放IAP服务程序,负责检测下载更新程序;存放用户程序,中断向量表的偏移量与Flash的偏移量相同。因此,本实施例中,软件程序包括两部分,一是启动程序,即Bootloader程序,该Bootloader程序从Flash的最低地址区开始存放,二是当前运行程序,该当前运行程序存放在Flash的Bootloader程序之后。基于此,为满足软件在线升级需求,预先将上述FLASH存储区划分为4个用不同的存储区域,其中,第一存储区用于存储启动程序,即Bootloader程序,该第一存储区的存储区域大小为20KB,存储地址范围为0x00000000至0x0004FFFF;第二存储区用于存储当前运行程序,该第二存储区的存储区域大小为115KB,存储地址范围为0x00005000至0x00021BFF;第三存储区用于存储固件升级程序,该第三存储区的存储区域大小为115KB,存储地址范围为0x00021C00至0x0003E7FF;第四存储区用于存储应用程序需要保存的数据,不可随意擦除,该第四存储区的存储区域大小为6KB,存储地址范围为0x0003E800至0x0003FFFF,其中,升级标志位的存储地址为0x0003FFFF。优选的,上述各存储区域之间预留一定的空白区域,防止区域程序重叠。
本实施例中,上述第一存储区和第二存储区相互独立,仅存在简单的跳转关系;上述第一存储区存储的启动程序需要通过JTAG接口或ISP接口烧入,上述第二存储区存储的当前运行程序第一次烧录需要通过JTAG或ISP烧入,可以与上述启动程序一起烧入,启动程序和当前运行程序首先需要如上设置其在Flash的起始地址和所占存储空间大小,还需要设置中断向量表偏移量。中断向量表重定位是在main函数中完成的,重定位中断向量之前的中断向量依然执行启动程序中的中断向量表,main函数完成中断向量重定位后如果再发生中断,那么就执行重定位后的中断向量表,所以需要在启动程序执行结束后,在当前运行程序中修改向量中断表。可以通过在Flash重建一个中断向量表,将新的向量中断表指向改变的位置,从而会运行新的中断向量表。以LPC17XX微控制器为例,其中断向量表是可以重定位的,重定位由NVIC(Nested Vectored Interrupt Controller,内嵌向量中断控制器)中名为向量表偏移寄存器(VTOR)的可编程寄存器控制,初始时中断向量表放到了执行域的最开头,SCB->VTOR向量可动态调整,让程序运行后还能改变向量中断表的跳转地址。
本实施例中,设备在每次上电或重启时,首先执行启动程序,通过读取升级标志位的配置值判断第三存储区中是否存储有固件升级程序,启动程序执行完成后必须要跳转至第二存储区中执行当前运行程序。在跳转之前,首先对堆栈指针进行重定向,定向到第二存储区的程序存储地址,然后将程序指针跳转至第二存储区,随后一直运行当前运行程序不再跳转。
本发明的较佳的实施例中,步骤S1中,微控制器与上位机之间采用Ymodem协议进行通信实现接收固件升级程序。
具体地,上述Ymodem协议由Xmodem协议演变而来,是一种发送并等待的协议,即发送方每发送一个数据包,都要等待接收方的确认。Ymodem协议规定,每个传输帧由帧头、数据段、帧尾组成,每帧有CRC校验码,以保证数据传输的质量。本实施例中,上述微控制器接收到升级指令后,向上位机发送表示升级开始的字符C,上位机接收到字符C后开始向微控制器发送起始帧数据,该起始帧数据包括固件升级程序的名称以及大小,微控制器接收到起始帧数据后向上位机发送相应的响应指令。随后上位机将固件升级程序加上帧头、帧号、帧号的补码、末尾加上CRC校验字段,打包成帧格式发送至微控制器。每帧数据子帧的大小为1024字节,其中,第2个字节为传输的数据包包号,第3个字节为数据包号取反组成。若固件升级程序的最后一包数据的数据大小在128字节至1024字节之间,则数据部分的剩余空间全部用0x1A填充。如果将固件升级程序打包后的数据大小不大于128字节,或者数据部分的剩余空间小于128字节,则Ymodem协议采用SOH数据帧,即采用128字节进行数据传输,如果数据大小不满128字节,剩余空间用0x1A填充。在上述数据帧传输完成后,上位机发送EOT指令通知微控制器数据帧发送结束,微控制器收到该EOT指令后给出响应的回复。最后,上位机接收到回复后发送结束帧,则Ymodem协议的工作流程结束。可以看出,微控制器与上位机之间采用Ymodem协议进行通信实现接收固件升级程序,充分利用Ymodem协议完善的握手机制和出错管理机制,能够将固件升级程序准确无误地烧写至微控制器中,进而实现设备的软件在线升级。
本发明的较佳的实施例中,如图2所示,步骤S4包括:
步骤S41,微控制器将固件升级程序拷贝至第二存储区;
步骤S42,微控制器读取第二存储区中的当前存储程序,并将当前存储程序与第三存储区中的固件升级程序进行比对,判断当前存储程序与固件升级程序是否一致:
若是,则转向步骤S43;
若否,则返回步骤S41;
步骤S43,微控制器擦除第三存储区中的固件升级程序,并将升级标志位配置为第二预设值。
具体地,本实施例中,以LPX17XX微控制器为例,启动程序存储在LPX17XX微控制器的Flash存储器的地址范围为0x00000000至0x00004FFF。设备上电或复位后,首先运行启动程序,启动程序从0x00000000地址处开始执行,在硬件初始化完成之后,读取存储在第四存储区地址为0x0003FFFF的升级标志位,启动程序根据升级标志位的配置值判断是否需要更新程序,在需要升级时该升级标志位的配置值为0x55,即第一预设值,若读取得到的配置值不是0x55,则表示此次上电或复位没有新的程序需要更新出,此时直接跳转至第二存储区,执行当前运行程序。若读取得到的配置值是0x55,说明第三存储区中存储有固件升级程序,则需要进行升级状态。此时,首先需要擦除整个第二存储区中存储的当前运行程序,随后将整个第三存储区保存的固件升级程序拷贝至第二存储区中。在程序拷贝过程中可能会出现部分数据段拷贝失败或者丢失,因此,需要对每一次拷贝到第二存储区中的数据进行重新回读,并将其与拷贝之前第三存储区中保存的固件升级程序进行比对,若一致,则表示此时拷贝工作成功,若不一致,则表示拷贝不成功,需要重新拷贝,重复执行上述过程直至拷贝成功为止。
在拷贝成功后,需要擦除第三存储区中保存的固件升级程序,同时将第四存储区中地址为0x0003FFFF的升级标志位配置为第二预设值,该第二预设值可以是0x00,表示软件在线升级结束,随后跳转执行第二存储区中的固件升级程序。
本发明的较佳的实施例中,执行步骤S41之前,还包括微控制器擦除第二存储区中存储的当前运行程序。
本发明的较佳的实施例中,当前执行程序是在启动程序执行完成后执行的程序,除了执行正常的功能程序外,还能够实时监测上位机发送的升级指令以完成升级工作。当前运行程序在执行时,首先要对中断向量进行重定位,优选在程序中使用库函数NVIC_SetVectorTable(Application,IAP_FLASH_SIZE)来设置中断向量表的偏移,其中,将Application设置为第二存储区的起始地址0x00005000,IAP_FLASH_SIZE的大小设置为0x0001CC00。中断向量表重定位后,进行初始化工作,当前运行程序开始正常执行功能,但需要定时去查询是否有上位机发出的升级指令,若无升级指令,正常执行功能。若有升级,需要做好升级准备,升级协议使用Ymodem协议,将接收到的固件升级程序写到第三存储区中,整个升级过程中需要对数据进行CRC校验,防止数据出错导致无法正常工作。升级结束后需要对第四存储区地址为0x0003FFFF的升级标志位的配置值更改为0x55,然后软复位即可,优选使用库函数NVIC_SystemReset()函数实现软件复位,随后程序跳转到第一存储区,升级结束。
本发明还提供一种软件在线升级系统,应用上述的软件在线升级方法,用于对船用嵌入式设备进行软件在线升级,如图3所示,船用嵌入式设备100包括:
存储器1,存储器1包括用于存储启动程序的一第一存储区11、用于存储当前运行程序的一第二存储区12、用于缓存固件升级程序的一第三存储区13以及存储有升级标志位的配置值的一第四存储区14;
微控制器2,分别连接一串口通信接口3和存储器1,微控制器2包括:
数据接收模块21,用于在执行当前运行程序过程中实时监测外部的一上位机200通过串口通信接口发送的升级指令,并在监测接收到升级指令后接收上位机200发送的一固件升级程序;
数据处理模块22,连接数据接收模块21,用于将固件升级程序保存至第三存储区13后,将第四存储区14存储的一升级标志位配置为一第一预设值,随后重启船用嵌入式设备;
启动控制模块23,用于在船用嵌入式设备100每次启动时执行启动程序进行硬件初始化并读取配置值,在配置值为第一预设值时将固件升级程序拷贝至第二存储区12,将固件升级程序作为当前运行程序并将升级标志位配置为一第二预设值,完成船用嵌入式设备100的软件在线升级;
程序跳转模块24,连接启动控制模块23,用于在配置值不为第一预设值时或软件在线升级完成后跳转执行当前运行程序。
本发明的较佳的实施例中,微控制器2与上位机200之间采用Ymodem协议进行通信实现接收固件升级程序。
本发明的较佳的实施例中,启动控制模块23包括:
程序拷贝单元231,用于将固件升级程序拷贝至第二存储区12;
数据比较单元232,连接程序拷贝单元231,用于读取第二存储区12中的当前存储程序,并在当前存储程序与第三存储区13中的固件升级程序不一致时重新拷贝固件升级程序,以及
在当前存储程序与固件升级程序一致时擦除第三存储区13中的固件升级程序,并将升级标志位配置为第二预设值。
本发明的较佳的实施例中,启动控制模块23还包括一数据擦除单元233,连接程序拷贝单元231,用于在拷贝固件升级程序之前擦除第二存储区12中存储的当前运行程序。
以上所述仅为本发明较佳的实施例,并非因此限制本发明的实施方式及保护范围,对于本领域技术人员而言,应当能够意识到凡运用本说明书及图示内容所作出的等同替换和显而易见的变化所得到的方案,均应当包含在本发明的保护范围内。
- 一种充电桩软件在线升级系统及在线升级方法
- 一种可软件在线升级的嵌入式系统及在线升级方法