<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 閃存在嵌入式Linux系統中的應用

閃存在嵌入式Linux系統中的應用

作者: 時(shí)間:2012-02-15 來(lái)源:網(wǎng)絡(luò ) 收藏

0 引言

本文引用地址:http://dyxdggzs.com/article/149678.htm

自誕生以來(lái),不斷發(fā)展壯大,支持越來(lái)越多的硬件體系,獲得了日益廣泛的,從服務(wù)器、桌面計算,到機頂盒、手機、路由器等,可以說(shuō)無(wú)處不在。雖然都是,但是環(huán)境和通用計算環(huán)境中的軟件/硬件配置大不相同。這是因為大多都是為某一專(zhuān)門(mén)而特別設計的,有可能需要耐受各種惡劣環(huán)境(比如意外斷電、極端溫度、強沖擊/振動(dòng)/輻射等),還受到體積、功耗、成本等諸多因素的限制,功能針對性強,需要酌情增加一些專(zhuān)用的硬件(如各種傳感器和專(zhuān)用接口),而許多通用計算機上常用的外設在系統中不那么常見(jiàn),典型的例子是硬盤(pán)、CD/DVD-ROM等大容量的非易失存儲設備,在嵌入式系統中,它們通常被各種形式的閃存所取代。閃存的存儲特性與硬盤(pán)等存儲設備的巨大差異,導致它必須使用專(zhuān)用存儲控制器、驅動(dòng)程序及文件系統。對不同類(lèi)型閃存及相應文件系統的選用,會(huì )影響最終形成系統的性能和穩定性,必須綜合各種系統構件的特點(diǎn)及目標系統的需求做出慎重的抉擇。

1 閃存類(lèi)型及特性

嵌入式系統中常用的閃存有兩類(lèi):NORFLASH和NANDFLASH。它們因內部結構與“或非”及“與非”門(mén)相似而得名。它們不僅在內部結構上不同,外部特性和也不一樣。NORFLASH的容量通常不大,常見(jiàn)的只有幾MB,可以重復擦寫(xiě)10萬(wàn)次到100萬(wàn)次。NORFLASH遵循CFI標準,可以通過(guò)CFI命令查詢(xún)其制造商、器件型號、容量、內部扇區布局等參數,實(shí)現軟件自動(dòng)配置。NORFLASH的優(yōu)勢還在于它在出廠(chǎng)時(shí)能保證每個(gè)數據位都是有效的,不需要做壞塊處理。NORFLASH的線(xiàn)性尋址特性使之可以作為啟動(dòng)存儲器使用。與NORFLASH相比,NANDFLASH的容量可以做得很大,常見(jiàn)的有幾十MB到幾GB,可以重復擦寫(xiě)10萬(wàn)次。NANDFLASH芯片上沒(méi)有地址與數據線(xiàn)之分,只有復用的I/O線(xiàn)和命令鎖存(CLE)、地址

鎖存(ALE)、讀/寫(xiě)使能(RE,WE)和片選(CE)等控制線(xiàn),必須通過(guò)特定的邏輯來(lái)操作。NANDFLASH不支持線(xiàn)性尋址,一般不能用作啟動(dòng)ROM。但這也不是絕對的。有些微控制器(如AT91SAM926x)提供出廠(chǎng)前固化在芯片內部的BOOT-ROM,并在BOOT-ROM中提供對NANDFLASH啟動(dòng)的支持。不過(guò)這樣一來(lái),首先啟動(dòng)的是BOOT-ROM中的程序,會(huì )產(chǎn)生啟動(dòng)邏輯和延時(shí)方面的種種問(wèn)題,設計時(shí)需要全面考慮。另外,生產(chǎn)廠(chǎng)商不保證NAND-FLASH中每一個(gè)數據位都是有效的,除芯片中的第一塊之外,允許有“初始壞塊”,并約定在壞塊的第一頁(yè)或第二頁(yè)帶外區(OOB)的特定位置標記壞塊。NANDFLASH還允許在使用過(guò)程中出現新的壞塊,以及非壞塊在讀出過(guò)程中出錯?;谶@些特點(diǎn),使用這種閃存時(shí)要做額外的壞塊管理和校驗/糾錯工作。在寫(xiě)入密集型系統中,必須提供ECC及壞塊換出算法,才能達到10萬(wàn)次的寫(xiě)入指標。

