首先,要明確的是,資料寫的過程包括
擦除,下圖為nand flash乙個block(128k+7k)的時間,若擦除時被打斷,資料會殘缺
寫入,下圖為nand flash寫入乙個page(2k+112byte)的時間,所以乙個block的寫入需要64 x 300us = 19.2ms 的時間,若寫入時被打斷,資料會殘缺
資料讀的過程時間不計,因為讀過程被打斷,並不會造成資料的損壞
綜上所述,對擦除,寫入的失敗都要進行處理(會造成資料損壞)
接下來,對桌球操作進行解釋,對於擦除和寫入的處理有兩種方式,先介紹
對於讀寫都放在乙個介面內
函式
首先,使用兩個塊作為桌球塊
關於寫操作:寫入資料時,先指向塊a,對其進行擦除並寫入的操作。其中,若擦除時斷電,或者寫入時斷電了,不做處理。若擦除和寫入都完成的話,將寫指標指向另乙個塊。
關於讀取:讀取時讀取不是寫指標所指的那塊,比如寫指標指向a,則讀取b
第一次上電初始化時,先對ab塊進行擦除
收到資料後,將資料寫入a塊(上電初始化時擦除了,所以現在不用擦),然後將寫指標指向b塊。(若此時要讀取資料的話,就讀取a塊,即不是寫指標指向的那塊)
再次收到資料,將資料寫入b塊,同理,上電初始化的時候擦除過了,所以現在不擦,然後將寫指標指向a塊(若此時要讀取資料的話,就讀取b塊,即不是寫指標指向的那塊)
現在假設兩塊都有資料,那麼接下來分析各種失敗的情況
4. 擦除時掉電,不做處理,因為還有另一塊做備份,上電時讀取另一塊資料就好
5. 寫入時掉電,不做處理,同上
6. 讀取時掉電,此時對資料不會有影響,不處理
函式
關於寫操作:假設資料已經寫入兩塊,現在寫入資料時,先指向塊a,將資料寫入塊a,然後擦除塊b,然後將寫指標指向塊b
關於讀取:讀取時讀取不是寫指標所指的那塊,比如寫指標指向a,則讀取b
現在假設兩塊都有資料,那麼接下來分析各種失敗的情況
寫入時掉電,不做處理,因為還有另一塊做備份,上電時讀取另一塊資料就好
擦除時掉電,不做處理,因為還有另一塊做備份,上電時讀取另一塊資料就好
讀取時掉電,此時對資料不會有影響,不處理
那麼以上兩種方式有何區別?
首先,不討論寫操作時掉電的情況,因為兩種方式,寫操作掉電的話,都只能讀取舊的備份資料。所以以下預設寫操作沒問題。
區別在擦除操作和寫操作的順序,
第一種方式,由於spi_flash的擦除時間偏長,所以掉電時很大概率落在擦除中,所以當進行寫入操作時,萬一掉電了,最新的資料沒有寫入到flash中,重新上電後讀取的是上次備份的資料
第二種方式,由於每次都是先寫入再擦除另一塊,所以寫入最新資料後,擦除的是備份的資料,當擦除備份資料掉電後,重新上電讀取的是最新的資料。
其他問題
讀取和寫入會衝突嗎?
就算使用free_rtos,要需要保證讀取 和 寫入不能被打斷,擦除和讀取同時只能有乙個在進行
若兩個塊讀取的資料都校驗失敗怎麼辦?
重新初始化,擦除兩個塊的資料
桌球操作的寫入控制器
桌球操作的寫入控制器,由wr en使能,使能後,將會根據記憶體寫入次數的計數,輸出合適的位址,記憶體塊的片選訊號,以及將資料來源的資料輸出,由於wr req要求先資料乙個時鐘,這樣,如果使能模組判斷可以寫入,則wr en和data in同時進入此模組,乙個時鐘後,輸出位址,資料,片選 從而完成資料的...
FPGA兩片RAM的桌球操作
在資料處理的乙個週期內,為了避免同時對ram讀和寫,因此利用桌球操作將讀寫分開,在乙個週期內僅對一片ram讀,對另一片ram寫,下個週期後再換回來。因此,實際上一片ram的操作週期是兩個資料處理週期。scyc 資料處理週期 exsig ram切換訊號 wsig ram寫訊號 rsig ram讀訊號 ...
由桌球隊問題想到的
問題 問題描述 兩個桌球隊進行比賽,各出3個。甲隊為 a b c 3人,乙隊為 x y z 3人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單,a說他不和x比,c說他不和x z比,請程式設計序找出3對賽手的名單。之所以拿這個題目來講,是因為有些鬱悶 如此簡單的題目竟然耗費了我相當長的一段時間。咋看這...