新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 學(xué)習(xí)方法與實踐 > 實時操作系統(tǒng)VxWorks下電子盤驅(qū)動程序的開發(fā)

實時操作系統(tǒng)VxWorks下電子盤驅(qū)動程序的開發(fā)

作者:程臻 盛翊智 郝智泉 時間:2008-03-20 來源:工業(yè)控制計算機 收藏

 

本文引用地址:http://butianyuan.cn/article/80349.htm

       在某些特定的工業(yè)應(yīng)用領(lǐng)域,普通的操作系統(tǒng)并不適用,需要采用實時操作系統(tǒng)。

       目前,已有許多實時操作系統(tǒng)如:VxWorks、pSOS、QNX、Hard-Linux、WinCE等等,其中美國Wind River System 公司的VxWorks是公認的性能最出色的一種實時操作系統(tǒng)。這是一個運行在目標(biāo)機上的高性能、可裁減的嵌入式實時操作系統(tǒng)。它的軟件開發(fā)平臺是Tornado。
   

      本文以VxWorks操作系統(tǒng)為平臺,以M-System公司的DOC2000(144M)為例,說明在VxWorks下如何驅(qū)動并使用電子盤設(shè)備。

       1 系統(tǒng)結(jié)構(gòu)
   

       DOC 系列的電子盤采用的都是TrueFFS(True Flash File System)。TrueFFS for Tornado II是Tornado II開發(fā)環(huán)境中的一個集成的快速閃存文件系統(tǒng),它是使用一系列的嵌入式閃存設(shè)備來實現(xiàn)快速可靠的物理存儲的。通過VxWorks的TrueFFS仿真DOS文件系統(tǒng)下的硬盤驅(qū)動器,開發(fā)者可以使用標(biāo)準的文件系統(tǒng)接口來產(chǎn)生和操作一個文件系統(tǒng)。這樣,在閃存設(shè)備上進行讀寫操作就與在DOS文件系統(tǒng)設(shè)備上是一樣的了。因此,對于電子盤驅(qū)動的介紹就需要分為上層操作系統(tǒng)的文件系統(tǒng)和底層的驅(qū)動器物理結(jié)構(gòu)實現(xiàn)兩部分。

     1.1 VxWorks中的文件系統(tǒng)
   

       VxWorks是一種功能強大而且比較復(fù)雜的嵌入式操作系統(tǒng),包括了進程管理、存儲管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個部分。VxWorks只占用了很小的存儲空間,并可高度裁減,保證了系統(tǒng)能以較高的效率運行。
   

       VxWorks提供的快速文件系統(tǒng)適合于實時系統(tǒng)應(yīng)用。它包括幾種支持使用塊設(shè)備(如磁盤)的本地文件系統(tǒng)。這些設(shè)備都使用一個標(biāo)準的接口從而使得文件系統(tǒng)能夠被靈活地在設(shè)備驅(qū)動程序上移植。VxWorks也支持SCSI磁帶設(shè)備的本地文件系統(tǒng)。VxWorks支持四種文件系統(tǒng):dosFs、rt11Fs、rawFs、tapeFs。
   

       VxWorks的I/O系統(tǒng)將普通數(shù)據(jù)文件、外部設(shè)備都統(tǒng)一作為文件處理。它們在用戶面前有相同的語法定義,使用相同的保護機制。這樣既簡化了系統(tǒng)設(shè)計又便于用戶使用。VxWorks I/O 體系結(jié)構(gòu)甚至還支持在一個單獨的VxWorks系統(tǒng)上同時并存幾個不同的文件系統(tǒng)。VxWorks提供了一個快速靈活的與ANSI C 兼容的I/O 系統(tǒng),包括:UNIX 標(biāo)準的緩沖I/O、POSIX 標(biāo)準的異步I/O。VxWorks包括以下驅(qū)動程序:網(wǎng)絡(luò)驅(qū)動、管道驅(qū)動、RAM 盤驅(qū)動、SCSI驅(qū)動、鍵盤驅(qū)動、顯示驅(qū)動、磁盤驅(qū)動、并口驅(qū)動。
   

      VxWorks的所有機制和功能都是基于“C子程序”這種簡單結(jié)構(gòu)的,即:VxWorks的所有功能都是由C程序庫提供的。任何C程序都能夠從Tornado的命令和調(diào)試環(huán)境中交互式地調(diào)用;任何C程序都能夠作為VxWorks的一個任務(wù)從Tornado主機工具或者應(yīng)用程序中產(chǎn)生,而且C程序能夠與中斷、看門狗定時器或輔助定時器相連。VxWorks的這種統(tǒng)一性使Tornado成為一種有效的開發(fā)系統(tǒng)。因為用戶不必再編寫特殊的代碼來與系統(tǒng)陷阱接口,也不需要進行特殊的處理來建立一個任務(wù),更不需要編寫特殊的用戶接口程序或交互式的測試程序來測試新代碼,用戶只要編寫子程序就能夠完成所有這些工作。
   

       VxWorks的特性為編寫應(yīng)用程序和設(shè)備驅(qū)動程序提供了極大的便利。在VxWorks下,設(shè)備驅(qū)動程序既可以嵌入內(nèi)核隨系統(tǒng)一起啟動,也可以作為可加載模塊在系統(tǒng)啟動之后運行,無論采用哪一種方式編寫驅(qū)動程序,需要注意的一點就是:其使用不能依賴于還沒有啟動的功能模塊(例如c庫函數(shù))或者未激活的設(shè)備。

     1.2 電子盤
   

      電子盤的內(nèi)部存儲介質(zhì)Flash是近年來發(fā)展最快的一種存儲芯片,它具有EEPROM可擦寫的特點,又同時具有EPROM 廉價的特點,它是一種高性能、低功耗、電可擦除的存儲器件。電子盤由于上述特點,現(xiàn)已經(jīng)廣泛應(yīng)用于信息存儲、機頂盒、瘦客戶機、瘦主機、網(wǎng)絡(luò)計算機、以及嵌入式計算機等很多系統(tǒng)。
   

       TrueFFS是M-System 公司開發(fā)出來的可用于電子盤設(shè)備的專利技術(shù)。TrueFFS的基本功能就是磁盤仿真。它提供像DOC一樣的塊設(shè)備的接口,從而方便了操作系統(tǒng)對電子盤設(shè)備的邏輯區(qū)的讀寫。通過TrueFFS可以對電子盤進行讀寫、分區(qū)、格式化等一系列操作。通過對操作系統(tǒng)的l/O控制的調(diào)用,就可以訪問TrueFFS的外部接口。電子盤設(shè)備的I/O控制并不局限于某一特定操作系統(tǒng),所以可以兼容多種操作系統(tǒng)。通常,在操作系統(tǒng)下驅(qū)動電子盤有以下兩步:

       ①調(diào)用操作系統(tǒng)的GetDriverHandle()函數(shù)得到驅(qū)動器的句柄。它的返回值是一個能夠供I/O控制函數(shù)調(diào)用的TrueFFS驅(qū)動的描述符。這一步依賴于操作系統(tǒng)的文件系統(tǒng)。

        ②調(diào)用操作系統(tǒng)中文件系統(tǒng)的IOControl()函數(shù)。它將使TrueFFS具有其它文件系統(tǒng)的特性:

      1)文件系統(tǒng)狀態(tài)。它的值可以指示操作指令是否成功的傳遞給了驅(qū)動器或者驅(qū)動器對于操作指令有無響應(yīng),但它并不能確認操作的結(jié)果或狀態(tài)。一個操作的結(jié)果或狀態(tài)是由輸入輸出控制包(IO Package)來傳遞的。它們使用的是TrueFFS的標(biāo)準狀態(tài)碼,這些狀態(tài)碼可以在IO控制的頭文件以及一些驅(qū)動包文件中查到。

      2)文件系統(tǒng)IO控制。它可以調(diào)用文件系統(tǒng)的擴展功能。

      3)輸入輸出請求包。所有的TrueFFS擴展功能都使用下列輸入輸出請求包,它的定義格式如下:
typedef struct
{
FLHandle irHandle;
Unsigned irFlages;
FLSimplePath FAR1 *irPath;
Void FAR1 *irData;
Long irLength;
Long irCount;
}
       irHandle(句柄)主要用于確認一個操作究竟應(yīng)該作用于哪一個分區(qū)。如果只有一個驅(qū)動器,那么就不會出現(xiàn)沖突,則句柄的值可以設(shè)置為0。驅(qū)動器的句柄包含了物理驅(qū)動數(shù)(LSB 0-3)和分區(qū)數(shù)(LBB 4-7)。由于Binary Partition和Disk Partition的句柄都可以從0開始。所以,Binary Partition和Disk Partition總是通過不同的句柄來訪問,以免產(chǎn)生沖突。
   

       irFlags這個變量用來標(biāo)識擴展功能的類型。每一個擴展功能都有一個枚舉類型的代碼標(biāo)識。
   

       irData包含了一個指向fllOctlRecond記錄的指針。fllOctlRecond記錄包含了一些擴展功能的輸入輸出記錄的指針。
   

       DOC2000為M-System 公司DOC系列的第二代產(chǎn)品,它為32腳DIP封裝,具有體積小,封裝簡單的特點,通過將DOC2000插入DOC2000插槽,可以大量減少占用的物理空間。