除了以上提到的兩種閃存之外,還有一種由NORFLASH衍生的串行閃存,通常是SPI接口。這種閃存繼承了NORFLASH沒(méi)有壞塊的優(yōu)點(diǎn),但不支持CFI標準,并且由于是串行接口,線(xiàn)性尋址沒(méi)有意義,為了方便操作,有些產(chǎn)品中加入了類(lèi)似NANDFLASH的塊/頁(yè)結構及基于片內SRAM的頁(yè)緩存,其優(yōu)勢在于硬件接口簡(jiǎn)單,提供小尺寸的封裝,可以顯著(zhù)減小PCB面積和布線(xiàn)復雜程度。

另外,基于NANDFLASH技術(shù)的串行閃存已經(jīng)量產(chǎn),使用的也是SPI接口,容量可以做到1Gb。

2 應用設計

目標應用系統是一臺專(zhuān)用的戶(hù)外顯示設備,要求其具有低功耗、抗振、寬溫操作及高可靠性等特點(diǎn)。為此,選擇了AT91SAM9261/AT91-SAM9G10,它是以ARM9為核心的集成片上液晶控制器的工業(yè)級微控制器,以DATA FLASH/NORFLASH和NANDFLASH存儲固件代碼和數據。在設計過(guò)程中,根據不同的閃存使用需求,采取了具有針對性的方案。

2.1 啟動(dòng)設計

在該系統中,結合微控制器提供的功能和各種閃存的特點(diǎn),可以綜合使用不同類(lèi)型的閃存,選擇不同的啟動(dòng)方式。AT91SAM9261內部集成了啟動(dòng)ROM,其中固化了支持啟動(dòng)和操作閃存的程序。流程圖如圖1所示。當AT91SAM9261的啟動(dòng)模式選擇(BMS)引腳在復位期間為高電平時(shí),會(huì )運行內部固化的啟動(dòng)程序;否則運行外部NORFLASH中的程序。從流程圖中可以看出,啟動(dòng)程序支持從串行閃存中啟動(dòng)。這是通過(guò)啟動(dòng)程序將串行閃存中的代碼加載到內部SRAM中實(shí)現的。由于內部SRAM容量有限(依芯片型號不同,有16 KB和160 KB兩種),像U-BOOt(編譯后有170KB左右,與配置有關(guān))這樣的功能,若較全面地啟動(dòng)加載程序(Bootloader)是不能直接從串行閃存中啟動(dòng)的,而只能選擇兩級啟動(dòng)程序,先從串行閃存中加載一段盡可能小的一級啟動(dòng)程序(通常只有4~5 KB).用于初始化關(guān)鍵的硬件(如SDRAM控制器。由于時(shí)序、數據線(xiàn)寬等參數是可變的,不可能在A(yíng)T91SAM9261內部固化的啟動(dòng)程序中提供通用的SDRAM控制器初始化代碼),然后再由一級啟動(dòng)程序把功能較全面的二級啟動(dòng)程序載入到容量足夠大的SDRAM中運行,以啟動(dòng)系統。從NORFLASH啟動(dòng)時(shí)會(huì )跳過(guò)AT91SAM9261內部固化的啟動(dòng)程序,系統復位后執行的第一條指行就是NORFLASH中的。此時(shí),啟動(dòng)程序可以只有1級,當然,為了使軟件和串行閃存啟動(dòng)方式有較好的兼容性,也仍然可以采用兩級啟動(dòng)程序,這樣只需簡(jiǎn)單修改第一級啟動(dòng)程序即可適用于兩種不同的硬件啟動(dòng)配置,為硬件設計留下更多的選擇空間。由于A(yíng)T91SAM9261本身的原因,從NORFLASH啟動(dòng)是實(shí)現寬溫工作的惟一選擇(AT91SAM9G10無(wú)此問(wèn)題)。圖2顯示了不同的啟動(dòng)配置。

在這個(gè)AT91SAM9261系統中,分別采用了2 MB的DATAFLASH或2 MB的NORFLASH作為啟動(dòng)存儲器,由BMS引腳選擇具體使用何種啟動(dòng)方式。閃

存中的地址劃分如圖3所示,其中的bootSTrap是第一級啟動(dòng)程序;U-Boot是第二級啟動(dòng)程序。

2.2 系統內核及應用程序文件系統映像

