Blackfin輕量級(jí)內(nèi)核VDK及其文件系統(tǒng)設(shè)計(jì)
為提高存儲(chǔ)效率和方便管理,地址緩沖區(qū)的內(nèi)容會(huì)被記錄在數(shù)據(jù)Nor Flash中,作為一個(gè)地址映射表.地址映射表體積不大,燒寫到Nor Flash時(shí),可將燒寫代碼推入到VDK的關(guān)鍵域中,因?yàn)闊龑憰r(shí)間小于兩次中斷間隔,這樣既不會(huì)照成中斷延時(shí),又能保證燒寫工作一次完成。
硬件平臺(tái)上電后,系統(tǒng)啟動(dòng)線程首先讀取Nor Flash中的地址映射表到地址緩沖區(qū),隨后基于地址緩沖區(qū)進(jìn)行文件管理;如需更新壞塊信息,首先更新地址緩沖區(qū),然后將地址緩沖區(qū)內(nèi)容記錄到Nor Flash中。故而名為映射,實(shí)質(zhì)是一種標(biāo)記的方法。地址映射機(jī)制如圖2所示。
圖2 地址映射機(jī)表的設(shè)置與使用
3.3 壞塊回收
Nand Flash芯片在出廠時(shí)就存在隨機(jī)壞塊,同時(shí)隨著使用時(shí)間的推移,一些有效塊也會(huì)因?yàn)榫幊痰脑虺蔀樾碌膲膲K,故而存儲(chǔ)陣列在使用一段時(shí)間后,應(yīng)當(dāng)更新壞塊信息。考慮到陣列中文件的安全性和完整性,系統(tǒng)設(shè)置為存儲(chǔ)陣列為空時(shí)方能更新壞塊信息。
格式化整個(gè)陣列后,存儲(chǔ)陣列中的FPGA芯片依次讀取每個(gè)數(shù)據(jù)塊的第一頁(yè)數(shù)據(jù),如果發(fā)現(xiàn)非0xFF數(shù)據(jù)的個(gè)數(shù)超過(guò)設(shè)定閾值,就認(rèn)為此數(shù)據(jù)塊為壞塊。之所以設(shè)定閾值而不是一有非0xFF數(shù)據(jù)就視為壞塊,是為了克服數(shù)據(jù)讀取的不穩(wěn)定性。
BF537讀取存儲(chǔ)陣列傳送來(lái)最新壞塊信息后,按照?qǐng)D2中地址映射表設(shè)置的辦法,首先更新地址映射緩沖區(qū),隨即將地址映射緩沖區(qū)的內(nèi)容實(shí)時(shí)更新到數(shù)據(jù)Nor Flash中,保持兩者的同步。
由于壞塊信息更新的時(shí)間可能較長(zhǎng),更新工作放在主線程中可能造成較大時(shí)延,影響主線程對(duì)用戶命令的響應(yīng),所以壞塊回收與標(biāo)記可放在子線程中。
3.4 磨損均衡
Nand Flash芯片的編程次數(shù)有限,如果對(duì)某個(gè)數(shù)據(jù)塊操作過(guò)于頻繁,將迅速縮短其使用壽命,最終成為壞塊,乃至影響整個(gè)芯片的使用。如果均衡地使用Flash芯片的每個(gè)數(shù)據(jù)塊,對(duì)其操作的概率在較長(zhǎng)時(shí)間內(nèi)大體相當(dāng),這樣不僅能減少芯片壞塊的比例,也能延長(zhǎng)存儲(chǔ)陣列的使用壽命。
開源和商業(yè)的文件系統(tǒng),都有較為完備的臟塊回收和磨損均衡的機(jī)制,但是其算法往往較復(fù)雜,同時(shí)需要將運(yùn)行信息實(shí)時(shí)更新到Flash芯片中。在存儲(chǔ)速率要求很高的情況下,復(fù)雜的機(jī)制對(duì)存儲(chǔ)速率將不可避免地造成影響。
文件系統(tǒng)關(guān)于磨損均衡的解決方案主要是順序存儲(chǔ)和陣列整理。文件存儲(chǔ)時(shí),并不使用鏈?zhǔn)酱鎯?chǔ),填充文件刪除所留下的空洞,而采用連續(xù)存儲(chǔ)的方式,將最新的文件存儲(chǔ)到當(dāng)前所有文件的末尾。這樣不僅編程簡(jiǎn)單,而且存儲(chǔ)陣列在一段時(shí)間后可能會(huì)被耗盡,此時(shí)如果刪除尾部的某些文件,那么下個(gè)的文件可以存儲(chǔ)在這些空余出來(lái)的位置;如果利用陣列整理功能將當(dāng)前文件壓縮為連續(xù)緊湊的文件序列,去除文件刪除時(shí)留下的空洞,這樣整理出來(lái)的空間也可以繼續(xù)用于下次存儲(chǔ)。
3.5 掉電保護(hù)
嵌入式系統(tǒng)硬件平臺(tái)的工作環(huán)境一般較為惡劣,電源模塊隨時(shí)會(huì)有停止供電的可能。故而掉電保護(hù)是嵌入式文件系統(tǒng)設(shè)計(jì)的重點(diǎn)和難點(diǎn)。
微軟的FNT文件系統(tǒng)的掉電保護(hù)主要針對(duì)FAT表,本文件系統(tǒng)也是基于這個(gè)理念。開始文件存儲(chǔ)時(shí),子線程對(duì)發(fā)送的塊地址數(shù)目做一個(gè)計(jì)數(shù),當(dāng)計(jì)數(shù)量達(dá)到設(shè)定的閾值N后,將新文件的信息更新到文件目錄表緩沖區(qū)中,并立即將文件目錄表更新到Nor Flash中,兩個(gè)更新的操作不能被中斷,故而將這段代碼推入到關(guān)鍵域中。隨后將計(jì)數(shù)值清零,重新開始前一過(guò)程。如果在存儲(chǔ)過(guò)程中掉電,重新上電啟動(dòng)后,開始新的存儲(chǔ),系統(tǒng)會(huì)自動(dòng)查詢存儲(chǔ)陣列最后一個(gè)文件的狀態(tài)標(biāo)記,如果標(biāo)記為暫存,則判定最后一個(gè)文件在存儲(chǔ)時(shí)遇到了掉電的情況,那么系統(tǒng)自動(dòng)擦除該文件接下來(lái)N個(gè)數(shù)據(jù)塊的信息,然后最后一個(gè)文件開始新的存儲(chǔ)。
文件刪除操作是在刪除動(dòng)作完成后才更新文件目錄表,如果在刪除過(guò)程中掉電,那么上電后,用戶可以對(duì)該文件重新刪除。文件的拷貝和剪切是在操作前更新文件目錄表,如果在操作過(guò)程中出現(xiàn)斷電,重新上電后,用戶可先刪除拷貝后的新的文件,去除殘塊,然后開始新的操作。
4 結(jié)束語(yǔ)
介紹的嵌入式文件系統(tǒng)已在項(xiàng)目中成功投入使用,當(dāng)然仍有許多方面需要改進(jìn)。例如文件目錄表如果較長(zhǎng),線性遍歷耗時(shí)也會(huì)相對(duì)較長(zhǎng);文件目錄表沒(méi)有備份,如果更新文件列表時(shí)存儲(chǔ)系統(tǒng)出現(xiàn)掉電,該如何應(yīng)對(duì)等。VDK是ADI公司為自己的集成開發(fā)環(huán)境量身打造的內(nèi)核,相對(duì)于Linux等開源系統(tǒng)來(lái)說(shuō),使用范圍可能較窄,但基于ADI的DSP使用自然有其得天獨(dú)厚的優(yōu)勢(shì)。本文引用地址:http://www.ex-cimer.com/article/149266.htm
評(píng)論