欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

程序?qū)懭敕椒ê脱b置與流程

文檔序號(hào):12550391閱讀:269來源:國知局
程序?qū)懭敕椒ê脱b置與流程

本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體而言,涉及一種程序?qū)懭敕椒ê脱b置。



背景技術(shù):

一次性可編程(One Time Programmable,簡稱為OTP)程序中,每一次程序的更新,都需要記錄當(dāng)前的程序起始地址,當(dāng)下一次更新時(shí),可以根據(jù)OTP的起始地址以及程序的長度(長度可以從原程序中讀到),進(jìn)而計(jì)算出新的起始地址。由于OTP的一次性,故OTP的內(nèi)容只能寫1,不能寫0。但是目前OTP的結(jié)構(gòu)只支持提前預(yù)留OTP起始地址的方式,圖1是根據(jù)本發(fā)明第一實(shí)施例的一種OTP起始地址記錄的示意圖,如圖1所示,如果要燒錄16次,需要提前在OTP的開頭部分預(yù)留16words空間來記錄當(dāng)前程序的起始地址,一旦16次燒錄完畢,OTP將無法記錄程序起始地址,導(dǎo)致其無法再次升級(jí)。

以目前OTP結(jié)構(gòu)為例,word0至word0012為OPT的16行字,word0(第一行字)全部為0,word1ring ctrl用來校準(zhǔn)芯片內(nèi)部時(shí)鐘,Res用來校準(zhǔn)內(nèi)部阻止。圖1中,chip id high/chip id low用于記錄新的chip ID名稱。Word 0和word 1都是固定的內(nèi)容,不會(huì)涉及到OTP程序的更新。從word2開始記錄程序的起始地址。fw start address low/fw start address high,記錄了當(dāng)前程序應(yīng)該從第幾個(gè)word運(yùn)行,比如fw start address low=0x0a,fw start address high=0x09,這就意味著,當(dāng)前程序需要從Word 0x90a開始運(yùn)行。

為了能夠保證程序能夠運(yùn)行16次,所以word 0x02~word 0x12,都被預(yù)留成0x00,在OTP第一次燒錄時(shí)真正的程序從word 0x12開始運(yùn)行,fw start address low被寫成0x12,fw start address high被寫成0x00。圖2是根據(jù)本發(fā)明第二實(shí)施例的一種OTP起始地址記錄的示意圖,如圖2所示,當(dāng)OTP第二次燒錄時(shí),將word1擦除(全部寫成0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff),在word3重新寫入新的起始地址。

現(xiàn)有技術(shù)的OTP只能燒錄16次,一旦燒錄完畢將無法記錄程序起始地址,導(dǎo)致其無法再次升級(jí)。

針對(duì)相關(guān)技術(shù)中OTP程序起始地址燒錄次數(shù)有限的問題,目前尚未提出有效的解決方案。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的主要目的在于提供一種程序?qū)懭敕椒?,以解決相關(guān)技術(shù)中OTP程序起始地址燒錄次數(shù)有限的問題。

為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)方面,提供了一種程序?qū)懭敕椒?,該方法包括:從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,所述存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,所述存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在所述存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址;獲取在所述存儲(chǔ)區(qū)域中緊鄰所述第一程序之后的能夠?qū)懭氲诙绦虻牡刂?;獲取第二起始地址,其中,所述第二起始地址的值滿足如下條件:大于等于能夠?qū)懭胨龅诙绦虻牡刂?、并且將所述第一起始地址中?修改為1后能夠得到的;根據(jù)所述第二起始地址將所述預(yù)留區(qū)域中的第一起始地址中的0修改為1;從所述第二起始地址寫入所述第二程序。

進(jìn)一步地,獲取第二起始地址包括:確定所述第一起始地址中的一個(gè)或多個(gè)0修改為1后能夠得到的修改值;計(jì)算所述修改值與所述能夠?qū)懭胨龅诙绦虻牡刂返牟钪?;確定所述差值中數(shù)值為正且最小的差值所對(duì)應(yīng)的所述修改值;將所對(duì)應(yīng)的所述修改值作為所述第二起始地址。

進(jìn)一步地,在計(jì)算所述修改值與所述能夠?qū)懭胨龅诙绦虻牡刂返牟钪抵?,所述方法還包括:如果所述差值為負(fù)數(shù),則在所述第一起始地址的存儲(chǔ)區(qū)域后的存儲(chǔ)區(qū)域內(nèi)寫入所述第二起始地址。