系統內核映像和各MTD分區的文件系統映像大小在幾MB到幾十MB不等,需要存儲在容量較大的NANDFLASH中。對于系統內核,由于做了適當的裁減,其長(cháng)度不大,和初始根文件系統加在一起不過(guò)幾MB,如果不在乎稍長(cháng)的啟動(dòng)時(shí)間,還可以對它使用gzip壓縮,大幅度減小其尺寸。在使用U-Boot作為啟動(dòng)程序的系統中,由于U-Boot具有直接讀取NANDFLASH塊/頁(yè)的能力,不需要使用文件系統,將內核映像直接寫(xiě)到閃存塊里。

應用程序及其所需的庫文件、資源文件等,作為獨立的文件系統映像掛載,在此選擇了帶有壓縮及去除重復文件功能的只讀文件系統,即SqLrashFS(SquashFs文件系統已經(jīng)被廣泛用于各種 Live CD形式的發(fā)行版中,被充分證明是可靠的,并且從Linux 2.6.29版開(kāi)始,它已加入到系統核心源碼)。在嵌入式系統中,使用只讀文件系統有許多好處,比如掛載時(shí)間短,不受掉電影響,不必在系統運行過(guò)程中處理壞塊及平衡損耗等。在使用過(guò)程中由于不涉及寫(xiě)入,其可靠性?xún)?yōu)于可寫(xiě)的文件系統。

在此目標系統中,內核和初始根文件系統的U-Boot映像約為2.8 MB,應用程序、GUI子系統,以及應用程序運行過(guò)程中所需的圖形和字體文件的SquashFS映像約為12 MB。系統中使用的NANDFLASH是一片總容量為64 MB的8位數據線(xiàn)寬的芯片,塊容量是16 KB+512 B,頁(yè)容量是512 B+16 B,其屬于塊尺寸較小的那種,與大塊NANDFLASH相比,操作命令稍有區別,在驅動(dòng)程序中需要區別對待。該系統中的MTD分區結構如表1所示。

2.3 應用程序對閃存的使用

大多數情況下,僅提供對閃存的只讀操作是不夠的。比如,U-Boot至少在更新其自身以及保存環(huán)境變量時(shí)需要寫(xiě)閃存;操作系統在記錄日志時(shí)要寫(xiě)閃存;應用程序在保存用戶(hù)配置及工作數據時(shí)也要寫(xiě)閃存。對于啟動(dòng)加載程序來(lái)說(shuō),問(wèn)題不是很?chē)乐?。因為系統處于更新及配置狀態(tài)時(shí),大多是脫離正常工作狀態(tài)的,且由專(zhuān)人操作,操作中途發(fā)生異常情況(如掉電)的可能性不大,即使發(fā)生了,也會(huì )被及時(shí)發(fā)現和處理。對于系統日志,在嵌入式系統中可以將其關(guān)閉,以減少對閃存的寫(xiě)操作。應用程序對閃存的寫(xiě)操作是不可避免的,而且處于設備自動(dòng)工作期間,需要應對各種偶然發(fā)生的異常狀況,特別是意外掉電。

在Linux系統中,通過(guò)文件系統訪(fǎng)問(wèn)閃存是順理成章的做法。目前支持NANDFLAsH的常用文件系統有YAFFS/YAFFS2,JFFS2和UBIFS等。它們都是記帳式的文件系統,各有特點(diǎn),也有不足。

YAFFS/YAFFS2是專(zhuān)為NANDFLASH寫(xiě)的文件系統。在YAFFS的代碼里包括管理閃存帶外區(OOB)的部分,而這部分代碼一般認為屬于設備驅動(dòng)的范疇,其他文件系統里是不含這部分代碼的。YAFFS是一種穩鍵的記帳結構的文件系統。高效率是它追求的另一個(gè)目標。它可以用在各種操作系統中(已用于Linux,WinCE,pSOS,eCos,ThreadX及各種專(zhuān)用操作系統中),甚至可以在沒(méi)有操作系統的環(huán)境下工作。YAFFS2支持“檢查點(diǎn)(checkpoints)”,以避免掛載過(guò)程中耗時(shí)的掃描操作,實(shí)現快速掛載。

