一种减少电力设备固件升级量的方法
【技术领域】
[0001]本发明涉及电力设备固件升级领域,尤其涉及一种减少电力设备固件升级量的方法。
【背景技术】
[0002]目前,随着智能电网建设的不断推进,电力设备中MCU的应用越来越广泛,在很多情况下,如现场使用的设备需要增加新功能、现场运行后发现BUG等等,都要求更新MCU的固件程序;同时由于电力设备往往工作在无人值守的环境下,且数量众多,一旦需要对数以万计的终端进行现场更新,就会耗费大量现场服务的人力、物力和时间。
[0003]当前各厂家基于远程通信网络使用IAP在线编程技术实现设备远程固件升级。该方案虽然解决了现场升级的繁重工作量,但存在着弊端,新旧固件即使只有略微的差别,仍需要下载完整的新固件进行替换升级。这种每次升级都需要替换整个固件的方式增加了升级过程时间,消耗了大量网络通信资源,增加了升级失败率。
【发明内容】
[0004]本发明的目的在于提供一种减少电力设备固件升级量的方法,旨在解决现有技术对电力设备固件升级时出现的效率低、浪费网络资源等问题。
[0005]本发明的技术方案是:
一种减少电力设备固件升级量的方法,它包括:
51、电力设备固件的数据组织步骤;
52、电力设备固件的区域内函数组织步骤;
53、电力设备固件的全局变量、数组、函数参数的组织步骤;
54、电力设备固件的远程升级步骤。
[0006]本发明的步骤S1具体包括以下步骤:
S1-1、以功能模块或者对象为单位将电力设备的固件存储空间划分成若干个独立分散的区域,各区域中对应存放相应的功能模块或者对象,并设置区域的固定位置、大小以及BIN文件名称,所述的区域中至少有一个区域存放Boot loader功能,前述Boot loader功能用于实现初始化设备、固件升级功能;
S1-2、在电力设备的固件存储空间中通过分散加载机制为链接器指定各区域BIN文件名称和区域位置的放置信息;
S1-3、区域划分以后通过编译程序生成对应的BIN文件;在升级单独的某个区域时,提取该区域对应的BIN文件,并通过预先固化的Bootloader功能模块将前述文件的升级数据固化到电力设备的对应固件存储空间。
[0007]本发明的步骤S1-1中,划分区域时预留一定的空间以备增加功能,若已划分的区域不够用时,能够再划出一块还未使用的区域,不影响其他区域。
[0008]本发明的步骤S2具体包括以下步骤: S2-1、在电力设备固件中使用函数壳和伪指令控制区域的连带关系,为区域之间存在相互调用关系的函数建立相应的函数壳,区域之间调用函数时都需要先通过函数壳,再执行真正的功能;
52-2、使用伪指令固定函数壳在区域内的位置,编译生成后函数地址不改变,修改函数壳对应的函数只改变本区域,不影响到调用它的其他区域。
[0009]本发明的步骤S2-1中,函数壳作为函数之间调用的中间人,函数壳采用下述表达式:
funct1n NAME() { —NAME() }funct1n —NAME() { # do stuff here }
NAME ()即是—NAME ()函数的函数壳,只实现调用—NAME ()函数的功能,而具体功能在—NAME()函数中实现;其他区域通过调用NAME()函数壳来间接使用—NAME()功能。
[0010]本发明的步骤S3,具体包括以下步骤:
53-1、在电力设备固件中使用1级、2级空类型指针变量控制区域的连带关系,减少区域之间连带升级;
S3-2、申请2级空类型指针变量代替直接使用全局变量或数组,保证编译后即使变量改变也不会扩大关联区域的升级范围;
S3-3、使用1级空类型指针传递函数的实际参数,即使实际参数改变也不会扩大关联区域的升级范围,前述1级空类型指针采用下述方式表述;typedef struct tagParam{ int nParamlndex;
// define hereint nResult;
} Param;
void funct1n NAME(void *p) { —NAME(p) }void funct1n —NAME(void 氺p)
{ Param 氺param = (Param 氺)p;switch (param-> nParamlndex)
{# do stuff here }
}
其他区域调用NAME(p)函数壳时将实际参数赋予void *p,__NAME(p)函数可以根据param-〉nParamlndex参数选择执行具体的功能,最终返回执行的结果;
53-4、区域之间相互调用的函数的参数不需要建立固定的参数列表库,利用空类型指针可以动态变化。
[0011]本发明的步骤S4,具体包括以下步骤:
54-1、将需要升级的区域编译生成BIN文件,并在文件的开头增加升级信息;升级信息包括需要升级的区域数量,每个需要升级的区域的首地址、长度以及校验码,制成升级固件包;
S4-2、通过远程通信网络下载至指定的电力设备;
S4-3、电力设备接收到下发的升级固件及指令,并核对准确后重启设备,通过预先固化在设备里的Bootloader程序将升级数据固化到电力设备的对应固件存储空间。
[0012]本发明的有益效果:
本发明提出的一种减少电力设备固件升级量的方法,可以实现产品投运后,根据功能需求变化只对更改了功能的区域进行升级,从而避免替换全部程序,减少了固件升级量,减少了升级过程对网络资源的消耗,提高了固件升级的效率,另外降低了产品投运后的维护成本,增强了产品的市场竞争力。
[0013]本发明的区域之间需要相互调用函数,在电力设备固件中使用函数壳和伪指令控制区域的连带关系,减少区域之间连带升级。首先,为区域之间相互调用的函数建立相应的函数壳,函数壳起到“中间人”的作用,区域之间调用函数时都需要先通过函数壳,再执行真正的功能;然后,使用伪指令固定函数壳在区域内的位置,修改函数壳对应的函数只会改变本区域,不会影响到调用它的其他区域,从而切断区域之间的连带升级,达到减少固件升级范围的目的。
[0014]本发明的区域内需要使用全局变量、数组,区域之间需要相互调用全局变量、数组,这些全局变量、数组以及区域之间相互调用的函数的参数需要变化,在电力设备固件中使用1级、2级空类型指针变量控制区域的连带关系,减少区域之间连带升级。使用1级空类型指针传递函数的实际参数,即使实际参数改变也不会扩大关联区域的升级范围;申请2级空类型指针变量代替直接使用全局变量或数组,保证了即使变量改变也不会扩大关联区域的升级范围。
[0015]
【附图说明】
[0016]图1是本发明实施例的减少电力设备固件升级量的方法的流程图图2是本发明实施例的区域之间关联示意图
图3是本发明实施例的区域之间调用函数流程图
【具体实施方式】
[0017]下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0018]如图1所示,本发明提出的一种减少电力设备固件升级量的方法,包括以下步骤:为了使电力设备固件的功能模块可以独立升级,需要对电力设备固件的数据组织方式重新规划,包括:
以功能模块或者对象为单位将电力设备的固件存储空间划分成若干个独立分散的区域,各区域中对应存放相应的功能模块或者对象,并设置区域的固定位置、大小以及BIN文件名称,区域固定了位置,即区域的首地址固定后,通过编译程序生成对应的BIN文件,最后将BIN文件固化到电力设备固件的对应存储空间。
[0019]区域划分的时候应预留出一定的空间以备增加功能使用,若该区域不够用时可再划出一块还未使用的区域,不影响其他区域。
[0020]区域划分以后内部的函数会相互调用,修改功能,这些操作只会影响本区域,不影响其他区域。
[0021]在升级单独的某个区域时,可以提取该区域对应的BIN文件,并通过预先固化在设备里的Bootloader程序将该BIN文件的升级数据固化到电力设备固件的对应存储空间。
[0022]设备中至少划分出一个区域存放Bootloader功能,Bootloader至少实现初始化设备、固定升级的功能。
[0023]如图2所示,区域之间需要相互调用函数,若仅划分区域,某个区域内的函数修改后,与之相互调用函数的区域会改变,随之又影响到其他有关联的区域。这种情况导致升级某个区域时,与之有关联的区域,甚至与关联区域有关联的区域都需要升级。
[0024]如图3所示,为了减少固件升级的范围,在不影响正常运行的前提下切断区域之间的连带升级,需要对电力设备固件的区域内函数组织方式重新规划,包括:
为区域之间相互调用的函数建立相应的函数壳,函数壳起到“中间人”的作用,区域之间调用函数时都需要先通过函数壳,再执行真正的功能,函数壳采用下述表达式:funct1n NAME() { —NAME() }funct1n —NAME() { # do stuff here }
NAME ()即是—NAME ()函数的函数壳,只实现调用—NAME ()函数的功能,而具体功能在—NAME()函数中实现;其他区域通过调用NAME()函数壳来间接使用—NAME()功能。
[0025]使用伪指令固定函数壳在区域内的位置,修改函数壳对应的函数只会改变本区域,不会影响到调用它的其他区域,从而切断区域之间的连带升级,达到减少固件升级范围的目的。
[0026]区域内需要使用全局变量、数组,区域之间需要
相互调用全局变量、数组,这些全局变量、数组、区域之间相互调用的函数的参数需要变化,也会导致升级某个区域后,与之有关联的其它区域都需要升级。
[0027]为了减少固件升级的范围,需要对电力设备固件的区域内全局变量、数组、函数参数的组织方式重新规划,包括:
使用1级空类型指针传递函数的实际参数,即使实际参数改变也不会扩大关联区域的升级范围;
申请2级空类型指针变量代替直接使用全局变量或数组,保证了即使变量改变也不会扩大关联区域的升级范围。
[0028]前述1级空类型指针采用下述方式表述; typedef struct tagParam
{ int nParamlndex;
// define hereint nResult;
} Param;
void funct1n NAME(void *p) { —NAME(p) }void funct1n —NAME(void 氺p)
{ Param ^param = (Param 木)p;switch (param-> nParamlndex)
{# do stuff here }
} 其他区域调用NAME(p)函数壳时将实际参数赋予void *p,__NAME(p)函数可以根据param-〉nParamlndex参数选择执行具体的功能,最终返回执行的结果;
下面详细介绍在固件升级过程中可能出现的几种情况以及处理方法:
产品投运后,根据功能需求的变化需要增加、删除、修改现有区域的功能或直接增加实现新功能的区域或直接删除某个区域。其中:
第一种固件升级情况:
本区域内增加、删除、修改功能,该功能与其他区域无关联,即无调用关系。
[0029]对于这种情况,本区域内增加、删除、修改功能不会导致其他区域发生变化,因此这种情况属于单个区域独立升级。
[0030]第二种固件升级情况:
本区域内增加、删除、修改功能,该功能调用其他区域中的函数壳空类型指针变量。
[0031]对于这种情况,本区域内增加、删除、修改功能不会导致其他区域发生变化,只需按规定的组织方法调用其他区域中的函数壳及传递参数,或调用其他区域中的空类型指针变量,因此这种情况仍属于单个区域独立升级。
[0032]第三种固件升级情况:
本区域内增加、删除、修改功能,其他区域中需要调用该功能。
[0033]对于这种情况,还需要逐个情况分析处理。
[0034]若增加新功能,并且其他区域中需要调用该功能。由于其他区域调用本区域内新增加的函数壳或空类型指针变量,必然导致其他区域也发生变化,因此这种情况需要同时升级多个相互关联的区域。
[0035]若删除旧功能,并且其他区域中一直调用该功能。为了减少固件升级量,可以在保留与旧功能相关的函数壳或空类型指针变量的情况下,删除旧功能,由于其他区域仍然调用本区域内旧功能的函数壳或空类型指针变量,未导致其他区域发生变化,因此这种情况仍属于单个区域独立升级。
[0036]若修改功能,可以参照“删除旧功能”处理。
[0037]第四种固件升级情况:
增加实现新功能的区域,且该区域具有若干个相关联的其他区域。
[0038]对于这种情况,需按规定的组织方法增加新的区域,同时其他关联区域调用新区域的功能,必然导致这些关联区域也发生变化,因此这种情况需要同时升级多个相互关联的区域。
[0039]第五种固件升级情况:
虽然本区域预留出一定的空间以备增加功能,若区域不够用时需再划出一块还未使用的区域。
[0040]对于这种情况,可以参照第四种固件升级情况处理。
[0041]第六种固件升级情况:
删除某个区域,且该区域具有若干个相关联的其他区域。
[0042]对于这种情况,为了减少固件升级量,可以在保留与旧功能相关的函数壳或空类型指针变量的情况下,删除该区域,由于其他区域仍然调用该区域内旧功能的函数壳或空类型指针变量,未导致其他区域发生变化,因此这种情况仍属于单个区域独立升级。
[0043]下面详细介绍本发明实施例进行固件远程升级的方法,步骤包括:
需要升级的一个或多个区域编译生成BIN文件,并在文件的开头增加升级信息,制成升级固件包;
通过远程通信网络下载至指定的电力设备;
电力设备接收到下发的升级指令后,将升级固件包下载至电力设备的Flash存储器,并核对下载的升级数据正确性,而后在Flash指定地址写入升级标志和信息,重启设备。
[0044]所述升级信息包括需要升级的区域数量,每个需要升级的区域的首地址、长度。
[0045]电力设备重启后,首先检查F1ash指定地址的升级标志和信息,核对准确后从Flash的指定地址读取升级数据,并按照升级信息将升级数据写入MCU指定的地址。
[0046]经过上述步骤完成电力设备的一个或多个区域的固件升级。
[0047]虽然以上结合【具体实施方式】对本
【发明内容】
进行了详细地说明,但是应当理解到,本领域的技术人员在不违背本发明的原理和实质精神的前提下,对本发明的实施方式可以作出各种变形或者修改,这些变形和修改均应当落入本发明的保护范围。
[0048]本发明未涉及部分均与现有技术相同或可采用现有技术加以实现。
【主权项】
1.一种减少电力设备固件升级量的方法,其特征在于它包括: 51、电力设备固件的数据组织步骤; 52、电力设备固件的区域内函数组织步骤; 53、电力设备固件的全局变量、数组、函数参数的组织步骤; 54、电力设备固件的远程升级步骤。2.根据权利要求1所述的减少电力设备固件升级量的方法,其特征在于步骤S1具体包括以下步骤: S1-1、以功能模块或者对象为单位将电力设备的固件存储空间划分成若干个独立分散的区域,各区域中对应存放相应的功能模块或者对象,并设置区域的固定位置、大小以及BIN文件名称,所述的区域中至少有一个区域存放Boot loader功能,前述Boot loader功能用于实现初始化设备、固件升级功能; S1-2、在电力设备的固件存储空间中通过分散加载机制为链接器指定各区域BIN文件名称和区域位置的放置信息; 51-3、区域划分以后通过编译程序生成对应的BIN文件;在升级单独的某个区域时,提取该区域对应的BIN文件,并通过预先固化的Bootloader功能模块将前述文件的升级数据固化到电力设备的对应固件存储空间。3.根据权利要求2所述的减少电力设备固件升级量的方法,其特征在于步骤S1-1中,划分区域时预留一定的空间以备增加功能,若已划分的区域不够用时,能够再划出一块还未使用的区域,不影响其他区域。4.根据权利要求1所述的减少电力设备固件升级量的方法,其特征在于步骤S2具体包括以下步骤: 52-1、在电力设备固件中使用函数壳和伪指令控制区域的连带关系,为区域之间存在相互调用关系的函数建立相应的函数壳,区域之间调用函数时都需要先通过函数壳,再执行真正的功能; 52-2、使用伪指令固定函数壳在区域内的位置,编译生成后函数地址不改变,修改函数壳对应的函数只改变本区域,不影响到调用它的其他区域。5.根据权利要求4所述的减少电力设备固件升级量的方法,其特征在于步骤S2-1中,函数壳作为函数之间调用的中间人,函数壳采用下述表达式: funct1n NAME() { —NAME() } funct1n —NAME() { # do stuff here } NAME () S卩是—NAME ()函数的函数壳,只实现调用—NAME ()函数的功能,而具体功能在—NAME()函数中实现;其他区域通过调用NAME()函数壳来间接使用—NAME()功能。6.根据权利要求1所述的减少电力设备固件升级量的方法,其特征在于步骤S3,具体包括以下步骤: 53-1、在电力设备固件中使用1级、2级空类型指针变量控制区域的连带关系,减少区域之间连带升级; S3-2、申请2级空类型指针变量代替直接使用全局变量或数组,保证编译后即使变量改变也不会扩大关联区域的升级范围; S3-3、使用1级空类型指针传递函数的实际参数,即使实际参数改变也不会扩大关联区域的升级范围; 53-4、区域之间相互调用函数的参数时,利用前述空类型指针实现动态变化。7.根据权利要求1所述的减少电力设备固件升级量的方法,其特征在于步骤S4,具体包括以下步骤: 54-1、将需要升级的区域编译生成BIN文件,并在文件的开头增加升级信息;升级信息包括需要升级的区域数量,每个需要升级的区域的首地址、长度以及校验码,制成升级固件包; S4-2、通过远程通信网络下载至指定的电力设备; S4-3、电力设备接收到下发的升级固件及指令,并核对准确后重启设备,通过预先固化在设备里的Bootloader程序将升级数据固化到电力设备的对应固件存储空间。
【专利摘要】一种减少电力设备固件升级量的方法,它包括:S1、电力设备固件的数据组织步骤;S2、电力设备固件的区域内函数组织步骤;S3、电力设备固件的全局变量、数组、函数参数的组织步骤;S4、电力设备固件的远程升级步骤。本发明提出的一种减少电力设备固件升级量的方法,可以实现产品投运后,根据功能需求变化只对更改了功能的区域进行升级,从而避免替换全部程序,减少了固件升级量,减少了升级过程对网络资源的消耗,提高了固件升级的效率,另外降低了产品投运后的维护成本,增强了产品的市场竞争力。
【IPC分类】H04L29/08, G06F9/445
【公开号】CN105487909
【申请号】CN201610022885
【发明人】陈昊琦, 尹建丰, 季海涛
【申请人】江苏林洋能源股份有限公司
【公开日】2016年4月13日
【申请日】2016年1月14日