進(jìn)一步地,在獲取在所述存儲(chǔ)區(qū)域中緊鄰所述第一程序之后的能夠?qū)懭氲诙绦虻牡刂分螅龇椒ㄟ€包括:獲取預(yù)設(shè)的無效字節(jié)數(shù),其中,所述無效字節(jié)數(shù)為一次性可編程器件中的存儲(chǔ)區(qū)域中兩個(gè)程序的起始地址之間最多空閑的字節(jié)數(shù);判斷所述第二起始地址與所述第一起始地址之間空閑的字節(jié)數(shù)是否小于等于所述最多空閑字節(jié)數(shù);如果所述第二起始地址與所述第一起始地址之間空閑的字節(jié)數(shù)小于等于所述最多空閑字節(jié)數(shù),則從所述第二起始地址寫入所述第二程序;如果所述第二起始地址與所述第一起始地址之間空閑的字節(jié)數(shù)大于所述最多空閑字節(jié)數(shù),則根據(jù)多出的字節(jié)數(shù)擦除所述第一起始地址的末尾位,在擦除后的位置處寫入所述第二程序。

進(jìn)一步地,獲取第二起始地址包括:將所述第一起始地址與所述能夠?qū)懭胨龅诙绦虻牡刂愤M(jìn)行或運(yùn)算,得到或運(yùn)算結(jié)果;將所述或運(yùn)算結(jié)果的值作為所述第二起始地址。

為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的另一方面,還提供了一種程序?qū)懭胙b置,該裝置包括:第一獲取單元,用于從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,所述存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,所述存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在所述存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址;第二獲取單元,用于獲取在所述存儲(chǔ)區(qū)域中緊鄰所述第一程序之后的能夠?qū)懭氲诙绦虻牡刂罚坏谌@取單元,用于獲取第二起始地址,其中,所述第二起始地址的值滿足如下條件:大于等于能夠?qū)懭胨龅诙绦虻牡刂贰⒉⑶覍⑺龅谝黄鹗嫉刂分械?修改為1后能夠得到的;修改單元,用于根據(jù)所述第二起始地址將所述預(yù)留區(qū)域中的第一起始地址中的0修改為1;第一寫入單元,用于從所述第二起始地址寫入所述第二程序。

進(jìn)一步地,所述第三獲取單元包括:第一確定模塊,用于確定所述第一起始地址中的一個(gè)或多個(gè)0修改為1后能夠得到的修改值;第一計(jì)算模塊,用于計(jì)算所述修改值與所述能夠?qū)懭胨龅诙绦虻牡刂返牟钪担坏诙_定模塊,用于確定所述差值中數(shù)值為正且最小的差值所對(duì)應(yīng)的所述修改值;修改模塊,用于將所對(duì)應(yīng)的所述修改值作為所述第二起始地址。

進(jìn)一步地,所述裝置還包括:第二寫入單元,用于在計(jì)算所述修改值與所述能夠?qū)懭胨龅诙绦虻牡刂返牟钪抵螅绻霾钪禐樨?fù)數(shù),則在所述第一起始地址的存儲(chǔ)區(qū)域后的存儲(chǔ)區(qū)域內(nèi)寫入所述第二起始地址。

進(jìn)一步地,所述裝置還包括:第四獲取單元,用于在獲取在所述存儲(chǔ)區(qū)域中緊鄰所述第一程序之后的能夠?qū)懭氲诙绦虻牡刂分?,獲取預(yù)設(shè)的無效字節(jié)數(shù),其中,所述無效字節(jié)數(shù)為一次性可編程器件中的存儲(chǔ)區(qū)域中兩個(gè)程序的起始地址之間最多空閑的字節(jié)數(shù);判斷單元,用于判斷所述第二起始地址與所述第一起始地址之間空閑的字節(jié)數(shù)是否小于等于所述最多空閑字節(jié)數(shù);第三寫入單元,用于在所述第二起始地址與所述第一起始地址之間空閑的字節(jié)數(shù)小于等于所述最多空閑字節(jié)數(shù)時(shí),從所述第二起始地址寫入所述第二程序,所述第二起始地址與所述第一起始地址之間空閑的字節(jié)數(shù)大于所述最多空閑字節(jié)數(shù)時(shí),根據(jù)多出的字節(jié)數(shù)擦除所述第一起始地址的末尾位,在擦除后的位置處寫入所述第二程序。