相對于JFFS,JFFS2有了一些改進(jìn),可以支持硬連接(hard Links),垃圾回收更有效,平衡損耗更均勻。但它在掛載時(shí)仍需要掃描尋找最新版本的閃存塊,并建立RAM中的數據結構,文件系統越大,掛載時(shí)間越長(cháng),RAM開(kāi)銷(xiāo)也越大。雖然JFFS2已經(jīng)通過(guò)小結節點(diǎn)技術(shù)減少了掛載時(shí)間,但結果仍不理想,掛載時(shí)間是s級的。

UBIFS是JFFS2的后繼(原來(lái)稱(chēng)作JFFS3),第1個(gè)穩定版本于2008年10月加入到Linux 2.6.27版核心中,它有一個(gè)競爭者叫LogFS。UBIFS與JFFS2的最大不同在于它的文件索引信息是寫(xiě)在閃存中的,而JFFS2是暫RAM中的。因此,UBIFS在掛載時(shí)不需要掃描全部閃存空間,掛載耗時(shí)很短(ms級);UBIFS對RAM的消耗不會(huì )隨著(zhù)文件系統的尺寸變大而線(xiàn)性增長(cháng),適用于大容量的文件系統。

除這這些不同之外,各種閃存文件系統也一些共性。由于閃存的寫(xiě)入次數有限,為了避免局部因頻繁寫(xiě)入而過(guò)早失效,必須使寫(xiě)入操作盡量均勻分布到所有位置上,即平衡損耗(wear leveling)。這導致了更新文件時(shí)必須做異位更新,而不能像在磁盤(pán)或RAM中那樣簡(jiǎn)單地原位更新,從而引起一系列復雜的問(wèn)題。首先,異位更新會(huì )導致閃存塊中出現越來(lái)越多的過(guò)期頁(yè)面,它們與有效頁(yè)面混雜在一起,形成所謂的臟塊(dirty blocks)。當所有的閃存塊都成為臟塊后,就沒(méi)有閃存塊可供擦除再分配了。因此,基于閃存的文件系統都有垃圾回收器,用于將分散的過(guò)期頁(yè)面集中在一起,形成空閃存塊(free blocks)。由此引起的另一個(gè)問(wèn)題是文件系統在使用時(shí)不能用到接近填滿(mǎn),否則也會(huì )導致類(lèi)似的問(wèn)題。其次,樹(shù)狀結構的文件索引中大量的互相引用,某個(gè)節點(diǎn)的改變會(huì )引起該節點(diǎn)本身及直接和間接引用它的一系列節點(diǎn)的異位更新。

從以上的分析可以看出,NANDFLASH上的文件系統是一把雙刃劍。它確實(shí)可以提供清晰的軟件層次和使用上的方便,但同時(shí)也會(huì )降低操作效率,并具有潛在的可靠性問(wèn)題。關(guān)鍵是如何合理使用,揚長(cháng)避短。其實(shí),對于寫(xiě)入量小(一個(gè)擦除塊之內),并且不頻繁的數據,可以跳過(guò)文件系統,通過(guò)ioctrl()函數直接操作閃存。這樣做的缺點(diǎn)是破壞了軟件層次,要求應用軟件開(kāi)發(fā)人員了解一部分硬件的細節,在應用程序中完成一些本應屬于驅動(dòng)程序的底層功能(如塊擦除,發(fā)現和標記壞塊等);優(yōu)點(diǎn)是可以?huà)侀_(kāi)復雜的文件系統,不需要掛載及卸載,更不存在文件系統的完整性問(wèn)題,平衡損耗等措施可以視需要取舍,尤其在意外掉電時(shí),該方法可將所有的讀/寫(xiě)錯誤都限制在相對較小的局部,具有較好的應對掉電的能力。

2.4 閃存燒寫(xiě)支持

系統中的各種閃存可以用不同的方法寫(xiě)入數據,各種方法都有優(yōu)缺點(diǎn)??晒┻x擇的方法主要有兩種:在芯片焊接前用通用的編程器燒寫(xiě);在芯片焊接后進(jìn)行在系統燒寫(xiě)(ISP)。使用通用的編程器可以快速大量地燒寫(xiě)芯片,適合大批量生產(chǎn),但芯片一旦焊到印制板上,這

