新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 充分利用MAXQ®處理器的非易失存儲服務

        充分利用MAXQ®處理器的非易失存儲服務

        作者: 時間:2011-05-21 來源:網絡 收藏


        要注意這種方案并沒有涉及重復記錄的問題。因為重復記錄不會有問題。事實上,讀和寫程序都會完全忽略重復記錄。寫操作時,不管同樣編號的記錄是否存在,新記錄都會寫在陣列的末尾。當讀操作時,只有符合請求記錄編號的最后一個(所以是最近的)記錄可以讀到。

        從陣列中讀取數據元會比寫操作更復雜。讀功能會收到數據元編號和數據元應該寫入的地址。當執行此命令時,讀操作會從陣列的最開始進行搜索。當它找到一個記錄符合被請求的數據元,它會保存這個地址并繼續搜索。當它找到另外一個匹配的記錄時,讀命令會用新地址替代已保存的地址。當搜索到陣列的末尾時,保存的地址就會是符合請求記錄的最近寫入的記錄。當執行讀操作時,就會把這個數據復制到緩存中。

        盡管所介紹的用來從陣列中保存和讀取記錄的主讀機制是可行的,還會存在一個問題:沒有機制可以重新使用被過時的記錄占用的空間(也沒有機制可以刪除記錄。但由于這種方案是針對嵌入式應用開發的,所以可能不會是個很嚴重的問題。)。如果不重新恢復一些空間,這些之前被分配的空間會很快用盡。由于閃存只能每次擦除一整個頁面,恢復空間意味著擦除整個頁面。另外一個更嚴重的問題是閃存頁面不能被隨便擦除,會存在刪除有用信息的風險。唯一的可選方案是在刪除整個舊頁面之前,把有用信息復制到一個新頁面。

        從廢舊的記錄中恢復空間有三個步驟。第一,打開新頁面,把每個數據元的最近版本復制到新頁面中。第二,擦除舊頁面。第三,對新頁面做頁面標示,是讀命令可以找到新頁面。

        第一個步驟比較復雜,需要更詳細的檢查。完成這個步驟最簡單的方法可以分成兩個子步驟:第一,使用一個RAM保存記錄編號和陣列中最近記錄的地址;第二,從RAM陣列逐一復制最近記錄到新閃存頁面。這個過程最快,并且相對簡單。

        使用這兩個子步驟存在的問題是MAXQ2000只有1k字的RAM空間。上述方案限制了可以保存到RAM中作緩存的數據量。這明顯是不能接受的。

        這種難題的解決方案非常耗時,但不管陣列變得多大(合理范圍內)都是可行的。為源陣列中的每一項條目單獨操作,而不是在RAM中建立指針。因此,算法可以簡化為:

        本文引用地址:http://www.104case.com/article/150720.htm
        1. 從源陣列讀取一個數據元。
        2. 在目標陣列中搜索這個數據單元。假如找到了,就說明這個數據單元已經寫入。源指針增加并返回步驟1。
        3. 在源陣列中搜索這個數據單元最近記錄。
        4. 把這個數據單元的最近記錄寫入目標陣列中。
        5. 源指針增加并返回步驟1。

        最后,在目標陣列中,每個數據元都有精確的條目對應。填寫后的頁面如圖3示意。這樣,就可以安全擦除源頁面,并把頁面報頭寫入目標陣列。

        圖3. 空間恢復后,圖2中的數據頁面會如此表現。
        圖3. 空間恢復后,圖2中的數據頁面會如此表現。

        這個過程對于數據會非常安全。然而,當使用閃存器件時還要面對另一個風險:在寫或者擦除操作中掉電。假如發生掉電,有可能會破壞一個或者多個頁面(例如寫操作)或者不能完全擦除頁面(例如擦除操作)。而我們這種緊湊的操作從本質上講是安全的。可以考慮以下的情況:

        • 假如在填寫操作時掉電,源頁面仍然保持完整。當重新上電后,很容易辨別新寫的頁面(他們沒有頁面報頭)并把它擦除,再重新啟動填寫操作。
        • 假如在正擦除舊頁面時掉電,可能會包含無效的報頭。可以擦除這些頁面并把報頭添加到新頁面。
        • 假如在正把頁面報頭寫入到新頁面時掉電,數據仍然是完整的。頁面報頭更新操作可以再次重新啟動。

        簡言之,這些預料之外的突發事件不會導致陣列數據被破壞并不可恢復。

        方案2的改進

        這里介紹的存儲子系統沒有錯誤檢測的機制。在數據元標識符中有一些位(這里的是6位)沒有被使用。可以使用CRC6算法(x6 + x + 1)根據數據元計算出CRC以確保沒有發生讀寫錯誤。這雖然不是特別強大的算法(它會錯過多位錯誤中的1/64),它可以檢測到多數可能發生的錯誤。

        這個方法對系統的另一個限制是讀取時間很長。每次讀操作都需要讀取陣列中的所有記錄,以找到最近的記錄。有3個方法可以用來縮短讀取時間:

        1. 在數據單元中為正向指針留一個空字節。當數據更新時,為正向指針分配一個新的入口地址。按照這種方式,數據表格可以按鏈表的方式移動。
        2. 向后移動表格。這樣就可以在被請求信號第一次出現時停止搜索。
        3. 假如單元數量很少,可以在啟動時建立一個RAM陣列,包含單元ID和指針。后面的讀取會很快。只需讀RAM陣列以決定從哪兒獲取數據單元。

        結論

        數據存儲是每位設計工程師遲早都必須面對的問題。使用MAXQ靈活的閃存,就不用再借助于串行存儲保存配置數據了。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泰顺县| 从化市| 平安县| 衡山县| 台江县| 天等县| 洪江市| 固安县| 蒲江县| 娄底市| 留坝县| 尉氏县| 竹溪县| 玛曲县| 舟曲县| 石泉县| 阳原县| 修武县| 庆安县| 嘉善县| 桓台县| 嘉兴市| 宝坻区| 绥德县| 铜陵市| 华亭县| 宜州市| 连州市| 静海县| 兰考县| 尼木县| 永清县| 婺源县| 东安县| 万源市| 达州市| 宜良县| 水城县| 连平县| 冕宁县| 宁陕县|