進(jìn)一步地,所述第三獲取單元包括:第二計(jì)算模塊,用于將所述第一起始地址與所述能夠?qū)懭胨龅诙绦虻牡刂愤M(jìn)行或運(yùn)算,得到或運(yùn)算結(jié)果;處理模塊,用于將所述或運(yùn)算結(jié)果的值作為所述第二起始地址。

本發(fā)明通過從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址;獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂?;獲取第二起始地址,其中,第二起始地址的值滿足如下條件:大于等于能夠?qū)懭氲诙绦虻牡刂?、并且將第一起始地址中?修改為1后能夠得到的;根據(jù)第二起始地址將預(yù)留區(qū)域中的第一起始地址中的0修改為1;從第二起始地址寫入第二程序,由于采用了將第一起始地址中的0修改為1的步驟,解決了相關(guān)技術(shù)中OTP程序起始地址燒錄次數(shù)有限的問題,進(jìn)而達(dá)到了提高OTP程序起始地址燒錄次數(shù)的效果。

附圖說明

構(gòu)成本申請(qǐng)的一部分的附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:

圖1是根據(jù)本發(fā)明第一實(shí)施例的一種OTP起始地址記錄的示意圖;

圖2是根據(jù)本發(fā)明第二實(shí)施例的一種OTP起始地址記錄的示意圖;

圖3是根據(jù)本發(fā)明第一實(shí)施例的程序?qū)懭敕椒ǖ牧鞒虉D;

圖4是根據(jù)本發(fā)明第二實(shí)施例的程序?qū)懭敕椒ǖ牧鞒虉D;以及

圖5是根據(jù)本發(fā)明實(shí)施例的程序?qū)懭胙b置的示意圖。

具體實(shí)施方式

需要說明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相互組合。下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。

為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)方案,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請(qǐng)一部分的實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù)的范圍。

需要說明的是,本申請(qǐng)的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對(duì)象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本申請(qǐng)的實(shí)施例。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。

本發(fā)明實(shí)施例提供了一種程序?qū)懭敕椒ā?/p>

圖3是根據(jù)本發(fā)明第一實(shí)施例的程序?qū)懭敕椒ǖ牧鞒虉D,如圖3所示,該方法包括以下步驟:

步驟S102:從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址。

步驟S104:獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂贰?/p>

步驟S106:獲取第二起始地址,其中,第二起始地址的值滿足如下條件:大于等于能夠?qū)懭氲诙绦虻牡刂?、并且將第一起始地址中?修改為1后能夠得到的。

步驟S108:根據(jù)第二起始地址將預(yù)留區(qū)域中的第一起始地址中的0修改為1。

步驟S110:從第二起始地址寫入第二程序。

該實(shí)施例采用從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址;獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂?;獲取第二起始地址,其中,第二起始地址的值滿足如下條件:大于等于能夠?qū)懭氲诙绦虻牡刂?、并且將第一起始地址中?修改為1后能夠得到的;根據(jù)第二起始地址將預(yù)留區(qū)域中的第一起始地址中的0修改為1;從第二起始地址寫入第二程序,由于采用了將第一起始地址中的0修改為1的步驟,解決了相關(guān)技術(shù)中OTP程序起始地址燒錄次數(shù)有限的問題,進(jìn)而達(dá)到了提高OTP程序起始地址燒錄次數(shù)的效果。