種方法就不能用了。在系統編程(ISP)適合燒寫(xiě)已經(jīng)焊在印制板上的芯片,通常1次只能寫(xiě)1塊板子,但是不需要專(zhuān)用的設備,只要有1臺計算機和相應的連接電纜(如USB電纜)及配套軟件就可以工作,非常適合小批量生產(chǎn)和軟件升級。另外,通過(guò)ISP軟件提供的硬件寄存器讀/寫(xiě)和目標存儲器讀/寫(xiě)功能,還可以實(shí)現一定程度上的電路板測試和調試功能。

具體到AT91系列芯片可以借助芯片內固化的SAM-BA BOOT(見(jiàn)圖1)提供的支持,通過(guò)USB或調試串口燒寫(xiě)系統中的閃存,尤其是通過(guò)USB燒寫(xiě)十分方便快捷,燒寫(xiě)Linux核心映像到NANDFLASH只需要幾秒。對于A(yíng)T91SAM9261,使用這種編程方式需要滿(mǎn)足幾個(gè)條件:

  (1)AT91SAM9261的BMS引腳在復位期間保持高電平;

  (2)SPl0的CS0對應的芯片不存在,或者對應的芯片中不存在有效的啟動(dòng)代碼;

  (3)PC機與目標板之間通過(guò)串口或USB口連接;

  (4)PC機上安裝SAM-BA工具軟件。

PC機上的SAM-BA工具軟件可以支持對目標系統多種存儲器的讀/寫(xiě),默認情況下可以支持DATAFLASH,NANDFLASH、內部SRAM和外部SDRA-M。尤其是對DATAFLASH的支持非常不錯,可以自動(dòng)識別各種不同容量的芯片,寫(xiě)入速度也比較快。但是它對NANDFLASH的支持并不理想,對于某些NANDFLASH芯片,操作會(huì )失敗。對于NORFLASH,則根本不提供現成的支持。不過(guò)它提供了基于COM技術(shù)的動(dòng)態(tài)庫,并且公開(kāi)了編程接口,可以使用C/C++程序或TCL腳本控制燒寫(xiě)過(guò)程,對于不提供官方支持的芯片,可以自行編寫(xiě)代碼擴展的SAMBA的功能。以擴展NORFLASH編程功能為例,需要自行編寫(xiě)的有以下部分:

(1)下載到目標板上運行的ARM代碼。這部分程序在SAM-BA v2.4中稱(chēng)為monitor,在SAM-BA v2.8中稱(chēng)為applet,其實(shí)就是供芯片內固化的SAMBA B00T調用的功能擴展部分;

(2)PC機上的TCL腳本或C/C++程序。用于初始化硬件(如SDRAM控制器),向目標板下載mONitor/applet,以及傳送目標程序代碼和控制燒寫(xiě)過(guò)程。

如果使用TCL腳本,在相關(guān)腳本更改完成后,運行SAMBA工具軟件,會(huì )出現新添加的NORFLASH標簽頁(yè),如圖4所示。在擴展的各部分功能基礎之上,還可以編寫(xiě)一個(gè)綜合性的自動(dòng)化腳本,將所有的程序代碼及數據(如Bootstrap,U-Boot,U-Boot的環(huán)境變量、內核映像、各分區的文件系統映像等)一次性寫(xiě)入目標板上不同芯片內的各個(gè)指定地址,以簡(jiǎn)化編程操作,提高生產(chǎn)效率。

3 結語(yǔ)

閃存是目前嵌入式系統中廣泛應用的非易失存儲介質(zhì),具有可以重復寫(xiě)入和存儲容量大等優(yōu)點(diǎn),但是也存在寫(xiě)入次數有限,操作稍顯復雜和速度慢等缺陷。若使用不當,會(huì )引起性能和可靠性方面的問(wèn)題。通過(guò)深入分析現有閃存相關(guān)的硬件、軟件特點(diǎn),在系統中按需要采取具有針對性的應用方式,設計的系統在閃存應用方面獲得了較好的效果:系統啟動(dòng)時(shí)間較短,工作穩定,順利通過(guò)了高溫老化試驗及長(cháng)達數月的現場(chǎng)應用考驗。另外,采用自動(dòng)化腳本與監控程序結合的閃存燒寫(xiě)設計,不僅簡(jiǎn)化了生產(chǎn)過(guò)程,還提供了一定程度上硬件調試的支持。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程


c++相關(guān)文章:c++教程


路由器相關(guān)文章:路由器工作原理


路由器相關(guān)文章:路由器工作原理




關(guān)鍵詞: 應用 系統 Linux 嵌入式 存在

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>