在某些特定的工業(yè)應(yīng)用領(lǐng)域,,普通的操作系統(tǒng)并不適用,,需要采用實(shí)時(shí)操作系統(tǒng)。
目前,,已有許多實(shí)時(shí)操作系統(tǒng)如:VxWorks,、pSOS,、QNX,、Hard-Linux、WinCE等等,,其中美國(guó)Wind River System 公司的VxWorks是公認(rèn)的性能最出色的一種實(shí)時(shí)操作系統(tǒng),。這是一個(gè)運(yùn)行在目標(biāo)機(jī)上的高性能、可裁減的嵌入式實(shí)時(shí)操作系統(tǒng),。它的軟件開(kāi)發(fā)平臺(tái)是Tornado,。
本文以VxWorks操作系統(tǒng)為平臺(tái),以M-System公司的DOC2000(144M)為例,,說(shuō)明在VxWorks下如何驅(qū)動(dòng)并使用電子盤(pán)設(shè)備,。
1 系統(tǒng)結(jié)構(gòu)
DOC 系列的電子盤(pán)采用的都是TrueFFS(True Flash File System)。TrueFFS for Tornado II是Tornado II開(kāi)發(fā)環(huán)境中的一個(gè)集成的快速閃存文件系統(tǒng),,它是使用一系列的嵌入式閃存設(shè)備來(lái)實(shí)現(xiàn)快速可靠的物理存儲(chǔ)的,。通過(guò)VxWorks的TrueFFS仿真DOS文件系統(tǒng)下的硬盤(pán)驅(qū)動(dòng)器,開(kāi)發(fā)者可以使用標(biāo)準(zhǔn)的文件系統(tǒng)接口來(lái)產(chǎn)生和操作一個(gè)文件系統(tǒng),。這樣,,在閃存設(shè)備上進(jìn)行讀寫(xiě)操作就與在DOS文件系統(tǒng)設(shè)備上是一樣的了。因此,,對(duì)于電子盤(pán)驅(qū)動(dòng)的介紹就需要分為上層操作系統(tǒng)的文件系統(tǒng)和底層的驅(qū)動(dòng)器物理結(jié)構(gòu)實(shí)現(xiàn)兩部分,。
1.1 VxWorks中的文件系統(tǒng)
VxWorks是一種功能強(qiáng)大而且比較復(fù)雜的嵌入式操作系統(tǒng),包括了進(jìn)程管理,、存儲(chǔ)管理,、設(shè)備管理、文件系統(tǒng)管理,、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個(gè)部分,。VxWorks只占用了很小的存儲(chǔ)空間,并可高度裁減,,保證了系統(tǒng)能以較高的效率運(yùn)行,。
VxWorks提供的快速文件系統(tǒng)適合于實(shí)時(shí)系統(tǒng)應(yīng)用,。它包括幾種支持使用塊設(shè)備(如磁盤(pán))的本地文件系統(tǒng)。這些設(shè)備都使用一個(gè)標(biāo)準(zhǔn)的接口從而使得文件系統(tǒng)能夠被靈活地在設(shè)備驅(qū)動(dòng)程序上移植,。VxWorks也支持SCSI磁帶設(shè)備的本地文件系統(tǒng),。VxWorks支持四種文件系統(tǒng):dosFs、rt11Fs,、rawFs,、tapeFs。
VxWorks的I/O系統(tǒng)將普通數(shù)據(jù)文件,、外部設(shè)備都統(tǒng)一作為文件處理,。它們?cè)谟脩裘媲坝邢嗤恼Z(yǔ)法定義,使用相同的保護(hù)機(jī)制,。這樣既簡(jiǎn)化了系統(tǒng)設(shè)計(jì)又便于用戶使用,。VxWorks I/O 體系結(jié)構(gòu)甚至還支持在一個(gè)單獨(dú)的VxWorks系統(tǒng)上同時(shí)并存幾個(gè)不同的文件系統(tǒng)。VxWorks提供了一個(gè)快速靈活的與ANSI C 兼容的I/O 系統(tǒng),,包括:UNIX 標(biāo)準(zhǔn)的緩沖I/O,、POSIX 標(biāo)準(zhǔn)的異步I/O。VxWorks包括以下驅(qū)動(dòng)程序:網(wǎng)絡(luò)驅(qū)動(dòng),、管道驅(qū)動(dòng),、RAM 盤(pán)驅(qū)動(dòng)、SCSI驅(qū)動(dòng),、鍵盤(pán)驅(qū)動(dòng),、顯示驅(qū)動(dòng)、磁盤(pán)驅(qū)動(dòng),、并口驅(qū)動(dòng),。
VxWorks的所有機(jī)制和功能都是基于“C子程序”這種簡(jiǎn)單結(jié)構(gòu)的,即:VxWorks的所有功能都是由C程序庫(kù)提供的,。任何C程序都能夠從Tornado的命令和調(diào)試環(huán)境中交互式地調(diào)用,;任何C程序都能夠作為VxWorks的一個(gè)任務(wù)從Tornado主機(jī)工具或者應(yīng)用程序中產(chǎn)生,而且C程序能夠與中斷,、看門(mén)狗定時(shí)器或輔助定時(shí)器相連,。VxWorks的這種統(tǒng)一性使Tornado成為一種有效的開(kāi)發(fā)系統(tǒng)。因?yàn)橛脩舨槐卦倬帉?xiě)特殊的代碼來(lái)與系統(tǒng)陷阱接口,,也不需要進(jìn)行特殊的處理來(lái)建立一個(gè)任務(wù),,更不需要編寫(xiě)特殊的用戶接口程序或交互式的測(cè)試程序來(lái)測(cè)試新代碼,用戶只要編寫(xiě)子程序就能夠完成所有這些工作,。
VxWorks的特性為編寫(xiě)應(yīng)用程序和設(shè)備驅(qū)動(dòng)程序提供了極大的便利,。在VxWorks下,設(shè)備驅(qū)動(dòng)程序既可以嵌入內(nèi)核隨系統(tǒng)一起啟動(dòng),,也可以作為可加載模塊在系統(tǒng)啟動(dòng)之后運(yùn)行,,無(wú)論采用哪一種方式編寫(xiě)驅(qū)動(dòng)程序,,需要注意的一點(diǎn)就是:其使用不能依賴于還沒(méi)有啟動(dòng)的功能模塊(例如c庫(kù)函數(shù))或者未激活的設(shè)備。
1.2 電子盤(pán)
電子盤(pán)的內(nèi)部存儲(chǔ)介質(zhì)Flash是近年來(lái)發(fā)展最快的一種存儲(chǔ)芯片,,它具有EEPROM可擦寫(xiě)的特點(diǎn),,又同時(shí)具有EPROM 廉價(jià)的特點(diǎn),它是一種高性能,、低功耗,、電可擦除的存儲(chǔ)器件。電子盤(pán)由于上述特點(diǎn),,現(xiàn)已經(jīng)廣泛應(yīng)用于信息存儲(chǔ),、機(jī)頂盒、瘦客戶機(jī),、瘦主機(jī),、網(wǎng)絡(luò)計(jì)算機(jī)、以及嵌入式計(jì)算機(jī)等很多系統(tǒng),。
TrueFFS是M-System 公司開(kāi)發(fā)出來(lái)的可用于電子盤(pán)設(shè)備的專利技術(shù),。TrueFFS的基本功能就是磁盤(pán)仿真。它提供像DOC一樣的塊設(shè)備的接口,,從而方便了操作系統(tǒng)對(duì)電子盤(pán)設(shè)備的邏輯區(qū)的讀寫(xiě)。通過(guò)TrueFFS可以對(duì)電子盤(pán)進(jìn)行讀寫(xiě),、分區(qū),、格式化等一系列操作。通過(guò)對(duì)操作系統(tǒng)的l/O控制的調(diào)用,,就可以訪問(wèn)TrueFFS的外部接口,。電子盤(pán)設(shè)備的I/O控制并不局限于某一特定操作系統(tǒng),所以可以兼容多種操作系統(tǒng),。通常,,在操作系統(tǒng)下驅(qū)動(dòng)電子盤(pán)有以下兩步:
①調(diào)用操作系統(tǒng)的GetDriverHandle()函數(shù)得到驅(qū)動(dòng)器的句柄,。它的返回值是一個(gè)能夠供I/O控制函數(shù)調(diào)用的TrueFFS驅(qū)動(dòng)的描述符,。這一步依賴于操作系統(tǒng)的文件系統(tǒng)。
?、谡{(diào)用操作系統(tǒng)中文件系統(tǒng)的IOControl()函數(shù),。它將使TrueFFS具有其它文件系統(tǒng)的特性:
1)文件系統(tǒng)狀態(tài)。它的值可以指示操作指令是否成功的傳遞給了驅(qū)動(dòng)器或者驅(qū)動(dòng)器對(duì)于操作指令有無(wú)響應(yīng),,但它并不能確認(rèn)操作的結(jié)果或狀態(tài),。一個(gè)操作的結(jié)果或狀態(tài)是由輸入輸出控制包(IO Package)來(lái)傳遞的。它們使用的是TrueFFS的標(biāo)準(zhǔn)狀態(tài)碼,,這些狀態(tài)碼可以在IO控制的頭文件以及一些驅(qū)動(dòng)包文件中查到,。
2)文件系統(tǒng)IO控制,。它可以調(diào)用文件系統(tǒng)的擴(kuò)展功能。
3)輸入輸出請(qǐng)求包,。所有的TrueFFS擴(kuò)展功能都使用下列輸入輸出請(qǐng)求包,,它的定義格式如下:
irHandle(句柄)主要用于確認(rèn)一個(gè)操作究竟應(yīng)該作用于哪一個(gè)分區(qū)。如果只有一個(gè)驅(qū)動(dòng)器,,那么就不會(huì)出現(xiàn)沖突,,則句柄的值可以設(shè)置為0。驅(qū)動(dòng)器的句柄包含了物理驅(qū)動(dòng)數(shù)(LSB 0-3)和分區(qū)數(shù)(LBB 4-7),。由于Binary Partition和Disk Partition的句柄都可以從0開(kāi)始,。所以,Binary Partition和Disk Partition總是通過(guò)不同的句柄來(lái)訪問(wèn),,以免產(chǎn)生沖突,。
irFlags這個(gè)變量用來(lái)標(biāo)識(shí)擴(kuò)展功能的類型。每一個(gè)擴(kuò)展功能都有一個(gè)枚舉類型的代碼標(biāo)識(shí),。
irData包含了一個(gè)指向fllOctlRecond記錄的指針,。fllOctlRecond記錄包含了一些擴(kuò)展功能的輸入輸出記錄的指針。
DOC2000為M-System 公司DOC系列的第二代產(chǎn)品,,它為32腳DIP封裝,,具有體積小,封裝簡(jiǎn)單的特點(diǎn),,通過(guò)將DOC2000插入DOC2000插槽,,可以大量減少占用的物理空間。
如圖1所示,,DOC2000由系統(tǒng)接口單元(System Interface),、系統(tǒng)引導(dǎo)模塊(Boot Block)、錯(cuò)誤檢測(cè)與更正單元(EDC/ECC),,閃存控制單元(Flash Control)以及Flash存儲(chǔ)介質(zhì)組成,。其中系統(tǒng)接口單元為DOC2000提供一個(gè)類SRAM 接口,使之能通過(guò)CPU的本地總線,、ISA總線,、SRAM 總線、EEPROM 接口建立與操作系統(tǒng)的連接,。DOC提供片選信號(hào)(CE#),、讀寫(xiě)信號(hào)(WE#)、使能信號(hào)(OE#)以及13位寬的地址線(A[0:12])和8位寬的數(shù)據(jù)總線(D[0:7]),。每個(gè)DOC占用系統(tǒng)8K的地址空間,,通過(guò)地址窗的滑動(dòng)來(lái)訪問(wèn)整個(gè)DOC空間。系統(tǒng)引導(dǎo)模塊用來(lái)響應(yīng)PC機(jī)結(jié)構(gòu)中BIOS擴(kuò)展設(shè)備的搜索,。當(dāng)BIOS檢測(cè)到DOC2000為擴(kuò)展設(shè)備時(shí),,它可以執(zhí)行保存在系統(tǒng)引導(dǎo)模塊中的TrueFFS的驅(qū)動(dòng)程序,,通過(guò)系統(tǒng)調(diào)用TrueFFS格式轉(zhuǎn)換軟件,系統(tǒng)可以把DOC2000映射為普通的硬盤(pán)從而方便地進(jìn)行讀寫(xiě),。DOC2000的錯(cuò)誤檢測(cè)和更正模塊用來(lái)提供數(shù)據(jù)錯(cuò)誤的檢測(cè),、更正以及數(shù)據(jù)保護(hù)。Flash控制模塊主要用來(lái)完成TrueFFS地址與Flash介質(zhì)地址之間的轉(zhuǎn)換,、數(shù)據(jù)傳輸控制等功能,。
2 電子盤(pán)設(shè)備驅(qū)動(dòng)程序的基本結(jié)構(gòu)流程
在VxWorks下,設(shè)備驅(qū)動(dòng)程序既可以嵌入內(nèi)核隨系統(tǒng)一起啟動(dòng),,也可以作為可加載模塊在系統(tǒng)啟動(dòng)之后運(yùn)行,。
2.1可選加載方式
可選加載方式驅(qū)動(dòng)電子盤(pán)是一種比較常用的方式。它是把驅(qū)動(dòng)程序制作成一個(gè)可獨(dú)立運(yùn)行的應(yīng)用程序,,當(dāng)需要的時(shí)候可以選擇加載到用戶程序集中,。利用可選加載方式驅(qū)動(dòng)電子盤(pán)的第一步是要確定電子盤(pán)所占用的系統(tǒng)地址窗的范圍。一般主機(jī)板都給出了幾個(gè)可以選擇的范圍,,通過(guò)跳線可以設(shè)置電子盤(pán)的地址窗的起始,、結(jié)束地址。啟動(dòng)VxWorks下TrueFFS驅(qū)動(dòng)程序,,根據(jù)實(shí)際的地址將地址窗參數(shù)配置好,。第二步將TrueFFS映射成DOS文件系統(tǒng)。調(diào)用tffsMakeHandle()函數(shù)得到驅(qū)動(dòng)器的描述符,。將此描述符傳遞給驅(qū)動(dòng)器句柄,。然后定義一個(gè)塊設(shè)備的指針用于保存一個(gè)虛擬DOS文件系統(tǒng)分區(qū)的信息。調(diào)用tffsDevCreate()函數(shù)將剛才檢測(cè)到句柄的TrueFFS驅(qū)動(dòng)器映射成DOS文件系統(tǒng)分區(qū),,并將該函數(shù)的返回值傳遞給定義好的塊設(shè)備指針。至此,,就完成了TrueFFS到DOSFS的映射過(guò)程,。完成DOSFS設(shè)備初始化后,在Tornado的Shell環(huán)境下運(yùn)行devs命令就可以看到tffs設(shè)備已經(jīng)在系統(tǒng)設(shè)備列表中了,。第三步,,讀寫(xiě)電子盤(pán)上的文件。設(shè)置好要讀寫(xiě)的文件的文件名,、路徑,。利用標(biāo)準(zhǔn)C++的文件系統(tǒng)函數(shù)就可以方便的讀寫(xiě)文件了。
2.2嵌入系統(tǒng)方式
嵌入系統(tǒng)方式比可選加載方式要復(fù)雜,。它將驅(qū)動(dòng)程序嵌入系統(tǒng)內(nèi)核中,,這樣電子盤(pán)可以在系統(tǒng)啟動(dòng)的時(shí)候被驅(qū)動(dòng)。這種方式主要應(yīng)用于系統(tǒng)引導(dǎo)文件放在電子盤(pán)上的情況,。嵌入系統(tǒng)方式又分為X86機(jī)的嵌入方式和其它(如PowerPC,,MIPs等)嵌入方式,。這里以X86方式為例。
第一步修改目標(biāo)BSP目錄下的config.h文件,,增加電子盤(pán)設(shè)備的定義,,修改引導(dǎo)設(shè)備。第二步修改系統(tǒng)BSP目錄下的bootconfig.C文件,,將電子盤(pán)的驅(qū)動(dòng)程序加入,。第三步修改系統(tǒng)BSP目錄下的usrconfig.h文件,調(diào)用電子盤(pán)的驅(qū)動(dòng)程序,。
3 設(shè)備驅(qū)動(dòng)程序示例
下面給出DOC2000的可選加載方式的驅(qū)動(dòng)程序的框架代碼,,嵌入系統(tǒng)方式下的DOC2000的驅(qū)動(dòng)程序涉及VxWorks系統(tǒng)內(nèi)核,這里不作詳細(xì)敘述,。
3.1定義頭文件,、常量、全局變量
3.2 驅(qū)動(dòng)電子盤(pán)并將TrueFFS映射為DOSFS
3.3 電子盤(pán)文件的讀寫(xiě)