关于NandFlash在实际产品使用上的一些经验
關于NandFlash在實際產品使用上的一些經驗
07.26.2011, 嵌入式, by qwl.自己從第一次接觸Nandflash到現在也有將近兩年的時間了,從剛開始的無從下手到現在的略知一二。
回過頭來看自己的學習歷程,積累了很多無論你如何Google和泡壇子都學習不到的經驗?,F在拿出來分享給大伙,算是對集體智慧的一種回饋吧。
首先說一下Nandflash本身的一些缺陷和優勢:
優勢:
1,速度快。這個貌似沒啥可說的,對于現在動輒上G的芯片容量,速度是必要的基礎。
2,便宜。雖然趕不上硬盤,但是在嵌入式設備里面絕對是性價比杠杠的。
3,沒了。除了傻快傻便宜,真沒嘛優勢。
劣勢:
1,可靠性不高。這里所說的可靠性分為兩個方面,第一是芯片出廠的時候就伴隨著一定概率的缺陷。你們懂得,我說的是壞塊。這個缺陷會令很多初入此行的孩紙們丟掉工作,后面會詳細說。第二個是芯片使用過程中的不穩定,當然還是在說會產生壞塊的問題。。。
2,不能片上運行程序。由于無法直接尋址,所以就不可能做到片上運行程序。這是很多網絡上文章經常提到的一點,實際上對生活影響不大。因為現在內存便宜的很,一般的家用嵌入式設備對內存沒有這么苛刻的要求。
3,芯片操作復雜。不同于norflash,nandflash沒有這么容易操作。我說的操作主要是指不通過驅動程序直接靠編程完成對于flash的存取。但是我還是要說上面的話:實際上對于生活影響不大。因為目前大部分的民用嵌入式設備都有操作系統,一般為linux。linux為flash設備提供了mtd驅動層,我們對于flash的操作都被抽象成了統一的接口甚至是設備符號,無需關心底層實現。
?
下面來說說實際使用時候的一些心得體會:
?
一,什么樣nandflash分區大小是合理的?
考慮到業務的需要,一般我們不會將整個芯片完全當作一個整體來使用。就如同你使用電腦的時候不會只給硬盤分一個區一樣。主要是為了防止對分區進行改動或者重新燒錄的時候會丟失全部的數據。
而如何分區才是合理的呢?我歸納主要有以下幾點需要注意:
1,任意一個分區的大小不要超過操作系統所能操作內存的2/3。比如你有128M內存,linux可以支配其中的96M,那請不要將nandflash的分區設計為大于64M。
這樣的考慮主要是因為,如果未來你需要升級這個分區,尤其是通過網絡升級這個分區。如果你的升級方式不是增量式的,那么你必須有一段與flash分區大小一致內存空間用來存放鏡像。這個時候假設你的flash分區為96M,那么你將不可能完成更新。因為你沒有足夠的內存空間。除非實時解壓縮實時燒錄,風險很高。
?
2,分區一定要給壞塊留出足夠的空間。我最早接觸到nandflash的時候就犯了這個錯誤,uboot大小200k,我給它劃分的空間為256k,結果遭遇壞塊,上下移動都沒有空間,非常杯具。
拿目前嵌入式系統比較常用的128M nandflash,他沒產生一個壞塊,空間損失128k。也就是說,如果你設計分區大小為512k,遭遇兩個壞塊,實際空間只有256k了。
通過大量設備生產后所統計出來的結果,一般nandflash出廠的壞塊基本不會超過4塊。位置不固定。所以我的推薦是,如果你的某些分區容量較小,比如設計使用容量為512k,請劃分該分區為1M以避免壞塊。如果分區容量較大,比如60M,請劃分64M。這樣比較合理。
?
3,如果被劃分的分區將會使用文件系統,比如Yaffs之類,請不要劃分的過小。比如你有一個分區用來存儲配置文件,你認為只需要3M就可以解決問題。但實際上你會發現,這個分區只要一mount上,就已經被占用了2M,因為文件系統自己會規劃出來一部分區域。你自己能操作的空間只剩下1M了,與設計目標產生巨大的沖突。請適當調整大小,并同時參考2號建議。
?
二,如何對nandflash分區進行合理的規劃?
這里所說的規劃指flash要如何進行邏輯上的區分,比如要分幾個區等。
這個問題說起來比較復雜,因為不同的應用有不同的設計目標。有些提供可能簡單的分兩個區甚至不分區就能解決問題,而有些可能會很復雜。
這里我拿我所經手的項目舉例子:
項目為iptv機頂盒,使用linux操作系統,使用uboot作為引導程序。
我的分區如下:
1M,uboot
1M,uboot-config
3M,kernel
32M,rootfs
16M,backup-rootfs
64M,apps
5M,config
?
uboot如果升級失敗,將會帶來災難性的后果。但是有些uboot啟動的參數需要被動態的更改,所以必須要把uboot存儲參數的部分與uboot分離。所以uboot被分為兩個區分別存儲。
?
kernel無需多說,由于附帶的驅動較多3M是一個合理的數值。
?
rootfs指linux所依賴的根文件系統。包括busybox以及實現最小系統所必須的文件。
?
rootfs-backup為備份根文件系統,里面存放最小系統所必須的文件以及系統恢復用的程序。
?
apps為機頂盒程序以及對應驅動的存放分區,為flash中容量最大的部分。我們將所有自己編寫的程序以及驅動都放置于這個分區,未來升級和維護都會變得很容易。
?
config分區存儲應用程序所依賴的一些配置文件。單獨一個分區存放是為了避免用戶程序分區被升級時,每一個用戶自己的設置以及信息不會丟失。
?
我這里要特別說一下uboot部分。
uboot是整個nandflash的靈魂,沒有他系統就無法正常啟動,甚至無法正常初始化內存。當然uboot只是一種程序,他開源,易于使用,大伙都愛用它。親,支持哦~
在我們的項目中,uboot一直沒給我們找什么麻煩。但是到了工廠生產的時候,卻吃了大虧。100片nandflash燒錄完有超過10片無法正常啟動。為什么呢?原因如下:
?
nandflash在出廠的時候一定會保證第一個塊不是壞塊,在我們所使用的芯片里,就是前128K絕對可以使用。但是后面的塊就無法保證了。我們為uboot劃分了512K空間,本來覺得就算是有壞塊也會跳過去,沒有所謂。
?
但是我們忽略的一個雷人的問題……那就是uboot被燒錄器燒錄完以后,已經因為壞塊導致自己被燒錄的支離破碎。當cpu將第一塊數據讀取到內存中并運行的時候,這部分代碼不具備跳壞塊讀取的能力,自然而然的uboot其余的部分就無法正常讀取,自然系統將會無法啟動……
如何解決呢?
方法說簡單也簡單,說復雜也復雜。我們需要首先編譯一個小于128K什么功能都不帶但是完整的uboot。通過這個uboot引導起來以后再從flash里面讀取另外一個完整功能的uboot到內存,然后引導這個uboot然后再引導linux。這就是傳說中的二段跳。
所以在我們的系統分區中,uboot的那1M分區,實際上包含了兩個uboot。
前128k一個,后面也許緊貼著也許隔若干個壞塊又是一個uboot。這樣就避免在工廠生產出來的uboot無法啟動問題。同學們一定要切記!
?
基本上就是這些,下一次有時間會說說如何通過uboot實現升級失敗后的啟動分區切換,來完成災難拯救的任務。
轉自:http://zoneker.com/2011/07/26/%E5%85%B3%E4%BA%8Enandflash%E5%9C%A8%E5%AE%9E%E9%99%85%E4%BA%A7%E5%93%81%E4%BD%BF%E7%94%A8%E4%B8%8A%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%8F%E9%AA%8C/
轉載于:https://www.cnblogs.com/fly-fish/archive/2011/11/03/2234854.html
總結
以上是生活随笔為你收集整理的关于NandFlash在实际产品使用上的一些经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三级火箭力助搜狗快速盈利
- 下一篇: Linux configure 参数解释