基于VxWorks的FLASH存儲器實(shí)時(shí)存取管理方案
cdma2000 1x移動(dòng)通信系統的基站主處理機采用WindRiver公司VxWorks嵌入式實(shí)時(shí)操作系統,選用FLASH存儲器(以下簡(jiǎn)稱(chēng)FLASH)作為外部存儲設備保存系統數和業(yè)務(wù)數據。
FLASH與普通磁介質(zhì)存儲器最大的差異在于寫(xiě)操作方式不同,其寫(xiě)操作相對于普通磁盤(pán)比較慢的過(guò)程,消耗掉大量的CPU資源。FLASH基于命令字的寫(xiě)操作方式導致的寫(xiě)入錯誤,雖然幾率很小但實(shí)際上是存在的。而商用VxWorks操作系統提供的dosFs文件系統和專(zhuān)用TrueFFS文件系統對該情況處理不足,并且用戶(hù)沒(méi)有相應的源碼,系統一旦出現寫(xiě)操作錯誤,將不可控制,降低了系統的可控性。所以,有必要對FLASH的存取操作加以改進(jìn)或控制,并設計一套相對應的專(zhuān)用FLASH文件管理方案,滿(mǎn)足系統可控性的要求。
2. 存取
FLASH寫(xiě)操作基于命令字方式完成,分為擦除(erase)和編程(program)兩個(gè)階段。由于FLASH的編程指令只能使“1”改為“0”,擦除指令只能使“0”改為“1”,而且,擦除操作不能在字節或任意數據區域進(jìn)行,而必須是一個(gè)完整的扇區,所以向FLASH某位置寫(xiě)入數據時(shí),要先擦除目標位置所在扇區的所有數據,然后才能進(jìn)行編程操作。實(shí)際上,只須向特定的寄存器寫(xiě)入標準的指令序列,具體的擦除和編程過(guò)程就可由內部嵌入的算法執行。
2.1 設計思想
通常,FLASH寫(xiě)操作指令下達后,由驅動(dòng)程序完成命令字的設置。此時(shí),數據被臨時(shí)存儲于FLASH的鎖存器中,但系統仍需要保持數據總線(xiàn)直到寫(xiě)入操作終止或完成才釋放。一個(gè)扇區的擦除是十幾毫秒的時(shí)間,一個(gè)字節的寫(xiě)入是幾微秒的時(shí)間,可以看到,數據總線(xiàn)的占用過(guò)程消耗了大量的CPU時(shí)間。這部分資源的節約對于嵌入式實(shí)時(shí)系統來(lái)說(shuō)是必要的。操作系統完全可以在設置寫(xiě)操作命令字后釋放數據總線(xiàn),退出FLASH操作,把擦除/編程過(guò)程的CPU時(shí)間用來(lái)執行其他指令,等當前命令字執行完畢后,通過(guò)某個(gè)事件的觸發(fā),使CPU跳轉回來(lái)設置下一個(gè)命令字。這就是改進(jìn)FLASH操作過(guò)程的設計思想。
2.2 實(shí)現過(guò)程
觸發(fā)事件選擇和跳轉周期短的控制是問(wèn)題解決的關(guān)鍵,即在一個(gè)命令字操作完成后,選用什么方式來(lái)觸發(fā)下一個(gè)命令字操作??梢钥紤]的方式主要有掃描方式和中斷方式。
通過(guò)掃描方式,當應用程序完成一次完整的處理周期時(shí),掃描某個(gè)標志狀態(tài),判斷FLASH寫(xiě)入操作是否進(jìn)行完成。如果完成,則再次設置命令字進(jìn)行操作。由于程序處理周期取決于應用層業(yè)務(wù)處理時(shí)間,這種方式會(huì )導致觸發(fā)周期不固定。
采用中斷方式,可以通過(guò)設置中斷頻率來(lái)控制觸發(fā)周期。但必須選擇合適的中斷源,使其精度達到要求并且對系統沒(méi)有額外的影響。由于基站系統采用外部GPS時(shí)鐘,系統的單板時(shí)鐘閑置,其精度對于FLASH操作是足夠的,所以可以考慮選擇CPU時(shí)鐘中斷。問(wèn)題在于VxWorks對該中斷是否有使用。實(shí)際上,VxWorks通過(guò)該時(shí)鐘中斷完成系統記數器,從而在其基礎上實(shí)現系統定時(shí)器,看門(mén)狗定時(shí)器,任務(wù)分時(shí)調度等功能組件。因此,接管時(shí)鐘中斷,必須在修改時(shí)鐘頻率同時(shí),保證操作系統所需的系統記數器頻率不變。
VxWorks提供sysClkConnect()函數允許時(shí)鐘中斷發(fā)生時(shí),根據指定參數掛接用戶(hù)定義的中斷處理程序,中斷處理完成后由用戶(hù)程序返回。VxWorks提供的usrClock()函數是系統缺省時(shí)鐘中斷處理函數,用來(lái)調用計數器函數tickAnnounce(),實(shí)現系統計數器的作用。時(shí)鐘中斷頻率由SYS_CLK_RATE設定,缺省值是60。因此,我們在替換時(shí)鐘中斷處理函數時(shí),需要包含操作系統的記數器函數tickAnnounce(),并通過(guò)分頻的方法保證tickAnnounce()的調用和時(shí)鐘頻率修改前的調用頻率是一致的,從而使操作系統計數器感覺(jué)不到時(shí)鐘頻率修改和中斷處理函數被替換的區別。
當然,系統時(shí)鐘頻率的設置不能太高,通常時(shí)鐘頻率設置為60HZ(或100HZ),當頻率超過(guò)600HZ時(shí),會(huì )使內核調度用時(shí)比率偏高,而實(shí)際任務(wù)可用的CPU時(shí)間下降,處理器將花費大多數時(shí)間來(lái)處理時(shí)鐘而使系統運行效率下降或不可用。
圖1給出了具體的實(shí)現流程圖。sysClkChange()是自定義的系統時(shí)鐘頻率調整控制函數,該函數根據入口參數設置系統時(shí)鐘中斷頻率,選擇掛接中斷的處理函數flsClock()或usrClock()。自定義的中斷處理函數的flsClock()通過(guò)調用usrClock()函數完成系統計數器功能。sysClkRateGet()和sysClkRateSet()函數是VxWorks提供的時(shí)鐘頻率設置函數。
flsClock()還需要負責實(shí)際的寫(xiě)入操作。首先檢查上一次中斷處理中的FLASH操作是否已經(jīng)完成。如果沒(méi)有 完成,則返回,并記錄返回次數,若返回次數超過(guò)了一定限度,即認為該片FLASH發(fā)生故障,向應用層發(fā)出FLASH故障告警;如果已經(jīng)完成,則開(kāi)始進(jìn)行本次操作,即先確定操作的類(lèi)型(擦除還是編程)和相關(guān)參數(包括目標扇區序號,目的地址,數據源地址等等),然后調用驅動(dòng)程序提供的FLASH操作接口,完成命令字設置等操作。
3. 管理設計
在I/O系統基本結構中,應用程序可以通過(guò)符合標準I/O接口的文件系統調用設備驅動(dòng)程序來(lái)操作設備,也可以直接與驅動(dòng)程序連接來(lái)操作設備(VxWorks本身并不支持這種做法)。通常,采用文件系統來(lái)操作存取設備的方式,減少了驅動(dòng)程序必須支持的I/O操作接口函數的數目,在VxWorks開(kāi)發(fā)中得到廣泛的應用。
VxWorks提供與MS-DOS兼容的dosFs文件系統供I/O接口調用,但dosFs文件系統本質(zhì)上容易受到某種類(lèi)型磁盤(pán)故障的影響,導致更新過(guò)程中數據結構不一致性,而且,dosFs文件系統是一個(gè)不考慮容錯性能的文件系統,沒(méi)有考慮FLASH操作的特殊性,對于底層驅動(dòng)程序中FLASH命令字方式導致的寫(xiě)入錯誤無(wú)法處理。作為VxWorks的可選組件,M-System公司為VxWorks定制的TrueFFS組件提供了面向FLASH的專(zhuān)用文件系統。
TrueFFS文件系統使用block-to-flash轉換系統將閃存抽象為普通塊設備?;趧?dòng)態(tài)維護的映射圖使FLASH索引成一系列連續塊。進(jìn)行數據寫(xiě)入時(shí),如果目標塊已寫(xiě)有數據,TrueFFS另找空閑區寫(xiě)入,待數據安全寫(xiě)入后,TrueFFS更新映射圖,將該塊指向寫(xiě)入的新FLASH地址。TrueFFS文件系統機制非常完善,但基站系統對FLASH功能要求比較單一,存儲的數據文件類(lèi)型和存儲方式相對單一,TrueFFS文件系統并不能發(fā)揮其強大功能,反而降低了系統的性能。
3.1 設計思想
參考dosFs文件系統和TrueFFS文件系統的管理方法,選取其中重要功能重新設計,實(shí)現一個(gè)應用層可控的FLASH管理方案。把FLASH劃分為管理區和數據區兩部分進(jìn)行組織管理。其中管理區存放文件管理信息,數據區存放數據文件。為了防止在修改管理區的過(guò)程中掉電,在存儲區的兩端設置雙備份的管理區。
我們將FLASH最小管理單位定義為一個(gè)FLASH扇區(塊)。進(jìn)行FLASH操作之前,先將目標扇區內容備份到內存,在內存中修改完畢后再固化到FLASH。管理區和數據區占用的空間是扇區的整數倍,這樣才不會(huì )在更新某些數據的同時(shí),造成對已有數據的修改。對于比較小的文件,可能小于一個(gè)扇區的空間,導致FLASH空間的浪費,但避免了因為共享同一扇區造成不同文件操作之間的相互影響,降低數據被破壞的可能性,簡(jiǎn)化管理策略。
3.2 實(shí)現過(guò)程
根據文件管理方案,假定用戶(hù)可修改的FLASH塊數為512,其中前后兩個(gè)管理區占用64塊,數據區可用448塊。FLASH管理區需要包含的內容如表1所示。
任何時(shí)刻,處于活動(dòng)狀態(tài)的管理區只有一個(gè)。在更新數據的時(shí)候,首先更新處于活動(dòng)狀態(tài)的管理區,然后寫(xiě)入數據文件,等待寫(xiě)入穩定后,更新另一個(gè)管理區,然后將另一個(gè)管理區置為當前活動(dòng)狀態(tài),原先管理區置為非活動(dòng)狀態(tài)。這樣可以保證在數據文件寫(xiě)入失敗時(shí),通過(guò)兩個(gè)管理區管理信息的一致性來(lái)識別數據的有效性。
FLASH塊列表的每個(gè)字節對應一個(gè)扇區的占用情況,1表示該扇區已分配,0表示該扇區未分配,0xff表示該扇區壞死,不能使用。
文件信息記錄位置按照系統配置好的處理機數目采用固定順序存放。更新任何一個(gè)數據文件之前,要更新該文件的信息記錄,確定該文件操作狀態(tài),版本信息和存放位置。具體的組織結構如表2所示。
系統需要從FLASH讀取數據時(shí),首先比較 兩個(gè)FLASH管理區管理信息是否一致。如果一致,認為數據有效,直接讀??;如果不一致,則說(shuō)明存在FLASH操作異常,向系統操作維護控制臺(OMC)告警,并通知應用程序請求向OMC下載寫(xiě)入新的數據文件。當需要刪除FLASH上數據文件時(shí),只需將管理區中該文件操作狀態(tài)置成“無(wú)效”,并將其占用的扇區置成“未分配”狀態(tài),然后更新FLASH管理區信息即可。
這里沒(méi)有給出碎片收集和垃圾數據處理的機制,實(shí)際上,刪除操作所實(shí)現的功能即有回收垃圾數據所在扇區的作用,并且由應用層控制,實(shí)現了系統可控性。對于FLASH中存在的碎片,由于我們采取的是以扇區為單元進(jìn)行數據管理的,數據文件的存儲空間是整數塊,而且塊列表可以不連續,所以不存在碎片的問(wèn)題,從而就巧妙的避免了碎片收集的復雜性。
4. 總結
本文介紹的FLASH操作方法以及與之配套的文件管理方案,為系統運行節省了可觀(guān)的時(shí)間,可以很好的解決了業(yè)務(wù)運行與數據備份之間對系統資源占用的矛盾,對于FLASH操作相對頻繁和數據備份實(shí)時(shí)性要求較高的系統,都是適用的。
評論