本發(fā)明涉及一種大容量存儲(chǔ)控制技術(shù),具體地說是涉及一種壽命均衡的NandFlash存儲(chǔ)器讀寫方法。
背景技術(shù):
現(xiàn)有絕大部分的Nandflash讀寫驅(qū)動(dòng),是為了適應(yīng)通用的文件系統(tǒng)而設(shè)立的,如支持幾乎無限制數(shù)量的文件寫入到存儲(chǔ)器中,文件讀寫格式也是準(zhǔn)備格式,因此這類文件系統(tǒng)驅(qū)動(dòng)通常要求軟硬件資源較多,比如linux操作系統(tǒng)中的YAFFS文件系統(tǒng),是一種公認(rèn)優(yōu)秀的能完善支持Nandflash存儲(chǔ)器的文件系統(tǒng),移植該系統(tǒng)需要RAM通常為存儲(chǔ)器容量的百分之一,如Nandflash存儲(chǔ)器容量為1GB,則RAM容量需要10MB,此外對(duì)CPU運(yùn)算速度也有要求,否則無法適應(yīng)對(duì)文件讀寫的速度要求。
有一類嵌入式系統(tǒng)組成的應(yīng)用系統(tǒng),如長(zhǎng)時(shí)間數(shù)據(jù)數(shù)據(jù)采集記錄儀器,其每次開機(jī)運(yùn)行時(shí)間長(zhǎng),文件數(shù)量少,單個(gè)文件容量大。這類系統(tǒng)資源相對(duì)緊張,比如CPU運(yùn)行速度幾十MHz,RAM容量幾十乃至幾百KB,無法移植YAFFS這類標(biāo)準(zhǔn)文件驅(qū)動(dòng)系統(tǒng)。大容量數(shù)據(jù)記錄系統(tǒng)中通常將NandFlash作為的數(shù)據(jù)存儲(chǔ)器。這種存儲(chǔ)器寫入以塊(block)為基本單元,存在寫入次數(shù)有限的缺點(diǎn),如5000-10000次。在出廠時(shí),就可能存在已經(jīng)已做標(biāo)記的壞塊(有壞塊的存儲(chǔ)器的其他塊仍然可以正常寫入、讀出),在寫入過程中也會(huì)產(chǎn)生新的壞塊。因此,對(duì)這種存儲(chǔ)器進(jìn)行讀寫時(shí),需要識(shí)別壞塊、躲避壞塊、均衡寫入(盡可能保證所有的塊的寫入次數(shù)一致),以保證整個(gè)存儲(chǔ)器的壽命。
人們?cè)O(shè)計(jì)了多種文件系統(tǒng),以支持對(duì)NandFlash的讀寫,其基本思路是建立一張映射表和一個(gè)數(shù)據(jù)緩沖區(qū),定期更新寫入次數(shù)記錄和壞塊記錄,并依此調(diào)整數(shù)據(jù)寫入的塊位置。在數(shù)據(jù)寫入開始時(shí),先將數(shù)據(jù)緩存在緩沖區(qū)中,等前述判斷完成后再寫入NandFlash中。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述技術(shù)問題,本發(fā)明的目的是提供一種對(duì)存儲(chǔ)器進(jìn)行讀寫時(shí),可識(shí)別壞塊、躲避壞塊、均衡寫入,保證所有的塊的寫入次數(shù)一致,以保證整個(gè)存儲(chǔ)器的壽命的壽命均衡的NandFlash存儲(chǔ)器讀寫方法。
本發(fā)明的技術(shù)方案是:一種壽命均衡的NandFlash存儲(chǔ)器讀寫方法,所述方法具體包括以下步驟:
寫入步驟為:
第一步:在NandFlash地址空間內(nèi)建立一張新的文件信息表,讀取其他所有文件信息表,確定新的文件的寫入起始地址;
第二步:判斷文件寫入起始地址是否正好處于一個(gè)塊的起始地址,如果是則要對(duì)其擦除,判斷擦除操作返回狀態(tài),如果返回錯(cuò)誤,則表明該塊為壞塊,需要在交換區(qū)找出一個(gè)塊來替換,并更新壞塊登記表;
第三步:待寫入的數(shù)據(jù)存入內(nèi)存的數(shù)據(jù)緩沖區(qū),若已存夠一頁內(nèi)容,則寫入存儲(chǔ)器中(一次寫滿一頁),判斷寫操作返回狀態(tài),如果返回錯(cuò)誤,則表明該頁所處的塊為壞塊,需要在交換區(qū)找出一個(gè)塊來替換,更新壞塊登記表,并將壞塊當(dāng)前頁和它之前頁的內(nèi)容復(fù)制到新塊中;
第四步:頁寫入成功后,更新文件信息表,包含文件存儲(chǔ)起始和結(jié)束地址、文件大小、文件更新時(shí)間;
第五步,重復(fù)第三步,直到用戶結(jié)束寫操作,檢查數(shù)據(jù)緩沖區(qū)中是否還有剩余數(shù)據(jù),若有則將緩沖區(qū)中所有數(shù)據(jù)寫入到存儲(chǔ)器(緩沖區(qū)未填滿的內(nèi)容用特定字節(jié)填充);
第六步:更新文件信息表,結(jié)束文件寫入操作;
讀取步驟為:
第一步:讀取文件信息表,已確定文件存儲(chǔ)的起始地址和結(jié)束地址;
第二步:判斷起始地址是否為新的塊地址,若是則執(zhí)行第三步,否則執(zhí)行第四步;
第三步:判斷準(zhǔn)備讀入的塊是否為壞塊,若是,則查找其替換塊的地址;
第四步:以頁為單位讀出,根據(jù)文件信息表判斷文件是否讀入完畢,若完畢則結(jié)束,否則繼續(xù);
第五步:判斷塊內(nèi)容是否全部頁都讀出,若沒有則將頁地址加1,繼續(xù)執(zhí)行第四步,否則執(zhí)行第六步;
第六步:將塊地址加1,繼續(xù)執(zhí)行第三步。
進(jìn)一步,所述方法還包括文件刪除操作:文件刪除操作是刪除信息文件信息表,若被刪除文件在數(shù)據(jù)區(qū)的起始地址之前尚存有文件,則將起始地址之前的文件依次復(fù)制,并存儲(chǔ)到最后1個(gè)文件的末尾起始地址,即保證數(shù)據(jù)區(qū)中保存有文件內(nèi)容的區(qū)域地址連貫。
進(jìn)一步,所述方法還包括文件追加寫入操作,即在文件的尾部繼續(xù)寫入,若被追加寫入的文件后面沒有其他文件,則直接繼續(xù)寫入即可,而如果該文件后面有其他文件,則先執(zhí)行的文件移動(dòng)過程,將被追加寫入的文件移動(dòng)到一用存儲(chǔ)空間的最尾端,然后在文件尾部繼續(xù)寫入。
進(jìn)一步,所述NandFlash地址空間分為存儲(chǔ)信息區(qū)、文件信息區(qū)、數(shù)據(jù)區(qū)和交換區(qū);
存儲(chǔ)信息區(qū),用于存儲(chǔ)壞塊登記交換表,位于文件信息區(qū)之后;所述存儲(chǔ)信息區(qū)分成若干小塊,每塊可以存儲(chǔ)一份完整存儲(chǔ)信息,每個(gè)小塊輪流使用;
文件信息區(qū),用于存儲(chǔ)壞文件信息表,位于存儲(chǔ)器物理地址的前幾個(gè)塊;文件信息區(qū)內(nèi)部分成若干小塊,每塊可以存儲(chǔ)一份完整文件信息,每個(gè)小塊輪流使用;
數(shù)據(jù)區(qū),用于存儲(chǔ)數(shù)據(jù)內(nèi)容本身,位于存儲(chǔ)器物理地址的中間部分;
交換區(qū),用于對(duì)壞塊的交換,位于存儲(chǔ)器物理地址的最后若干個(gè)塊,若數(shù)據(jù)區(qū)中某塊無法寫入,則將其用交換區(qū)中的塊替換。
進(jìn)一步,所述存儲(chǔ)信息區(qū)和文件信息區(qū)均有若干相同大小的小塊存儲(chǔ)單元組成,每小塊存儲(chǔ)單元均存儲(chǔ)一份完整存儲(chǔ)信息,每小塊存儲(chǔ)單元輪流使用。
本發(fā)明的有益效果是:由于采用上述技術(shù)方案,本發(fā)明的方法具有計(jì)算量小、需要內(nèi)存小的特點(diǎn),適合適用于同一時(shí)間單一文件操作的應(yīng)用場(chǎng)合,對(duì)系統(tǒng)硬件、軟件需求低,能為這種低成本、低功耗的嵌入式系統(tǒng)的操作提供完整的文件系統(tǒng)方案。
附圖說明
圖1為本發(fā)明的文件寫入方法流程框圖。
圖2為本發(fā)明的文件讀取方法流程框圖。
圖3為本發(fā)明的存儲(chǔ)區(qū)結(jié)構(gòu)示意圖。
圖4為本發(fā)明的文件移動(dòng)邏輯框圖。
具體實(shí)施方式
下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步說明。
如圖1和圖2所示,本發(fā)明一種壽命均衡的NandFlash存儲(chǔ)器讀寫方法,所述方法具體包括以下步驟:
寫入步驟為:
第一步:在NandFlash地址空間內(nèi)建立一張新的文件信息表,讀取其他所有文件信息表,確定新的文件的寫入起始地址;
第二步:判斷文件寫入起始地址是否正好處于一個(gè)塊的起始地址,如果是則要對(duì)其擦除,判斷擦除操作返回狀態(tài),如果返回錯(cuò)誤,則表明該塊為壞塊,需要在交換區(qū)找出一個(gè)塊來替換,并更新壞塊登記表;
第三步:待寫入的數(shù)據(jù)存入內(nèi)存的數(shù)據(jù)緩沖區(qū),若已存夠一頁內(nèi)容,則寫入存儲(chǔ)器中(一次寫滿一頁),判斷寫操作返回狀態(tài),如果返回錯(cuò)誤,則表明該頁所處的塊為壞塊,需要在交換區(qū)找出一個(gè)塊來替換,更新壞塊登記表,并將壞塊當(dāng)前頁和它之前頁的內(nèi)容復(fù)制到新塊中;
第四步:頁寫入成功后,更新文件信息表,包含文件存儲(chǔ)起始和結(jié)束地址、文件大小、文件更新時(shí)間;
第五步,重復(fù)第三步,直到用戶結(jié)束寫操作,檢查數(shù)據(jù)緩沖區(qū)中是否還有剩余數(shù)據(jù),若有則將緩沖區(qū)中所有數(shù)據(jù)寫入到存儲(chǔ)器(緩沖區(qū)未填滿的內(nèi)容用字節(jié)填充,如十六進(jìn)制字節(jié)AA);
第六步:更新文件信息表,結(jié)束文件寫入操作;
讀取步驟為:
第一步:讀取文件信息表,已確定文件存儲(chǔ)的起始地址和結(jié)束地址;
第二步:判斷起始地址是否為新的塊地址,若是則執(zhí)行第三步,否則執(zhí)行第四步;
第三步:判斷準(zhǔn)備讀入的塊是否為壞塊,若是,則查找其替換塊的地址;
第四步:以頁為單位讀出,根據(jù)文件信息表判斷文件是否讀入完畢,若完畢則結(jié)束,否則繼續(xù);
第五步:判斷塊內(nèi)容是否全部頁都讀出,若沒有則將頁地址加1,繼續(xù)執(zhí)行第四步,否則執(zhí)行第六步;
第六步:將塊地址加1,繼續(xù)執(zhí)行第三步。
如圖3所示,本發(fā)明所述NandFlash地址空間分為存儲(chǔ)信息區(qū)、文件信息區(qū)、數(shù)據(jù)區(qū)和交換區(qū);
存儲(chǔ)信息區(qū),用于存儲(chǔ)壞塊登記交換表,位于文件信息區(qū)之后;所述存儲(chǔ)信息區(qū)分成若干小塊,每塊可以存儲(chǔ)一份完整存儲(chǔ)信息,每個(gè)小塊輪流使用;
文件信息區(qū),用于存儲(chǔ)壞文件信息表,位于存儲(chǔ)器物理地址的前幾個(gè)塊;文件信息區(qū)內(nèi)部分成若干小塊,每塊可以存儲(chǔ)一份完整文件信息,每個(gè)小塊輪流使用;
數(shù)據(jù)區(qū),用于存儲(chǔ)數(shù)據(jù)內(nèi)容本身,位于存儲(chǔ)器物理地址的中間部分;
交換區(qū),用于對(duì)壞塊的交換,位于存儲(chǔ)器物理地址的最后若干個(gè)塊,若數(shù)據(jù)區(qū)中某塊無法寫入,則將其用交換區(qū)中的塊替換。
如圖4(a)所示,所述方法還包括文件刪除操作:文件刪除操作是刪除信息文件信息表,若被刪除文件在數(shù)據(jù)區(qū)的起始地址之前尚存有文件,則將起始地址之前的文件依次復(fù)制,并存儲(chǔ)到最后1個(gè)文件的末尾起始地址,即保證數(shù)據(jù)區(qū)中保存有文件內(nèi)容的區(qū)域地址連貫。
如圖4(b)所示,所述方法還包括文件追加寫入操作,即在文件的尾部繼續(xù)寫入,若被追加寫入的文件后面沒有其他文件,則直接繼續(xù)寫入即可,而如果該文件后面有其他文件,則先執(zhí)行的文件移動(dòng)過程,將被追加寫入的文件移動(dòng)到一用存儲(chǔ)空間的最尾端,然后在文件尾部繼續(xù)寫入。
以上對(duì)本發(fā)明的一個(gè)實(shí)施例進(jìn)行了詳細(xì)說明,但所述內(nèi)容僅為本發(fā)明的較佳實(shí)施例,不能被認(rèn)為用于限定本發(fā)明的實(shí)施范圍。凡依本發(fā)明申請(qǐng)范圍所作的均等變化與改進(jìn)等,均應(yīng)仍歸屬于本發(fā)明的專利涵蓋范圍之內(nèi)。