由于FLASH的擦除和寫入的特性,如果在擦除中掉電或者寫入時掉電,有可能會出現失敗的情況,下次再上電讀取就會出錯。
擦除的時候掉電,不能保證擦除完全,已經擦除的部分,肯定是0xff了。
寫的時候掉電,已經寫入的就是正確的,電平掉到極限工作電壓附近時,寫入的就無法保證了,地址無法保證,寫入的值也無法保證。沒有寫到的,肯定還是 0xFF。??
2、解決方式
2.1、硬件方式解決 — 掉電保護機制?
必須硬件電路上有相應的掉電警告中斷,必須有足夠的時間供軟件響應。??
掉電保存和上電恢復,需要以下:?
1) 快速檢測掉電信號;
2) 要有足夠的時間讓你停下來保存現場;
3) 上電后可靠的復位;?
這些的關鍵是掉電信號\電源\復位信號三個怎么配合的事;
???
掉電保護不是重新擦寫那么簡單,要有一個機制能知道發生了掉電事件,還要知道什么地方的數據是可能出錯的,如果是新建文件還好一點,一般就是數據作廢,如果是改寫一個文件時發生掉電事故的話,還要有恢復機制,將數據恢復成改寫以前的數據。
由于 flash 的先擦后寫的特性,不會在原來位置重新寫數據,一般都是把原位置的數據標記為無效,再在新位置寫入數據,對于文件來說有一個存儲位置的關系,這不同于文件系統的邏輯地址,每個邏輯地址要有對應的物理地址,要有一套邏輯-物理地址的轉換映射關系在里面。

