一種嵌入式系統(tǒng)更新中增量文件的生成方法
【專利摘要】本發(fā)明公開了一種嵌入式系統(tǒng)更新中增量文件的生成方法,包括以下步驟:第一步:連接新版本重定位代碼和舊版本代碼,生成合成代碼;第二步:對合成代碼的所有后綴子代碼按字典順序從小到大排序,其中,所述后綴子代碼是指從任意一個字節(jié)開始到整個代碼末尾結束的子代碼;第三步:利用排序后的后綴子代碼,計算生成新版本重定位代碼相對舊版本代碼的增量文件。本發(fā)明加快了增量文件的生成速度,減小了生成過程中的存儲開銷,并保證生成的增量文件理論最小。
【專利說明】一種嵌入式系統(tǒng)更新中增量文件的生成方法
【技術領域】
[0001]本發(fā)明屬于嵌入式系統(tǒng)更新領域,涉及一種增量文件生成方法,用于實時對嵌入式系統(tǒng)中的程序進行更新。
【背景技術】
[0002]隨著通信、傳感器制造、嵌入式計算的日益成熟,嵌入式技術迅速發(fā)展并被廣泛應用到環(huán)境、國防、救災搶險、城市管理等諸多領域。例如,無線傳感網(wǎng)絡是一種典型的嵌入式系統(tǒng)。典型的無線傳感器網(wǎng)絡由大量微型傳感器節(jié)點組成,它們能夠在惡劣及危險環(huán)境中迅速展開,并通過無線自組成網(wǎng),不受現(xiàn)有有線網(wǎng)絡基礎設施的限制。感知數(shù)據(jù)通過無線通信以多跳中繼方式匯集到數(shù)據(jù)處理中心。
[0003]目前已經(jīng)有大量研究工作致力于如何對嵌入式系統(tǒng)進行程序更新。然而當前的更新技術并不令人滿意。串行更新方法由于需要將所有的部署的嵌入式設備回收,逐個寫入新版本軟件然后重新部署,人工方法存在工作效率低的問題,使得這種代碼更新方法不能應用到大規(guī)模的網(wǎng)絡中去。因此提出了無線重編程技術來使得嵌入式設備可以通過無線通信來自動進行代碼更新。但是已有的方法沒有考慮到新舊代碼之間的相關性,導致向網(wǎng)絡發(fā)送的數(shù)據(jù)量增加的問題,不適用于資源受限的嵌入式設備。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的在于設計一種新型的嵌入式系統(tǒng)更新中增量文件的生成方法,以克服現(xiàn)有技術的全部或部分缺陷。
[0005]為實現(xiàn)上述目的,本發(fā)明所采取的技術方案是,本發(fā)明嵌入式系統(tǒng)更新中增量文件的生成方法包括以下步驟:
第一步:連接新版本重定位代碼和舊版本代碼,生成合成代碼;
第二步:對合成代碼的所有后綴子代碼按字典順序從小到大進行排序,其中,所述后綴子代碼是指從任意一個字節(jié)開始到整個代碼末尾結束的子代碼;
第三步:利用排序后的后綴子代碼,計算生成新版本重定位代碼相對舊版本代碼的增量文件。
[0006]進一步地,本發(fā)明在所述第一步中,所述合成代碼由第一至第四部分按先后順序連接而成,其中,第一部分為舊版本代碼按照字節(jié)順序逆序排列,第二部分為字節(jié)“#,,’第三部分為新版本代碼按照字節(jié)順序逆序排列,第四部分為字節(jié)“ $ ”。
[0007]進一步地,本發(fā)明在所述第二步中,采用倍增算法對后綴子代碼進行排序。
[0008]進一步地,本發(fā)明在所述第三步中,所述增量文件的計算方法包括如下步驟:
步驟A:復制所述合成代碼的從倒數(shù)第i個字節(jié)開始至末尾為止的i個字節(jié)作為子代
碼,i的初始值設置為I;
步驟B:計算所述子代碼的最終指令為增加指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為增加指令的最優(yōu)增量指令及其順序;計算所述子代碼的最終指令為復制指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序;
步驟C:判斷i是否等于新版本代碼的字節(jié)數(shù),如果是,則將步驟B中所得的長度最小的最優(yōu)增量文件指令輸出,否則,i加1,并返回執(zhí)行步驟A。
[0009]進一步地,本發(fā)明所述步驟B中,“計算所述子代碼的最終指令為復制指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序”的方法包括如下步驟:
①查找與步驟A中子代碼相同的后綴子代碼在排序后的后綴子代碼中的序號;
②在排序后的后綴子代碼中,以步驟①所述的序號為起點,以序號增大順序搜索排序后的后綴子代碼,計算所搜索的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度,直到出現(xiàn)以下情形之一時結束該搜索:
情形a:搜索到的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度為0, 情形b:搜索到的后綴子代碼中包含字節(jié)“#”,
情形c:搜索到的后綴子代碼的序號等于排序后的后綴子代碼的序號的最大值;然后記錄搜索過程中獲得的最大的最長公共前綴長度和達到最大的最長公共前綴長度時所搜索到的后綴子代碼的序號;
接著,在排序后的后綴子代碼中,以步驟①所述的序號為起點,以序號減小順序搜索排序后的后綴子代碼,計算所搜索的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度,直到出現(xiàn)以 下情形之一時結束該搜索:
情形d:搜索到的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度為0, 情形e:搜索到的后綴子代碼中包含字節(jié)“#”,
情形f:搜索到的后綴子代碼的序號等于排序后的后綴子代碼的序號的最小值;
③如果步驟②中以序號增大順序搜索得到的最大的最長公共前綴長度和以序號減小順序搜索得到的最大的最長公共前綴長度均為0,則執(zhí)行步驟④,否則,對比步驟②中以序號增大順序搜索得到的最大的最長公共前綴長度和以序號減小順序搜索得到的最大的最長公共前綴長度,選擇較大的最長公共前綴長度以及達到該較大的最長公共前綴長度時所搜索到的對應的后綴子代碼的序號,然后根據(jù)該序號在排序后的后綴子代碼中查找對應的后綴子代碼,并執(zhí)行步驟⑤;
④將步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度記錄為不存在,將步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序記錄為空;
⑤根據(jù)步驟③中所述的較大的最長公共前綴長度、達到該較大的最長公共前綴長度時所搜索到的對應的后綴子代碼的序號及其查找得到的對應后綴子代碼,計算步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度,并記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序。
[0010]與現(xiàn)有技術相比,本發(fā)明的有益效果如下:
(I)本發(fā)明在計算增量文件時,采用后綴子代碼計算得到,與現(xiàn)有方法相比,減少了計算時間,并且降低了計算存儲空間開銷。
[0011](2)本發(fā)明中設計了一個最優(yōu)化的增量文件生成算法,確保生成的增量文件達到最小。[0012](3)本發(fā)明中利用后綴子代碼尋找新舊代碼之間的相近片段,利用代碼相似片段生成增量文件,與現(xiàn)有方法相比,具有可擴展性,在新舊代碼大小差別很大時,依然有較小的計算開銷。
【專利附圖】
【附圖說明】
[0013]圖1是本發(fā)明整個增量文件生成方法的流程圖。
[0014]圖2是計算增量文件方法的流程圖。
[0015]圖3是計算最終指令為復制指令的最優(yōu)增量文件長度并記錄增量指令順序的流程圖。
【具體實施方式】
[0016]為了使本發(fā)明所解決的技術問題、技術方案及有益效果更加清楚明白,以下結合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0017]以下結合如圖1至3具體說明本發(fā)明的具體實施過程:
本發(fā)明面向嵌入式系統(tǒng)的增量文件生成方法包括以下步驟:
第一步:連接新版本代碼和舊版本代碼,生成合成代碼;
連接新版本代碼和舊版 本代碼時,合成代碼由第一至第四部分按先后順序連接而成:第一部分為舊版本代碼按照字節(jié)順序逆序排列,第二部分為字節(jié)“#,,’第三部分為新版本代碼按照字節(jié)順序逆序排列,第四部分為字節(jié)“ $ ”。
[0018]第二步:對合成代碼的所有后綴子代碼按字典順序從小到大進行排序,其中后綴子代碼為指從任意一個字節(jié)開始到整個代碼末尾結束的子代碼;
其中,可采用倍增算法(Doubling Algorithm)對后綴子代碼進行排序,也可以采用冒泡排序、插入排序等其他方法對后綴子代碼進行字典順序從小到大排序。
[0019]第三步:利用排序后的后綴子代碼,計算生成新版本重定位代碼相對舊版本代碼的增量文件。
[0020]增量文件包含兩個指令,分別為:
ADD〈n>〈Byter“ Byten>
C0PY〈n>〈oId—address〉
ADD表示增加指令,COPY表示復制指令,n表示需要增加或者復制的代碼字節(jié)數(shù),Byten代表第n個需要插入的字節(jié),old_address代表復制的源地址。
[0021]增量文件生成步驟如下:
步驟A:復制所述合成代碼的從倒數(shù)第i個字節(jié)開始至末尾為止的i個字節(jié)作為子代碼,i的初始值設置為I;
步驟A中子代碼的最終指令為增加指令的最優(yōu)增量文件長度記為optA[i],步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度記為optC[i]。
[0022]步驟B:計算所述子代碼的最終指令為增加指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為增加指令的最優(yōu)增量指令及其順序;計算所述子代碼的最終指令為復制指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序。其中,計算步驟A中所述子代碼的最終指令為增加指令的最優(yōu)增量文件長度,并記錄步驟A中子代碼的最終指令為增加指令的最優(yōu)增量指令及順序的具體方法為:比較 optA[1-l]+l,與 optC[1-l]+4 的大小,如果 optC[1-l]不存在或者 optA[i_l]+l較小,則記錄步驟A中子代碼的最終指令為增加指令的最優(yōu)增量文件長度optA[i]為optA[1-l]+l,并記錄步驟A中子代碼的最終指令為增加指令的最優(yōu)增量指令及順序,為第1-1次執(zhí)行步驟B時,得到的步驟A中子代碼的最終指令為增加指令的最優(yōu)增量指令及順序,并將最后一個指令修改為ADD〈n>〈 Byte^"Byten+1 >。其中,n為原最后指令的增加字節(jié)數(shù)加I, Byte^-Byten為原最后指令需要插入的字節(jié),Byten+1為第i次執(zhí)行步驟A時,步驟A中長度為i的子代碼的最后一個字節(jié)的數(shù)據(jù);如果optC[i_l]+4較小,則記錄步驟A中子代碼的最終指令為增加指令的最優(yōu)增量文件長度optA[i]為optC[1-l]+4,并記錄步驟A中子代碼的最終指令為增加指令的最優(yōu)增量指令及順序,為第i_l次執(zhí)行步驟B時,得到的步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及順序,并在最后添加指令ADD〈1>〈Byte〉。其中,Byte為第i次執(zhí)行步驟A時,步驟A中長度為i的子代碼的最后一個字節(jié)的數(shù)據(jù)。
[0023]其中,計算步驟A中所述子代碼的最終指令為復制指令的最優(yōu)增量文件長度,并記錄步驟A中所述子代碼的最終指令為復制指令的最優(yōu)增量指令及順序,包括如下步驟:
①:查找與步驟A中子代碼相同的后綴子代碼在排序后的后綴子代碼中的序號;
②:在排序后的后綴子代碼中,以步驟①所述的序號為起點,以序號增大順序搜索排序后的后綴子代碼,計算所搜索的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度,直到出現(xiàn)以下情形之一時結束該搜索:
情形a:搜索到的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度為0, 情形b:搜索到的后綴子代碼中包含字節(jié)“#”,
情形c:搜索到的后綴子代碼的序號等于排序后的后綴子代碼的序號的最大值;然后記錄搜索過程中獲得的最大的最長公共前綴長度和達到最大的最長公共前綴長度時所搜索到的后綴子代碼的序號;
接著,在排序后的后綴子代碼中,以步驟①所述的序號為起點,以序號減小順序搜索排序后的后綴子代碼,計算所搜索的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度,直到出現(xiàn)以下情形之一時結束該搜索:
情形d:搜索到的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度為0, 情形e:搜索到的后綴子代碼中包含字節(jié)“#”,
情形f:搜索到的后綴子代碼的序號等于排序后的后綴子代碼的序號的最小值;
其中,最長公共前綴長度計算方法如下:
對于兩個代碼A和B,設定最長公共前綴長度的初始值為O。從A和B的首字節(jié)開始按字節(jié)依次比對,如果相同則最長公共前綴長度加1,如果出現(xiàn)不同的字節(jié),計算停止。
[0024]③:如果步驟②中以序號增大順序搜索得到的最大的最長公共前綴長度和以序號減小順序搜索得到的最大的最長公共前綴長度均為0,則執(zhí)行步驟④,否則,對比步驟②中以序號增大順序搜索得到的最大的最長公共前綴長度和以序號減小順序搜索得到的最大的最長公共前綴長度,選擇較大的最長公共前綴長度以及達到該較大的最長公共前綴長度時所搜索到的對應的后綴子代碼的序號,然后根據(jù)該序號在排序后的后綴子代碼中查找對應的后綴子代碼,并執(zhí)行步驟⑤;
④:將步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度optC[i]記錄為不存在,將步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序記錄為空;
⑤:根據(jù)步驟③中所述的較大的最長公共前綴長度、達到該較大的最長公共前綴長度時所搜索到的對應的后綴子代碼的序號及其查找得到的對應后綴子代碼,計算步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度,并記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序。
[0025]所述的較大的最長公共前綴長度記為k,所述后綴子代碼的字節(jié)數(shù)記為S。
[0026]其中,計算步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度,并記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序的具體方法為:如果optA[1-k]比optC[1-k]小,記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度optC[i]為optA[1-k]+5,并記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及順序,為第1-k次執(zhí)行步驟B時,得到的步驟A中子代碼的最終指令為增加指令的最優(yōu)增量指令及順序,并在最后添加指令COPY〈k>〈old_address> ;否則,記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度optC[i]為optC[1-k]+5,并記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及順序,為第1-k次執(zhí)行步驟B時,得到的步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及順序,并在最后添加指令C0PY〈k>〈old_address〉。其中,old_address為舊版本代碼第s-k-nsize字節(jié)的地址,nsize為新版本代碼的字節(jié)數(shù)。
[0027]步驟C:判斷i是否等于新版本代碼的字節(jié)數(shù),如果是,則將步驟B中所得的長度最小的最優(yōu)增量文件指令輸出,否則,i加1,并返回執(zhí)行步驟A。
[0028]由此,本發(fā)明提供了一種新型的面向嵌入式系統(tǒng)更新的增量文件生成方法,通過向嵌入式系統(tǒng)傳輸新版本代碼相對于舊版本代碼的增量文件,從而達到程序更新的目的。本發(fā)明加快了增量文件的生成速度,減小了生成過程中的存儲開銷,并保證生成的增量文件理論最小。
[0029]以上通過具體的和優(yōu)選的實施例詳細的描述了本發(fā)明,但本領域技術人員應該明白,本發(fā)明并不局限于以上所述實施例,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換等,均應包含在本發(fā)明的保護范圍之內(nèi)。
【權利要求】
1.一種嵌入式系統(tǒng)更新中增量文件的生成方法,其特征在于,包括以下步驟: 第一步:連接新版本重定位代碼和舊版本代碼,生成合成代碼; 第二步:對合成代碼的所有后綴子代碼按字典順序從小到大進行排序,其中,所述后綴子代碼是指從任意一個字節(jié)開始到整個代碼末尾結束的子代碼; 第三步:利用排序后的后綴子代碼,計算生成新版本重定位代碼相對舊版本代碼的增量文件。
2.根據(jù)權利要求1所述的嵌入式系統(tǒng)更新中增量文件的生成方法,其特征在于:在所述第一步中,所述合成代碼由第一至第四部分按先后順序連接而成,其中,第一部分為舊版本代碼按照字節(jié)順序逆序排列,第二部分為字節(jié)“#”,第三部分為新版本代碼按照字節(jié)順序逆序排列,第四部分為字節(jié)“ $ ”。
3.根據(jù)權利要求1或2所述的嵌入式系統(tǒng)更新中增量文件的生成方法,其特征在于:在所述第二步中,采用倍增算法對后綴子代碼進行排序。
4.根據(jù)權利要求1或2所述的嵌入式系統(tǒng)更新中增量文件的生成方法,其特征在于:在所述第三步中,所述增量文件的計算方法包括如下步驟: 步驟A:復制所述合成代碼的從倒數(shù)第i個字節(jié)開始至末尾為止的i個字節(jié)作為子代碼,i的初始值設置為I ; 步驟B:計算所述子代碼的最終指令為增加指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為增加指令的最優(yōu)增量指令及其順序;計算所述子代碼的最終指令為復制指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序; 步驟C:判斷i是否等于新版本代碼的字節(jié)數(shù),如果是,則將步驟B中所得的長度最小的最優(yōu)增量文件指令輸出,否則,i加1,并返回執(zhí)行步驟A。
5.根據(jù)權利要求4所述的嵌入式系統(tǒng)更新中增量文件的生成方法,其特征在于,所述步驟B中,“計算所述子代碼的最終指令為復制指令的最優(yōu)增量文件的長度,并記錄所述子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序”的方法包括如下步驟:
①查找與步驟A中子代碼相同的后綴子代碼在排序后的后綴子代碼中的序號;
②在排序后的后綴子代碼中,以步驟①所述的序號為起點,以序號增大順序搜索排序后的后綴子代碼,計算所搜索的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度,直到出現(xiàn)以下情形之一時結束該搜索: 情形a:搜索到的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度為O, 情形b:搜索到的后綴子代碼中包含字節(jié)“#”, 情形c:搜索到的后綴子代碼的序號等于排序后的后綴子代碼的序號的最大值; 然后記錄搜索過程中獲得的最大的最長公共前綴長度和達到最大的最長公共前綴長度時所搜索到的后綴子代碼的序號;
接著,在排序后的后綴子代碼中,以步驟①所述的序號為起點,以序號減小順序搜索排序后的后綴子代碼,計算所搜索的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度,直到出現(xiàn)以下情形之一時結束該搜索: 情形d:搜索到 的后綴子代碼與所述步驟A中所述子代碼的最長公共前綴長度為O, 情形e:搜索到的后綴子代碼中包含字節(jié)“#”,情形f:搜索到的后綴子代碼的序號等于排序后的后綴子代碼的序號的最小值;
③如果步驟②中以序號增大順序搜索得到的最大的最長公共前綴長度和以序號減小順序搜索得到的最大的最長公共前綴長度均為O,則執(zhí)行步驟④,否則,對比步驟②中以序號增大順序搜索得到的最大的最長公共前綴長度和以序號減小順序搜索得到的最大的最長公共前綴長度,選擇較大的最長公共前綴長度以及達到該較大的最長公共前綴長度時所搜索到的對應的后綴子代碼的序號,然后根據(jù)該序號在排序后的后綴子代碼中查找對應的后綴子代碼,并執(zhí)行步驟⑤;
④將步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度記錄為不存在,將步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及其順序記錄為空;
⑤根據(jù)步驟③中所述的較大的最長公共前綴長度、達到該較大的最長公共前綴長度時所搜索到的對應的后綴子代碼的序號及其查找得到的對應后綴子代碼,計算步驟A中子代碼的最終指令為復制指令的最優(yōu)增量文件長度,并記錄步驟A中子代碼的最終指令為復制指令的最優(yōu)增量指令及 其順序。
【文檔編號】G06F9/445GK103793245SQ201410026559
【公開日】2014年5月14日 申請日期:2014年1月21日 優(yōu)先權日:2014年1月21日
【發(fā)明者】陳純, 董瑋, 卜佳俊, 吳文彬, 莫璧源 申請人:浙江大學