Flash的寫入是比較囉嗦的,除了要先做Erase,還要下一連串的command才能寫入,同時還很慢,很花時間,下圖是AMD的AM29LV800B的部份規格,spec上都有說到,
這裏就不說詳細的程式該如何寫了,假設大家都會寫程式,規格內有maximum的保證完成時間,有的人就會使用這個規格來使得自己寫出的flash寫入程式會正常運作,不過這有了一個問題,最大的sector erase time是15秒,裡面有一、二十個sector,假設有18個sector,那光erase就要等上270sec=4.5分鐘,寫入更久ㄡ,要27秒,27*18=504=8.4分鐘,那嚇死人了,這種程式可以說毫無利用價值,是不正確的寫法。
應該是要利用該flash提供的某些程序,例如判斷DQ6這根腳會toggle來決定programming/erasing sequence完成,詳細方法請參考各個spec,使用這樣的方式可以降低好幾倍的時間,而且沒有問題,如此作法才是正確的寫法。
那這裡提供的秒數是幹什麼用的呢?此處是”最差狀況”,是讓我們估計用的,注意不同溫度、不同的電壓的寫入時間是大大不同的。
Flash還容易,spec上也有寫到該如何處理,那eeprom呢?以
除了電壓不同造成的寫入時間不同,這顆eeprom有512k/8=64kbytes,每個byte的寫入時間超長,最長的要
事實上是可以的,要使用I
ready:Ack=0
busy: Ack=1
只要busy,就立刻跳回這個I
For(i=0; i<10000; i++)
{
Start();
……
If(busy)
Continue;
……
Stop();
}
這種作法就可以讓時間大幅縮小數倍,不用再侷限於20ms的最差時間。
這樣其實還不夠,還要再使用page write,以此顆為例,一個page=128bytes,因為內部在寫入時,eeprom是以128bytes為單位的,換句話說,eeprom是準備寫128bytes的,只是內部還有一些其他機制,使得我們可以對單一byte動作而不會影響到其他byte的資料,既然eeprom都已經準備好了,而我們又準備寫入很多的資料,何必要浪費掉這樣的動作,當使用page write時,會加快很多很多。
不過要注意,page是以位置”0000h”來當基準的,就是0000h,0080h,00100h……,不是任意值,程式要小心這樣的處理,不同size、不同廠牌的page大小有可能不同,要仔細看spec,回頭看一下電子學裡面有關EPROM的那章,很容易就會體會到為什麼flash類的元件要做某些動作(例如要先erase才能寫等)。
還有最後要注意的一件事,FLASH, EEPROM, MCU內建的FLASH等,在做erase、programming等的動作時,要嚴禁突然中斷電源,因為在做此類的動作時,ic內部會先做電壓提升的動作,突然的斷電,會導致負載異常,所謂異常就是出乎意料,可能高可能低,那個提升的電壓降下也就罷了,就怕提升,可能讓元件損毀。
- 1樓. immortal2008/09/26 13:01耗電
用 while 作 polling 會很耗 cpu 及 "電"
對於手持式裝置 並不建議用此方法讀寫 flash是的,不同的產品必須用不同的解決方式,這是很重要的看法,感謝您的意見。
彼得鄧 於 2008/09/29 15:46回覆
說實話,其實這是一個很大且普遍的問題!
【很耗cpu】:純硬體工程師看不懂。
【很耗電】:純軟體工程師看不懂。
當發生了問題,例如如您提到的問題,會發現,純粹的軟硬體工程師會很難找到答案,就算是一起合作也會有一點問題。
軟硬體分家,原本只是任務上的分工,但是現在真的分家了,互相看不懂,【積極一點】的還會互管,只是不曉得會管成怎麼樣罷了。
很有趣的一點,有時候看一下產品設計,大致上就可以猜出這個案子管理者的特性,究竟是軟體出身?還是硬體出身?有時甚至是業務出身......當解決這類問題,除了要看產品特性,還要看擁有的資源,例如有無作業系統也是一個重要考量,因為如果有作業系統,就可以利用如sleep(us)類的函式來釋放cpu資源,除了可有效避免佔用cpu的問題,又可以達到時間延遲的目的,同時也可減少polling的次數,達到省電的目的。
但若是單工的系統,有的cpu ram/flash很少,就要好好安排一下怎樣做會比較好了。
一般普通的產品,應該不會有頻繁寫入flash或eeprom的問題,偶行一次應該無礙電力的時間,如果是內建flash或eeprom的cpu,那是非polling不可了,你不poll,甚至是開啟中斷,就準備當機吧!有的連polling的機會都沒有,因為是ic內部幫你poll的,當你能執行下一行時,就是poll完了。
如果不等flash或eeprom寫完就開始執行程式,那就要很注意程式時序的問題,就是semaphore的維護,會是一個很麻煩的問題,究竟是要浪費一點電?還是仔細檢討程式碼結構?就需要仔細考慮了。
文中提到的while的方式,只是一個意思的表達而已,究竟該如何做,必須要考慮所有資源,專案時間,甚至是產品價格與特性,誇張一點,如果這個東西是一個用完即丟的東西,那這麼省電有什麼用呢?
彼得鄧 於 2008/09/29 16:25回覆