在一次性可編程(One Time Programmable,簡稱為OTP)程序中,由于每一次程序的更新,都需要記錄當(dāng)前程序的起始地址,這樣,在下一次更新時(shí),就可以根據(jù)記錄的起始地址以及程序的長度計(jì)算出新的起始地址。預(yù)留區(qū)域可以是OTP的存儲(chǔ)區(qū)域中用來記錄程序的起始地址的特定區(qū)域,例如,OTP的開頭部分預(yù)留的16words的存儲(chǔ)區(qū)域,在該存儲(chǔ)區(qū)域中第一次寫入程序的起始地址時(shí),從預(yù)留區(qū)域中的第一位開始存儲(chǔ)第一次寫入程序的起始地址,在該存儲(chǔ)區(qū)域中第二次寫入程序的起始地址時(shí),需要先獲取已經(jīng)寫入到存儲(chǔ)區(qū)域中的第一程序的第一起始地址,然后獲取在存儲(chǔ)區(qū)域中能夠?qū)懭氲诙绦虻牡刂?,該地址需要緊鄰第一程序之后,第二起始地址是第二程序的起始地址,第二起始地址的值滿足兩個(gè)條件:大于等于能夠?qū)懭氲诙绦虻牡刂?,將能夠?qū)懭氲诙绦虻牡刂分械?修改成1能夠得到的。由于第二起始地址需要能夠?qū)懭氲诙绦?,因此,第二起始地址可以大于或等于能夠?qū)懭氲诙绦虻牡刂?,但不能小于,如果將第一起始地址中的一個(gè)或多個(gè)0修改為1之后得到的值大于等于能夠?qū)懭氲诙绦虻牡刂?,則可以修改第一起始地址得到第二起始地址,而不必將第一起始地址擦除再寫入第二起始地址,通過修改第一起始地址得到第二起始地址的方案,可以重復(fù)利用程序起始地址的存儲(chǔ)區(qū)域,提高OTP程序起始地址的燒錄次數(shù)。

可選地,獲取第二起始地址可以通過以下方法:確定第一起始地址中的一個(gè)或多個(gè)0修改為1后能夠得到的修改值;計(jì)算修改值與能夠?qū)懭氲诙绦虻牡刂返牟钪担淮_定差值中數(shù)值為正且最小的差值所對(duì)應(yīng)的修改值;將所對(duì)應(yīng)的修改值作為第二起始地址。

第一起始地址中如果有0,則0可以修改為1,但1無法修改成0,因此,如果第一起始地址中的一個(gè)或多個(gè)0修改為1之后得到修改值,并且,這個(gè)修改值恰好是第二起始地址則就將0修改成1之后的修改值作為第二起始地址。如果第一地址中有將0修改成1之后有多個(gè)值滿足大于第二起始地址,則從這些修改值中確定與第二起始地址的差值最小的值,將這個(gè)最小值對(duì)應(yīng)的修改值作為第二起始地址。這樣,由于修改得到的值與第二起始地址差距最小,可以節(jié)約存儲(chǔ)空間,并且,在下一次修改時(shí),還可以繼續(xù)將其中的0修改成1,以得到第三起始地址,能夠最大程度利用第一起始地址。在后續(xù)的進(jìn)程中,每一次新寫入的起始地址之前,都可以判斷前一個(gè)起始地址是否可以被改寫成這個(gè)新寫入的起始地址,或者被改寫之后與能寫入新程序的起始地址的差值較小,如果能改寫前一個(gè)起始地址,并將改寫后的值作為新的起始地址,可以節(jié)省存儲(chǔ)區(qū)域空間,提高修改次數(shù)。

可選地,在計(jì)算修改值與能夠?qū)懭氲诙绦虻牡刂返牟钪抵螅绻钪禐樨?fù)數(shù),則在第一起始地址的存儲(chǔ)區(qū)域后的存儲(chǔ)區(qū)域內(nèi)寫入第二起始地址。

如果將第一起始地址的0修改為1之后得到的值小于能夠?qū)懭氲诙绦虻牡刂罚布?,差值為?fù)數(shù),則不改寫第一起始地址,而是在第一起始地址的存儲(chǔ)區(qū)域后的存儲(chǔ)區(qū)域內(nèi)寫入第二起始地址,第二起始地址可以緊挨第一起始地址寫入,也可以預(yù)留預(yù)設(shè)的位數(shù)再寫入。

可選地,在獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂分?,獲取預(yù)設(shè)的無效字節(jié)數(shù),其中,無效字節(jié)數(shù)為一次性可編程器件中的存儲(chǔ)區(qū)域中兩個(gè)程序的起始地址之間最多空閑的字節(jié)數(shù);判斷第二起始地址與第一起始地址之間空閑的字節(jié)數(shù)是否小于等于最多空閑字節(jié)數(shù);如果第二起始地址與第一起始地址之間空閑的字節(jié)數(shù)小于等于最多空閑字節(jié)數(shù),則從第二起始地址寫入第二程序;如果第二起始地址與第一起始地址之間空閑的字節(jié)數(shù)大于最多空閑字節(jié)數(shù),則根據(jù)多出的字節(jié)數(shù)擦除第一起始地址的末尾位,在擦除后的位置處寫入第二程序。