DOC2000結(jié)構(gòu)方框圖

        如圖1所示,DOC2000由系統(tǒng)接口單元(System Interface)、系統(tǒng)引導(dǎo)模塊(Boot Block)、錯誤檢測與更正單元(EDC/ECC),閃存控制單元(Flash Control)以及Flash存儲介質(zhì)組成。其中系統(tǒng)接口單元為DOC2000提供一個類SRAM 接口,使之能通過CPU的本地總線、ISA總線、SRAM 總線、EEPROM 接口建立與操作系統(tǒng)的連接。DOC提供片選信號(CE#)、讀寫信號(WE#)、使能信號(OE#)以及13位寬的地址線(A[0:12])和8位寬的數(shù)據(jù)總線(D[0:7])。每個DOC占用系統(tǒng)8K的地址空間,通過地址窗的滑動來訪問整個DOC空間。系統(tǒng)引導(dǎo)模塊用來響應(yīng)PC機結(jié)構(gòu)中BIOS擴展設(shè)備的搜索。當(dāng)BIOS檢測到DOC2000為擴展設(shè)備時,它可以執(zhí)行保存在系統(tǒng)引導(dǎo)模塊中的TrueFFS的驅(qū)動程序,通過系統(tǒng)調(diào)用TrueFFS格式轉(zhuǎn)換軟件,系統(tǒng)可以把DOC2000映射為普通的硬盤從而方便地進行讀寫。DOC2000的錯誤檢測和更正模塊用來提供數(shù)據(jù)錯誤的檢測、更正以及數(shù)據(jù)保護。Flash控制模塊主要用來完成TrueFFS地址與Flash介質(zhì)地址之間的轉(zhuǎn)換、數(shù)據(jù)傳輸控制等功能。

      2 電子盤設(shè)備驅(qū)動程序的基本結(jié)構(gòu)流程
   

       在VxWorks下,設(shè)備驅(qū)動程序既可以嵌入內(nèi)核隨系統(tǒng)一起啟動,也可以作為可加載模塊在系統(tǒng)啟動之后運行。

      2.1可選加載方式
   

       可選加載方式驅(qū)動電子盤是一種比較常用的方式。它是把驅(qū)動程序制作成一個可獨立運行的應(yīng)用程序,當(dāng)需要的時候可以選擇加載到用戶程序集中。利用可選加載方式驅(qū)動電子盤的第一步是要確定電子盤所占用的系統(tǒng)地址窗的范圍。一般主機板都給出了幾個可以選擇的范圍,通過跳線可以設(shè)置電子盤的地址窗的起始、結(jié)束地址。啟動VxWorks下TrueFFS驅(qū)動程序,根據(jù)實際的地址將地址窗參數(shù)配置好。第二步將TrueFFS映射成DOS文件系統(tǒng)。調(diào)用tffsMakeHandle()函數(shù)得到驅(qū)動器的描述符。將此描述符傳遞給驅(qū)動器句柄。然后定義一個塊設(shè)備的指針用于保存一個虛擬DOS文件系統(tǒng)分區(qū)的信息。調(diào)用tffsDevCreate()函數(shù)將剛才檢測到句柄的TrueFFS驅(qū)動器映射成DOS文件系統(tǒng)分區(qū),并將該函數(shù)的返回值傳遞給定義好的塊設(shè)備指針。至此,就完成了TrueFFS到DOSFS的映射過程。完成DOSFS設(shè)備初始化后,在Tornado的Shell環(huán)境下運行devs命令就可以看到tffs設(shè)備已經(jīng)在系統(tǒng)設(shè)備列表中了。第三步,讀寫電子盤上的文件。設(shè)置好要讀寫的文件的文件名、路徑。利用標(biāo)準C++的文件系統(tǒng)函數(shù)就可以方便的讀寫文件了。

      2.2嵌入系統(tǒng)方式
   

       嵌入系統(tǒng)方式比可選加載方式要復(fù)雜。它將驅(qū)動程序嵌入系統(tǒng)內(nèi)核中,這樣電子盤可以在系統(tǒng)啟動的時候被驅(qū)動。這種方式主要應(yīng)用于系統(tǒng)引導(dǎo)文件放在電子盤上的情況。嵌入系統(tǒng)方式又分為X86機的嵌入方式和其它(如PowerPC,MIPs等)嵌入方式。這里以X86方式為例。
   

      第一步修改目標(biāo)BSP目錄下的config.h文件,增加電子盤設(shè)備的定義,修改引導(dǎo)設(shè)備。第二步修改系統(tǒng)BSP目錄下的bootconfig.C文件,將電子盤的驅(qū)動程序加入。第三步修改系統(tǒng)BSP目錄下的usrconfig.h文件,調(diào)用電子盤的驅(qū)動程序。

      3 設(shè)備驅(qū)動程序示例
   

       下面給出DOC2000的可選加載方式的驅(qū)動程序的框架代碼,嵌入系統(tǒng)方式下的DOC2000的驅(qū)動程序涉及VxWorks系統(tǒng)內(nèi)核,這里不作詳細敘述。

       3.1定義頭文件、常量、全局變量
#include "fldrvvxw.h"
#include "dosFsLib.h"
long tfsAddresses[2]={0xd8000,0xdfff};
/*定義電子盤的地址窗范圍*/
int iSocket=0;
/*TrueFFS內(nèi)部變量*/
int iDisk=0; /*電子盤數(shù)量(1個)*/
nt handle; /*驅(qū)動器句柄*/
nt flags=0;
/*將TrueFFS仿真成DOS FAT16的格式*/
BLK_DEV * tffs_blk_dev; /*塊設(shè)備指針*/
char FilePath[50]="/tffs0/test.txt"; /*文件路徑*/
File fp; /*文件指針*/

      3.2 驅(qū)動電子盤并將TrueFFS映射為DOSFS
DOCDriver()
{
tfsSetup(1,tfsAddresses); /*TrueFFS驅(qū)動程序*/
handle= tfsMakeHandle(iSocket,iDisk);
/{得到驅(qū)動器的句柄{/
tfs_ blk_dev=tfsDevCreate(handle,flags);
/*得到仿真DOSFS的塊設(shè)備信息*/
dosFsInit (20);
/*初始化DOSFS的參數(shù)*/
dosFsDevInit ("/tfs0/",tffs_blk_dev,NULL); /*初始化DOSFS設(shè)備*/
taskDelay(sysClkRateGet()/2); /*系統(tǒng)延時*/
}

      3.3 電子盤文件的讀寫
FileReadWrite()
{
fp=fopen(FilePath,"r+");
…… /*相關(guān)文件操作*/
fclose(fp);
}

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


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




關(guān)鍵詞: 實時操作系統(tǒng) VxWorks

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