本发明属于嵌入式设备领域,尤其涉及一种嵌入式设备程序升级方法及系统。
背景技术:
嵌入式设备需要进行程序升级,升级时需要拆开机壳,程序升级时的工作量巨大。为实现在不拆开机壳的情况下完成程序升级,开发者需要针对特定接口编写BootLoader程序,并配套编写相应的上位机。
一般的程序升级实现过程为:
(1)编写BootLoader程序和应用程序;
(2)使用仿真器下载BootLoader程序到MCU;
(3)使用上位机通过特定的接口依据BootLoader程序协议将应用程序下载到MCU;
(4)升级时使用上位机将需要下载的应用程序下载到MCU。
上电运行时,MCU先执行BootLoader程序,后跳转进入应用程序;中断时,MCU先进入BootLoader程序的中断程序,然后跳转进入应用程序的相应程序。BootLoader程序是核心,应用程序是BootLoader程序调用的子程序集。
上述方案存在以下问题:
(1)程序下载分为两个步骤;
使用仿真器下载BootLoader程序后使用特定接口工具下载应用程序。两个步骤使用的设备不一样,不利于提高生产效率。
(2)不能独立调试应用程序;
方案中使用了两个程序,应用程序是BootLoader程序调用的子程序集,无法直接脱离BootLoader程序进行仿真,也无法与BootLoader程序一起进行仿真。
上述两个问题,使得嵌入式程序仿真调试复杂,量产时程序下载耗时多且效率慢。
技术实现要素:
为了解决现有技术的缺点,本发明的第一目的是提供一种嵌入式设备程序升级方法。
一种嵌入式设备程序升级实现方法,包括:
步骤1:编写应用程序,将BootLoader程序嵌入到应用程序执行前的位置处来融合BootLoader程序与应用程序;
步骤2:利用仿真器将嵌入BootLoader程序后的应用程序下载至MCU中,将MCU的存储空间划分成互相独立的MCU内核初始化代码空间、BootLoader程序代码空间和应用程序 代码空间;同时,固化中断处理程序的入口地址;
步骤3:升级时,利用上位机将升级的应用程序下载到MCU,擦除升级之前应用程序代码空间内的应用程序,最终实现嵌入式设备程序的快速升级。
本发明中,合理进行程序空间划分、巧妙的选取BootLoader嵌入位置、合理组织BootLoader程序的运行逻辑,将BootLoader作为嵌入式设备内核初始化的部分程序嵌入到应用程序中。本发明解决一般程序分两步下载的问题,同时解决应用程序不能单独仿真的难题。
在嵌入式设备程序升级之前,该方法还包括:下载至MCU内经过与应用程序融合后的BootLoader程序等待上位机发送的程序更新命令,超时后跳出BootLoader程序;或
下载至MCU内经过与应用程序融合后的BootLoader程序读取EEPROM中的程序更新标志,若无需更新,则跳出BootLoader程序。
若BootLoader程序收到上位机下发的程序更新命令为需要更新程序,则擦除应用程序代码空间并校验,给上位机回复识别结果及校验结果;
接收到升级的应用程序写入程序代码空间并校验,将校验结果上送到上位机;
接收到上位机下发的结束标志后,退出BootLoader程序。
若BootLoader程序检测到读取程序更新标志为需要更新程序,则擦除应用程序代码空间并校验,给上位机回复识别结果及校验结果;
接收到升级的应用程序写入程序代码空间并校验,将校验结果上送到上位机;
接收到上位机下发的结束标志后,退出BootLoader程序。
本发明在嵌入式设备程序开始运行时首先执行嵌入的BootLoader程序,BootLoader程序等待上位机发送的程序更新命令或读取程序更新标志,如果需要更新程序,BootLoader需要完成以下任务:擦除MAIN()代码区、校验擦除是否成功、上送擦除结果、接收上位机发送过来的新程序代码、将新程序代码写入相应的程序空间、接收到上位机下发的结束标志或读取的程序更新标志为否时,退出BootLoader程序。
本发明还提供了另一种嵌入式设备程序升级系统。
该嵌入式设备程序升级系统,包括:
上位机,其用于将BootLoader程序嵌入至应用程序执行前的位置处来融合BootLoader程序与应用程序;
仿真器,其用于将融合后的BootLoader程序与应用程序下载至MCU中,将MCU的存储空间划分成互相独立的MCU内核初始化代码空间、BootLoader程序代码空间和应用程序代码空间;同时,固化中断处理程序的入口地址;
所述上位机还用于将升级的应用程序下载到MCU并擦除升级之前应用程序代码空间内的应用程序,最终实现嵌入式设备程序的快速升级。
本发明的有益效果为:
本发明把BootLoader程序放在MAIN()函数前,将BootLoader程序和MAIN()函数融合,第一次下载时就将嵌入BootLoader程序后的应用程序全部下载到MCU;将BootLoader作为系统初始化的一部分嵌入到应用程序后,可以直接对程序进行仿真,不需要单独对应用程序进行修改,缩减了程序下载过程的步骤,大大缩减了程序下载的时间,最终提高了程序下载的效率,并实现了应用程序的可调式性。
附图说明
图1是传统的嵌入式设备程序运行过程示意图;
图2是本发明的嵌入式设备程序运行过程示意图;
图3是本发明的嵌入式设备程序升级方法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
图1是传统的嵌入式设备程序运行的过程示意图。如图1所示,程序开始运行后,经过内核初始化后进入MAIN()函数,MAIN()函数是个死循环,程序一直在任务1、任务2至任务N之间循环,其中,N为大于0的正整数。
图2是本发明的嵌入式设备程序运行的过程示意图。BootLoader的位置在内核初始化之后,且在MAIN()函数之前,故程序先执行BOOTLOADER程序,如图2所示。
进入BootLoader程序的主要目的是:
1)判断是否需要更新程序
2)如果需要更新程序,BootLoader需要完成以下任务:擦除MAIN()代码区、校验擦除是否成功、上送擦除结果、接收上位机发送过来的新程序代码、将新程序代码写入相应的程序空间。
本方法将BootLoader程序(BOOTMAIN())与应用程序(MAIN())揉和到一起,程序下载过程为:
1)编写应用程序,将BootLoader程序嵌入到应用程序中;
2)使用仿真器将程序(包含BootLoader程序和应用程序)下载到MCU;
3)升级时使用上位机将需要下载的应用程序下载到MCU。
MCU上电运行时会进入BootLoader程序,之后不会再进入BootLoader程序,且中断时也不会进入BootLoader程序,而是直接进入应用程序。
BootLoader程序工作流程为:
1)等待上位机发送程序更新命令,超时后跳出BootLoader程序;或读取EEPROM中的程序更新标志,若无需更新则跳出BOOTLOADER程序。
2)若收到程序更新命令或读取程序更新标志为需要更新程序后,擦除MAIN()代码区,并校验,给上位机进行回复命令识别结果、校验结果。
3)上位机收到命令识别结果及校验结果后,下发MAIN()代码区代码。
4)BootLoader程序,接收到正确数据后写入MAIN()代码区并校验,将校验结果上送到上位机。
5)上位机将代码下发完毕后,下发结束标志。
6)BootLoader程序接收到结束标志后,退出BootLoader程序。
中断时不进入BootLoader是一个对比的说明:
A,程序揉和之前程序的主体是BootLoader程序,应用程序只是BootLoader程序调用的子程序集合。这个调用分两个部分:运行时调用应用函数的MAIN()函数,中断时调用应用函数的中断处理程序。
B,揉和后程序的主体就是应用程序,BootLoader程序是程序的一小部分。中断函数是应用程序的中断函数,不再是BootLoader调用的子程序了。
由于A中描述的方案中应用程序是一个子程序集,没有办法脱离BootLoader程序单独仿真或与BootLoader程序一起仿真。
图3是本发明的嵌入式设备程序升级方法流程图。如图3所示的嵌入式设备程序升级方法,包括:
步骤1:编写应用程序,将BootLoader程序嵌入到应用程序执行前的位置处来融合BOOTLOADER程序与应用程序;
步骤2:利用仿真器将嵌入BootLoader程序后的应用程序下载至MCU中,将MCU的存储空间划分成互相独立的MCU内核初始化代码空间、BootLoader程序代码空间和应用程序代码空间;同时,固化中断处理程序的入口地址;
步骤3:升级时,利用上位机将升级的应用程序下载到MCU,擦除升级之前应用程序代码空间内的应用程序,最终实现嵌入式设备程序的快速升级。
程序升级时,应用程序的中断处理函数地址可能会变,但是中断向量地址不会变,因此,中断处理程序的入口地址需要固化,中断向量地址需要转移。
本发明在于寻找BootLoader嵌入到程序的位置及擦除MAIN()函数空间时保障MCU能够运行到BootLoader程序。
本发明还提供了另一种结构形式的嵌入式设备程序升级系统,该系统包括:
上位机,其用于将BootLoader程序嵌入至应用程序执行前的位置处来融合BOOTLOADER程序与应用程序;
仿真器,其用于将融合后的BootLoader程序与应用程序下载至MCU中,将MCU的存储空间划分成互相独立的MCU内核初始化代码空间、BootLoader程序代码空间和应用程序代码空间;同时,固化中断处理程序的入口地址;
所述上位机还用于将升级的应用程序下载到MCU并擦除升级之前应用程序代码空间内的应用程序,最终实现嵌入式设备程序的快速升级。
本发明把BootLoader程序放在MAIN()函数前,将BootLoader程序和MAIN()函数融合,第一次下载时就将融合后的BootLoader程序与应用程序全部下载到MCU;将BootLoader和应用程序融合成一个程序后,可以直接对程序进行仿真,不需要单独对应用程序进行修改,缩减了程序下载过程的步骤,大大缩减了程序下载的时间,最终提高了程序下载的效率。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。