在獲取第二程序的地址之后,如果第一起始地址和第二起始地址之間的空閑字節(jié)數(shù)超過了最多空閑字節(jié)數(shù),則可以在空閑字節(jié)中寫入第二起始地址,如果空閑的字節(jié)數(shù)不夠?qū)懭氲诙鹗嫉刂?,則可以將第一起始地址的末尾位擦除,在擦除后的位置和空閑字節(jié)位置寫入第二起始地址。

可選地,獲取第二起始地址包括:將第一起始地址與能夠?qū)懭氲诙绦虻牡刂愤M(jìn)行或運(yùn)算,得到或運(yùn)算結(jié)果;將或運(yùn)算結(jié)果的值作為第二起始地址。

舉例而言,第一次更新后,fw start low=0x12,fw start high=0x00。以100words(800bytes)的程序?yàn)槔旱谝淮蝫ord2內(nèi)容為0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,第二次更新程序后的起始地址為16(0x12)+100(0x64)=116(0x74),第二次word2內(nèi)容應(yīng)該為0x12與0x74的或值,即00010010|01110100=01110110=0x76。

本發(fā)明實(shí)施例提供了一種新的FW起始地址和長度的記錄方法,從而可以在固定的預(yù)留空間內(nèi),提升升級(jí)的次數(shù)。

本發(fā)明實(shí)施例還提供了一種優(yōu)選實(shí)施例,該優(yōu)選實(shí)施例可以通過如下方式實(shí)現(xiàn):

錯(cuò)誤校驗(yàn)碼(Error Correcting Code,簡稱為ECC)用來校驗(yàn)燒錄進(jìn)OTP每個(gè)word的數(shù)據(jù)是否與原程序保持一致,對(duì)于設(shè)計(jì)與工藝成熟的OTP而言,并不需要ECC功能,可以通過寄存器配置,關(guān)掉ECC。本發(fā)明實(shí)施例應(yīng)用于關(guān)掉ECC的場景。

起始地址更新方式:

圖4是根據(jù)本發(fā)明第二實(shí)施例的程序?qū)懭敕椒ǖ牧鞒虉D,該實(shí)施例可以作為上述第一實(shí)施例的優(yōu)選實(shí)施方式,如圖4所示,該方法包括以下步驟:

步驟S401:獲取第一起始地址:第一起始地址=“第二行字的字節(jié)1右移8位”與“第二行字的字節(jié)0”的或運(yùn)算結(jié)果。

步驟S402:判斷第一起始地址是否等于0。如果判斷結(jié)果為是,則執(zhí)行步驟S403,如果判斷結(jié)果為否,則執(zhí)行步驟S404。

步驟S403:初始化第二行字的字節(jié)0和第二行字的字節(jié)1為0x12,0x00.

步驟S404:繼續(xù)獲取第一起始地址,第一起始地址=“第n行字的字節(jié)m+1右移8位”與“第n行字的字節(jié)m”的或運(yùn)算,其中,m和n的初始值為n=2,m=0。

步驟S405:判斷第一起始地址是否=0xFFFF。如果判斷結(jié)果為是,則執(zhí)行步驟S416,如果判斷結(jié)果為否,則執(zhí)行步驟S406。

步驟S406:計(jì)算第二起始地址:第二起始地址=第一起始地址+程序大小。本實(shí)施例中的第二起始地址也即上述實(shí)施例中的能夠?qū)懭氲诙绦虻牡刂贰?/p>

步驟S407:對(duì)第二地址進(jìn)行修正,第二地址修正值=第二起始地址與第一起始地址的或運(yùn)算結(jié)果。在本實(shí)施例中,第二地址修正值為上述實(shí)施例中的第二起始地址。

步驟S408:判斷第二起始地址修正值-第二起始地址是否>30。30可以是預(yù)設(shè)的最多空閑字節(jié)數(shù)。如果判斷結(jié)果為是,則執(zhí)行步驟S409,如果判斷結(jié)果為否,則執(zhí)行步驟S415。

