余松濤,俞大磊
(中國航空工業(yè)西安航空計算技術(shù)研究所10室,陜西 西安710119)
鐵電存儲技術(shù)于1921年被提出,1993年,美國Ramtron公司推出了商用鐵電存儲器,其具有快速寫入、高耐久性和低功耗的特點,常被用于存儲設(shè)置、配置、期間狀態(tài)和日后使用的數(shù)據(jù),適用于嵌入式系統(tǒng)中。隨著現(xiàn)代工藝的進步,目前已有單片8 Mbit的產(chǎn)品出現(xiàn),所能存儲數(shù)據(jù)量日益增大。對其中存儲的數(shù)據(jù)的管理和使用逐漸復(fù)雜,因此需要提出一個簡明合理的應(yīng)用方法來解決此問題。
將鐵電存儲器視為一個電子盤,采用文件讀寫的方法較符合日常的編程習(xí)慣,其使用的靈活性也是通過實踐公認的。例如Unix族操作系統(tǒng),其大量的功能就是基于文件系統(tǒng)。但嵌入式系統(tǒng)有其實現(xiàn)上的特殊性,主要表現(xiàn)在突然的斷電動作。此動作一旦發(fā)生在文件系統(tǒng)寫入過程中,將造成文件數(shù)據(jù)丟失,嚴重的會導(dǎo)致整個文件系統(tǒng)損壞。而事務(wù)型文件系統(tǒng)Reliance Nitro可較好地解決這一問題。
鐵電存儲器F-RAM利用鐵電晶體的鐵電效應(yīng)實現(xiàn)數(shù)據(jù)存儲。鐵電效應(yīng)是指在其晶體上施加一定的電場時,晶體中心原子在電場的作用下移動,并達到一種穩(wěn)定狀態(tài);當(dāng)電場從晶體移走時,中心原子將保持在原來的位置。由于晶體的中間層是一個高能階,中心原子在未獲得外部能量時無法越過高能階到達另一穩(wěn)定狀態(tài),因此F-RAM保持數(shù)據(jù)無需電壓和與SDRAM類似的周期刷新。而存儲的數(shù)據(jù)掉電后依然存在,并不受外界磁場條件的影響。其特點是讀寫速度快、功耗低。但由于鐵電晶體的固有限制,對數(shù)據(jù)存儲位的寫入或檢測均會引起存儲數(shù)據(jù)位的變動,需增加一次內(nèi)部的寫操作,因此鐵電存儲器存在最大讀寫次數(shù)的限制,RAMTRON公司給出的最大訪問次數(shù)是1014次。
由于讀寫次數(shù)的限制和時序的不同,F(xiàn)-RAM不能用于直接替換SRAM和SDRAM器件,只適合替換Flash和EEPROM器件。目前并行Flash單片容量已達到1 Gbit,遠大于F-RAM,直接替換大容量的Flash芯片在經(jīng)濟上是不可行的。F-RAM適合用于對體積和功耗敏感且所提供的容量可滿足要求的嵌入式系統(tǒng)。
在應(yīng)用程序編寫中,可直接將F-RAM作為普通存儲器使用,存儲變量、數(shù)組、鏈表及樹等數(shù)據(jù)結(jié)構(gòu)。但嵌入式系統(tǒng)特定的突然下電問題解決上較為困難。在編程時要考慮存儲數(shù)據(jù)的合法性和一致性等問題。需利用較多算法和編程技巧來解決此問題,比如對數(shù)據(jù)進行CRC32數(shù)字簽名,對數(shù)據(jù)的改寫采用事務(wù)機制來保持數(shù)據(jù)的一致性。這些算法對編程水平要求較高,對只需存儲/讀取數(shù)據(jù)參數(shù)等應(yīng)用而言實現(xiàn)復(fù)雜,缺乏一致的使用界面,使得大數(shù)據(jù)量的存儲與管理困難。雖然鐵電存儲器最大訪問次數(shù)可達1014次,但訪問周期可達到120 ns,若將其作為普通內(nèi)存使用,在最差情況下,只能提供120 ns×1014=3 333 h,約139天的訪問壽命,不適用于連續(xù)長時間運行的嵌入式系統(tǒng)。數(shù)據(jù)訪問的聚集性使有些存儲單元的訪問次數(shù)遠大于其他單元,將造成器件磨損不均衡。
Vxworks自帶的TrueFFS文件系統(tǒng)是一種MSystems Flite的實現(xiàn)方式,可多種Flash存儲設(shè)備提供統(tǒng)一的塊設(shè)備接口,具有可重入及線程安全的特點。圖1是TrueFFS的體系結(jié)構(gòu)圖。
圖1 TrueFFS體系結(jié)構(gòu)
核心層主要起到連接其他層的作用。同時也可進行碎片回收、定時器以及其他系統(tǒng)資源的維護。翻譯層主要實現(xiàn)從文件系統(tǒng)角度所看到的存儲塊與Flash可擦除塊間的映射。MTD層實現(xiàn)對具體的Flash進行讀、寫擦除等功能,需要開發(fā)者根據(jù)自身的實際硬件按照標準的接口格式編寫驅(qū)動。Socket層提供TrueFFS和板載硬件之間的接口服務(wù),可用于能源管理、硬件卡檢測、窗口映射管理和向系統(tǒng)注冊設(shè)備。TrueFFS具有損耗均衡的功能,確保每個可擦除塊被平均使用[1]。在Vxworks5.X中,TrueFFS僅支持MS-DOS兼容的文件系統(tǒng)[2]。一旦在寫入數(shù)據(jù)時突然斷電,將造成數(shù)據(jù)丟失、目錄結(jié)構(gòu)破壞甚至整個文件系統(tǒng)結(jié)構(gòu)損壞,甚至出現(xiàn)chkdsk無法恢復(fù),只能重新格式化電子盤[3]。
Reliance Nitro事務(wù)型文件系統(tǒng)是保證在斷電環(huán)境下仍可正常工作的可靠文件系統(tǒng)[4]。其跟蹤文件系統(tǒng)最終的穩(wěn)定狀態(tài),包括目錄數(shù)據(jù)和用戶數(shù)據(jù),在用戶設(shè)定的事務(wù)點上將內(nèi)存中的數(shù)據(jù)更新到磁盤上,當(dāng)系統(tǒng)在兩個事務(wù)點間發(fā)生斷電時,Reliance Nitro將文件數(shù)據(jù)還原至文件系統(tǒng)最后的穩(wěn)定狀態(tài)。由于Reliance Nitro文件系統(tǒng)始終一致,所以設(shè)備通電啟動時無需運行類似chkdsk等應(yīng)用程序檢查文件系統(tǒng)的完整性,這使得Reliance Nitro可提供比DosFS等文件系統(tǒng)更快的啟動時間[4]。在嵌入式環(huán)境下,其可通過FlashFX Tera對Vxworks實時操作系統(tǒng)中的NAND和NOR Flash存儲器提供支持。也可通過TrueFFS文件系統(tǒng)支持NAND和NOR Flash存儲器[5]。VXworks6.8中包含的TrueFFS已直接支持Reliance Nitro文件系統(tǒng)。
基于鐵電存儲器的事務(wù)文件系統(tǒng)軟件體系結(jié)構(gòu)如圖2所示。其主要技術(shù)特點是擴充了TrueFFS的MTD驅(qū)動,使其能夠支持鐵電存儲器。
圖2 基于鐵電存儲器的事務(wù)型文件系統(tǒng)體系結(jié)構(gòu)
鐵電存儲器底層驅(qū)動主要提供對存儲器的擦除/寫入等操作,修改后的代碼仿真了NOR Flash芯片的塊擦除與寫入動作。
擦除函數(shù)實現(xiàn)了塊擦除功能,針對NOR Flash芯片,此函數(shù)的動作是針對所需擦除的物理塊發(fā)出擦除命令序列,然后讀取芯片狀態(tài),判斷是否完成。對于S29GL256P芯片,擦除一塊的典型時間為500 ms。針對鐵電存儲器,此動作改為將所需擦出的數(shù)據(jù)塊全部填充為0xffffffff,典型時間為120 ns×65 536,約7.9 ms。
寫入函數(shù)實現(xiàn)了數(shù)據(jù)記錄功能,針對NOR Flash芯片,此函數(shù)的動作是針對所需擦除的物理塊發(fā)出編程命令序列,向目標地址寫入數(shù)據(jù),隨后讀取芯片狀態(tài),判斷是否完成,對于S29GL256P芯片而言,寫入一個32位字的典型時間為60μs,若采用緩沖寫入方式,平均每個32位字的典型時間為15μs。針對鐵電存儲器,此動作改為直接賦值,典型時間為120 ns。
為使TrueFFS支持鐵電存儲器,需擴充TrueFFS的MTD驅(qū)動[6-8]??紤]到鐵電存儲器的操作方式接近于并行的NOR Flash芯片,可將鐵電存儲器仿真并行的NOR Flash芯片的使用方式,將鐵電存儲器分成塊,每塊256 kByte進行管理。所采用的鐵電存儲器為Ramtron公司生產(chǎn)的FM32MLD16 512×103×16 Byte,其單片容量為8 Mbit。在設(shè)計中,兩片并聯(lián),提供了32位寬度,2 MB容量。針對采用的芯片,應(yīng)修改TrueFFS文件系統(tǒng)中的MTD識別函數(shù),將片容量改為1 MB。
TrueFFS在原始設(shè)計中只支持Flash類芯片,在初始化設(shè)備過程中會判斷目標地址的行為是否為RAM。作為鐵電存儲器,其行為類似于RAM,因此TrueFFS進行判斷后即不再繼續(xù)進行初始化。必須修改TrueFFS的核心代碼,使鐵電存儲器芯片能仿真NOR Flash芯片。修改TrueFFS核心代碼中的flFlash.c文件,將其中函數(shù)static FLBoolean isRAM(FLFlash vol)的返回值改為恒假。重新編譯生成后的驅(qū)動庫即可支持鐵電存儲器。
Reliance Nitro事務(wù)型文件系統(tǒng)為Vxworks提供了標準的文件系統(tǒng)設(shè)備接口,從應(yīng)用程序的角度看,可通過設(shè)備名使用Vxworks提供的所有文件系統(tǒng)調(diào)用。Vxworks提供的文件系統(tǒng)API包含POSIX標準規(guī)定文件系統(tǒng)操作的大部分,已實現(xiàn)的API接口及其功能嚴格遵循POSIX標準。通過該接口,用戶只需關(guān)心文件名和文件對象屬性,無需了解底層實現(xiàn)細節(jié)。由于Vxworks是一個多任務(wù)實時操作系統(tǒng),可同時運行多個用戶任務(wù),因此,文件系統(tǒng)提供了多任務(wù)的支持,所提供的API均可被同時調(diào)用,滿足代碼可重入要求。Vxworks提供了有緩沖的文件操作API,包括:fopen()fclose()fread()fwrite()等文件操作函數(shù)。同時還提供了基礎(chǔ)I/O API。基礎(chǔ)I/O是Vxworks最底層的I/O操作,是源代碼級兼容的,其包括:creat()delete()open()close()read()write()ioctl()等文件操作函數(shù)。可用于實現(xiàn)創(chuàng)建、刪除、打開、關(guān)閉、讀取、寫入及文件特殊控制等編程接口。
所有對文件操作均是事務(wù)化的,Reliance Nitro提供了3種不同的事務(wù)機制模式:(1)自動事務(wù)模式:自動事務(wù)模式依賴于文件系統(tǒng)操作。例如:Reliance Nitro可被設(shè)置為當(dāng)一個文件被關(guān)閉時執(zhí)行事務(wù),對數(shù)據(jù)進行實際的寫入動作,將數(shù)據(jù)真正穩(wěn)妥地記錄入電子盤。自動事務(wù)模式適用于遺留的應(yīng)用代碼,在應(yīng)用中并不了解底層的文件系統(tǒng)提供事務(wù)操作能力。在實際中發(fā)現(xiàn),對Vxworks提供基礎(chǔ)I/O的每一次調(diào)用均會引起自動事務(wù)操作,而有緩沖的文件操作API在調(diào)用fclose或fflush時才進行事務(wù)操作。(2)定時事務(wù)模式:是按照預(yù)先定義的時間周期執(zhí)行事務(wù)。比如周期可定義為200 ms,這保證只丟失本周期內(nèi)的數(shù)據(jù),適用于數(shù)據(jù)記錄功能。(3)可編程事務(wù)模式:可編程事務(wù)模式是在應(yīng)用程序控制下執(zhí)行的。當(dāng)應(yīng)用程序進入一個里程碑點,其確切要求將特定的數(shù)據(jù)寫入電子盤中,并可強制進行一次立刻的事務(wù)操作,確保數(shù)據(jù)正確寫入。可編程事務(wù)模式是最靈活的應(yīng)用方式,它提供了強有力的功能。在應(yīng)用程序中,可以使能/禁止自動事務(wù)模式和周期事務(wù)模式。同時改變周期事務(wù)模式的周期,發(fā)起立刻事務(wù)操作。以上3種事務(wù)操作模式不是互斥的,應(yīng)用程序可根據(jù)要求同時混合使用。
應(yīng)用程序可調(diào)用usrRelFsTFFSInit()函數(shù)創(chuàng)建Reliance Nitro文件系統(tǒng)。其參數(shù)有:Int tffsDriveNo TFFS為盤號,一般為0。int fRemovable為是否可拆除,0表示固定盤,1表示可拆除。char*szDevName是設(shè)備名稱,一般為”/RELFS0”。int fFormat為是否要格式化,1表示需要,0表示不需要。返回值為ERROR表示未成功,返回值為OK表示成功。
在usrRelFsTFFSInit()函數(shù)中,按照以下步驟完成文件系統(tǒng)創(chuàng)建工作:(1)調(diào)用tffsDevCreate(),初始化TrueFFS文件系統(tǒng),創(chuàng)建TrueFFS設(shè)備。(2)調(diào)用tffsDevOptionsSet(),禁止TrueFFS設(shè)備的FAT監(jiān)視功能,直接將Reliance Nitro文件系統(tǒng)的扇區(qū)映射到TrueFFS塊設(shè)備驅(qū)動程序。(3)調(diào)用discardWrapperTFFSDevCreate(),在TrueFFS塊設(shè)備上創(chuàng)建Reliance Nitro的驅(qū)動實例,使Reliance將不使用的塊直接報告給TrueFFS塊設(shè)備驅(qū)動程序,用于提高性能。(4)調(diào)用relFsDevCreate(),創(chuàng)建Reliance Nitro電子盤實例。(5)如需要,調(diào)用relFsVolFormat(),格式化Reliance Nitro電子盤。
例如,應(yīng)用程序調(diào)用usrRelFsTFFSInit(0,0,"/RELFS0",1),創(chuàng)建并格式化電子盤,一旦執(zhí)行成功,應(yīng)用程序會顯示如圖3 Reliance Nitro初始化成功提示的內(nèi)容。在tornado的shell下用devs命令可看到/RELFS0設(shè)備,即可對其上的文件進行操作。
圖3 Reliance Nitro初始化成功提示
使用上述軟件,在兩片S29GL256P芯片組成的32位電子盤上和兩片F(xiàn)M32MLD1芯片組成的32位電子盤上均實現(xiàn)了Reliance文件系統(tǒng)。經(jīng)實測,兩片S29GL256P芯片組成的32位電子盤,其最快的文件寫入速度為300 kByte/s,兩片F(xiàn)M32MLD1芯片組成的32位電子盤,其最快的文件寫入速度為7 952 kB/s,有26倍的差距。模擬在寫入過程中突然下電,上電后文件系統(tǒng)和文件內(nèi)容均正確,無需進行任何檢測工作。具體性能對比結(jié)果如表1所示。
表1 兩種架構(gòu)性能對比
通常認為鐵電存儲器可直接做為普通內(nèi)存使用,在廠商提供的器件介紹中也有說明[9]。但應(yīng)該注意到,對于需連續(xù)長時間運行的嵌入式系統(tǒng),須仔細考慮器件磨損問題。文中將TrueFFS中的適用于Flash芯片的磨損均衡算法應(yīng)用到鐵電存儲器上,可保證寫入操作的磨損均衡。按照文件接口方式訪問鐵電存儲器,確保不會出現(xiàn)集中對一個數(shù)據(jù)單元進行讀寫的最壞情形。這可大幅增加鐵電存儲器的使用壽命。采用事務(wù)型文件系統(tǒng),使得數(shù)據(jù)存儲不受突然斷電的影響,無需在重啟時進行磁盤檢測,降低了應(yīng)用程序編寫難度,加快了重啟時間??紤]到兩種芯片的寫入速度相差125倍、讀出速度相等的性能差距,文件的寫入速度只差26倍。說明使用鐵電存儲器仿真Flash的算法功能可以達到要求,但性能低下。在進一步研究鐵電存儲器專用的磨損均衡算法,使其不通過TrueFFS層直接和Reliance Nitro事務(wù)型文件系統(tǒng)進行交互,能顯著提高讀寫性能。
[1]Spansion Conpration.Wear leveling[EB/OL].(2011-08-25)[2013-01-27]http://www.spansion.com.
[2]Windriver Conpration.VxWorks programmer's guide 5.5[EB/OL].(2011-06-07)[2013-01-27]http://www.windriver.com.
[3]Microsoft Conpration.FAT:genetal overview of on-disk format version 1.02[EB/OL].(2010-02-19)[2013-01-27]http://www.microsoft.com.
[4] 楊瓊,崔西寧,周波.事務(wù)性文件系統(tǒng)存儲管理機制的研究與實現(xiàn)[J].航空電子技術(shù),2011,41(5):81-84.
[5]Datalight Conpration.Datalight reliance nitro SDK for wind river VxWorks[EB/OL].(2012-03-27)[2013-01-27]http://www.datalight.com.
[6] 王學(xué)龍.嵌入式Vxworks系統(tǒng)開發(fā)與應(yīng)用[M].北京:人民郵電出版社,2003.
[7] 張楊,于銀濤.Vxworks內(nèi)核、設(shè)備驅(qū)動與BSP開發(fā)詳解[M].北京:人民郵電出版社,2011.
[8] 周啟平,張楊.Vxworks下設(shè)備驅(qū)動程序及BSP開發(fā)指南[M].北京:中國電力出版社,2004.
[9]TI Conpration.LOw-power FRAM microcontrollers and their application[EB/OL].(2012-09-18)[2013-01-27]http://www.ti.com.