步驟S409:設(shè)置第n行字的字節(jié)m=0xFF,第n行字的字節(jié)m+1=0xFF。

步驟S410:判斷m是否=6。

步驟S411:將n的數(shù)值增加1。

步驟S412:判斷n是否大于16。如果判斷結(jié)果為是,則退出進(jìn)程,如果判斷結(jié)果為否則執(zhí)行步驟S414。

步驟S413:第n行字的字節(jié)m+2=第二起始地址修正值_低8位。第n行字的字節(jié)m+3=第二起始地址修正值_高8位。

步驟S414:第n+1行字的字節(jié)0=第二起始地址修正值_低8位。第n+1行字的字1=第二起始地址修正值_高8位。

步驟S415:第n行字的字節(jié)m=第二起始地址修正值_低8位,第n行字的字節(jié)m=第二起始地址修正值_高8位。

步驟S416:將m+2的值賦值給m。

步驟S417:判斷m是否>6,如果判斷結(jié)果為是,則執(zhí)行步驟S418,如果判斷結(jié)果為否,則執(zhí)行步驟S404。

步驟S418:則令m=0,n的值增加1。

步驟S419:判斷n是否>16,如果判斷結(jié)果為是,則退出,如果判斷結(jié)果為否,則執(zhí)行步驟S404。

OTP尋找起始地址的規(guī)律是,從第3個(gè)word開始,讀取2個(gè)不為0xff的字節(jié)(bytes)作為起始地址,當(dāng)?shù)诙螣洉r(shí)可以不用立刻擦除word2,而是在word2中根據(jù)第一次起始地址的內(nèi)容在word 2上進(jìn)行更新。

舉例而言,第一次更新后,fw start low=0x12,fw start high=0x00。以100words(800bytes)程序?yàn)槔?,第一次word2內(nèi)容為0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,第二次更新程序后的起始地址為16(0x12)+100(0x64)=116(0x74),第二次word2內(nèi)容應(yīng)該為0x12與0x74的或值,即00010010|01110100=01110110=0x76。更新后的word2為0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,這樣損失了2個(gè)word(word74,word75),但是不需要更新word3,只要在原有基礎(chǔ)上更新word2就可以完成fw起始地址的更新,在固定的預(yù)留空間內(nèi)增加了可以升級(jí)程序的次數(shù)。

第三次更新程序后的起始地址為118(0x76)+100(0x64)=218(0xDA),第三次word2的內(nèi)容應(yīng)該為0x76與0xDA的或值,即01110110|11011010=11111110=0xFE,更新后的word2為0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,這樣損失了36個(gè)word(word DA,word FD),但是不需要更新word3,只要在原有基礎(chǔ)上更新word2就可以完成fw起始地址的更新,在固定的預(yù)留空間內(nèi)增加了可以升級(jí)程序的次數(shù)。

可以根據(jù)OTP的總大小設(shè)置可接受的損失,以第三次損失為例,如果OTP大小只能接受每次損失不超過30個(gè)word,則第三次更新程序,需要將第三次更新后的起始地址(0x00DA)高位(fw start high)與低位(fw start low)分別向前移動(dòng)兩個(gè)bytes,然后擦除掉原起始地址(寫成0xFF)。所以在最大損失30個(gè)word的前提下,第三次更新程序后的word2為0xFF,0xFF,0xDA,0x00,0x00,0x00,0x00,0x00,0x00。

需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。

本發(fā)明實(shí)施例提供了一種程序?qū)懭胙b置,該程序?qū)懭胙b置可以用于執(zhí)行本發(fā)明實(shí)施例的程序?qū)懭敕椒ā?/p>

圖5是根據(jù)本發(fā)明實(shí)施例的程序?qū)懭胙b置的示意圖,如圖5所示,該裝置包括:

第一獲取單元10,用于從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址。

第二獲取單元20,用于獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂贰?/p>

第三獲取單元30,用于獲取第二起始地址,其中,第二起始地址的值滿足如下條件:大于等于能夠?qū)懭氲诙绦虻牡刂贰⒉⑶覍⒌谝黄鹗嫉刂分械?修改為1后能夠得到的。

修改單元40,用于根據(jù)第二起始地址將預(yù)留區(qū)域中的第一起始地址中的0修改為1。

第一寫入單元50,用于從第二起始地址寫入第二程序。

可選地,第三獲取單元包括:第一確定模塊,用于確定第一起始地址中的一個(gè)或多個(gè)0修改為1后能夠得到的修改值;第一計(jì)算模塊,用于計(jì)算修改值與能夠?qū)懭氲诙绦虻牡刂返牟钪担坏诙_定模塊,用于確定差值中數(shù)值為正且最小的差值所對(duì)應(yīng)的修改值;修改模塊,用于將所對(duì)應(yīng)的修改值作為第二起始地址。

可選地,裝置還包括:第二寫入單元,用于在計(jì)算修改值與能夠?qū)懭氲诙绦虻牡刂返牟钪抵?,如果差值為?fù)數(shù),則在第一起始地址的存儲(chǔ)區(qū)域后的存儲(chǔ)區(qū)域內(nèi)寫入第二起始地址。

可選地,裝置還包括:第四獲取單元,用于在獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂分?,獲取預(yù)設(shè)的無效字節(jié)數(shù),其中,無效字節(jié)數(shù)為一次性可編程器件中的存儲(chǔ)區(qū)域中兩個(gè)程序的起始地址之間最多空閑的字節(jié)數(shù);判斷單元,用于判斷第二起始地址與第一起始地址之間空閑的字節(jié)數(shù)是否小于等于最多空閑字節(jié)數(shù);第三寫入單元,用于在第二起始地址與第一起始地址之間空閑的字節(jié)數(shù)小于等于最多空閑字節(jié)數(shù)時(shí),從第二起始地址寫入第二程序,第二起始地址與第一起始地址之間空閑的字節(jié)數(shù)大于最多空閑字節(jié)數(shù)時(shí),根據(jù)多出的字節(jié)數(shù)擦除第一起始地址的末尾位,在擦除后的位置處寫入第二程序。

可選地,第三獲取單元包括:第二計(jì)算模塊,將第一起始地址與能夠?qū)懭氲诙绦虻牡刂愤M(jìn)行或運(yùn)算,得到或運(yùn)算結(jié)果;處理模塊,用于將或運(yùn)算結(jié)果的值作為第二起始地址。

該實(shí)施例采用第一獲取單元10從預(yù)留區(qū)域中獲取已經(jīng)寫入到存儲(chǔ)區(qū)域的第一程序的第一起始地址,其中,存儲(chǔ)區(qū)域?yàn)橐淮涡钥删幊唐骷械拇鎯?chǔ)區(qū)域,存儲(chǔ)區(qū)域中預(yù)留了多個(gè)預(yù)留區(qū)域,每個(gè)預(yù)留區(qū)域均用于保存在存儲(chǔ)區(qū)域中存儲(chǔ)的程序的起始地址;第二獲取單元20獲取在存儲(chǔ)區(qū)域中緊鄰第一程序之后的能夠?qū)懭氲诙绦虻牡刂?;第三獲取單元30獲取第二起始地址,其中,第二起始地址的值滿足如下條件:大于等于能夠?qū)懭氲诙绦虻牡刂?、并且將第一起始地址中?修改為1后能夠得到的;修改單元40根據(jù)第二起始地址將預(yù)留區(qū)域中的第一起始地址中的0修改為1;第一寫入單元50從第二起始地址寫入第二程序,從而解決了相關(guān)技術(shù)中OTP程序起始地址燒錄次數(shù)有限的問題,進(jìn)而達(dá)到了提高OTP程序起始地址燒錄次數(shù)的效果。

在本發(fā)明的上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒有詳述的部分,可以參見其他實(shí)施例的相關(guān)描述。

顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲(chǔ)在存儲(chǔ)裝置中由計(jì)算裝置來執(zhí)行,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。

以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
西丰县| 曲麻莱县| 宿迁市| 闸北区| 水富县| 乌兰县| 武鸣县| 龙江县| 淮滨县| 都昌县| 鄂伦春自治旗| 清远市| 南京市| 禄丰县| 丰县| 铁岭县| 和政县| 金华市| 固原市| 榕江县| 临邑县| 乐昌市| 灵台县| 北川| 金阳县| 富宁县| 屏山县| 磐石市| 日照市| 惠安县| 英山县| 桦川县| 密云县| 镇雄县| 永善县| 岳西县| 兰西县| 玉林市| 游戏| 阿城市| 黄龙县|