《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > VxWorks中低速串行設備驅動的層次化設計方法
VxWorks中低速串行設備驅動的層次化設計方法
來源:微型機與應用2013年第3期
曾 勇
(中國西南電子技術研究所,四川 成都 610036)
摘要: 針對傳統開發模式存在的問題,在原有工程基礎上對低速串行設備驅動程序進行了更改、封裝,并提出了一種低速串行設備驅動層次化設計方法。
Abstract:
Key words :

摘  要: 針對傳統開發模式存在的問題,在原有工程基礎上對低速串行設備驅動程序進行了更改、封裝,并提出了一種低速串行設備驅動層次化設計方法
關鍵詞: 層次化設計方法;低速串行設備;設備驅動

 隨著通信技術的發展,低速串行設備動態擴展和多低速串行設備全雙工通信技術在嵌入式領域的應用越來越廣泛。利用現場可編程門陣列FPGA(Field Programmable Gates Army)完全可以將若干接口電路的功能集成到一片FPGA中,這不僅具有集成度高、體積小和功耗低等優點,而且還具有用戶可編程能力,同時還可實現整個系統的功能重構以及項目過程中一些特殊低速串行設備傳輸方式,這是專用低速串行設備實現芯片所不具備的功能。
 嵌入式系統一般采用PowerPC+FPGA的架構方式,FPGA主要完成底層接口協議處理,PowerPC的任務主要實現控制功能。FPGA與PowerPC通過內部總線(Local Bus)方式連接,FPGA實現基于總線的時序操作;采用內存映射方式,FPGA實現的多個低速串行設備的設置、操作寄存器以及FIFO的入口出口映射為PowerPC可尋址的一段內存空間,根據系統設計方法采用中斷復用方式或者使用多個PowerPC中斷號。
在驅動程序傳統開發過程中,FPGA實現的多個低速串行設備驅動程序的設計不受驅動體系約束,只是簡單地根據上層應用的需求提供接口,導致應用程序代碼可移植性、可讀性差,開發流程并行度不高,層次性不明確。實際調試過程中則需要應用程序人員、驅動開發人員同時對各自的程序進行修改、重新編譯。
本文在原有工程基礎上對FPGA驅動程序進行了更改、封裝,實現了基于FPGA的多個低速串行設備在VxWorks系統的標準I/O設備驅動,并在此基礎上提出了一種低速串行設備驅動層次化設計方法。
1 低速串行設備驅動程序設計
 在VxWorks中,串行設備是一種特殊字符設備。與字符設備不同的是,串行設備的驅動程序并不是直接掛在I/O系統中,而是通過虛擬設備ttyDrv來使用[1]。ttyDrv與I/O系統以及真實驅動程序之間的關系如圖1所示。
ttyDrv和tyLib實現了以下的功能[2]:(1)I/O系統請求(在驅動表中增加入口函數,創建設備描述符等);(2)管理I/O系統的入口函數,如tyOpen,ttyIoctl,tyRead,tyWrite等;(3)管理selectLib的調用;(4)管理數據緩沖區以及緩沖區上的線程同步互斥;(5)ttyDrv處理open和ioctl操作(ttyOpen and ttyIoctl);(6)tyLib處理read和write操作(tyRead and tyWrite)。

 真實的低速串行設備驅動函數(xxDrv)通過ttyDrv安裝的回調函數在I/O系統和設備之間移動數據;tyLib提供了2個回調函數(tyITx和tyIRd)。
1.1 標準驅動程序的構造
 SIO_DRV_FUNCS結構體是串行設備驅動程序的一個重要的組成部分,它是驅動函數的入口,在串行設備的驅動程序中必須要有一個包含指向SIO_DRV_FUNCS指針的結構(xx_CHAN),xx_CHAN包含了xxDrv中所需要的設備特定信息,以及提供給高層函數的底層操作函數;由于系統不知道驅動函數中所使用的數據結構,VxWorks提供了一個數據結構SIO_CHAN來進行數據類型轉換[3]。SIO_CHAN結構僅定義了一個指向SIO_DRV_FUNCS結構體的指針。
 FPGA實現的多個低速串行設備驅動程序的結構構造實例如下:
 typedef struct{
    /*SIO_CHAN*MUST*be first*/
    SIO_CHAN sio;/*standard SIO_CHAN element*/
    UINT32*    inBase;    /*FIFO入口地址*/
    UINT32*    outBase;        /*FIFO出口地址*/
    UINT32*    baudFreqSetBase;    /*波特率設置地址*/
    UINT32* IntSourceBase;/*中斷源寄存器地址*/
    UINT32* inNumBase;    
/*FIFO有效數據長度寄存器地址*/
    SEM_ID RecvSem;/*對應的信號量*/
    UINT32    intLevel;
    UINT32    IntSourceMask;/*中斷源寄存器掩碼*/
    /*callbacks*/
    STATUS  (*getTxChar) (void*,char*);
    void     (*putRcvChar) (void*,char);
    void *    getTxArg;
    void *    putRcvArg;
    } FPGA_CHAN;
1.2 驅動函數和回調函數的掛接
 ttyDrv通過SIO_DRV_FUNCS提供的入口對xxDrv的服務進行訪問,xxDrv通過回調函數來訪問ttyDrv提供的服務[4]。xxDrv驅動函數在SIO_DRV_FUNCS中的掛接實例如下:
LOCAL SIO_DRV_FUNCS fpgaSioDrvFuncs=
    {
    fpgaIoctl, /*Support device specific ioctl cmds*/
    fpgaTxStartup, /*Initiates a transmit cycle*/
    fpgaCallbackInstall,
/*Installs access to higher level protocols */
    fpgaPollInput,/*Poll mode input routine*/
    fpgaPollOutput     /*Poll mode output routine*/
    };
1.3 驅動程序標準操作函數的實現
1.3.1 標準寫函數

 標準的I/O系統寫函數write()調用tyWrite()函數——ttyDrv加載在驅動表中的寫入口函數,tyWrite()函數將數據放入環形緩沖隊列中并調用驅動函數fpgaTxStartup()發起一次傳輸過程。write函數的調用關系如圖2所示。

2 低速串行設備的加載
 (1)根據實際需求修改config.h中NUM_TTYS宏;
 (2)參照sysSerialHwInit()函數實現FpgaSerialHwInit(),對NUM_TTYS個低速串行設備結構體FPGA_CHAN進行初始化以及驅動函數和回調函數的掛接;
 (3)參照sysSerialHwInit2()函數實現FpgaSerialHwInit2(),掛接中斷處理函數fpgaRcvInt();
 (4)調用ttyDevCreate()函數創建tty設備,添加設備驅動表,生成環形數據緩沖區,安裝回調函數tyITx()和tyIRd()。
3 低速串行設備驅動層次化設計方法
 在不同的系統設計中,PowerPC和FPGA硬件連接方式不盡相同,如不同的片選信號、總線上數據線高低位的不同接法,中斷管腳接法的不同,導致FPGA實現的寄存器映射地址及使用的中斷號存在差異;針對不同的應用程序和應用場所,外部接口對應的設備也會發生相應的變化。以上這些都會破壞程序的獨立性、設備無關性。需要對驅動程序、應用程序進行重新編譯、燒寫,不利于版本的管理以及外場設備的維護。這是在設備驅動設計中需要考慮的一個問題。
由此本文提出了一種層次化的低速串行設備驅動設計方法。將驅動程序的實現分為三層,硬件分離層、設備加載層和功能描述層,各自實現的功能如下:
 (1)硬件分離層:通過XML文件實現低速串行驅動程序結構初始化和硬件設備實現差異的分離;
 (2)設備加載層:實現低速串行設備在VxWorks系統的標準I/O設備驅動的加載;
 (3)功能描述層:通過XML文件實現應用程序和低速串行設備之間的映射關系以及串行設備功能的描述。
低速串行設備驅動層次化設計方法流程如圖5所示。

3.1 層次化設計驅動程序的實現
 嵌入式操作系統中,通常都使用Flash作為主存介質。在Flash上建立TFFS文件系統,建立文件系統后,類似于在Windows操作系統下對硬盤操作一樣,進行數據的拷貝、刪除以及文件的建立等操作。XML作為配置文件的主要優點是改變參數配置時不需要改變和重新編譯應用程序,只需在XML文件中更改就可以了。TinyXML是一個簡單小巧、且很容易集成到其他程序中的C++XML解析器。即TinyXML解析一個XML文檔并由此生成一個可讀、可修改、可保存的文檔對象模型(DOM)。本文的實現過程中使用TinyXML對XML文檔進行解析。
 低速串行設備驅動層次化設計方法建立在文件系統之上,VxWorks可以動態地加載用戶程序,并在系統中加入對XML文件進行解析和存儲的功能。
 硬件分離層:FpgaSerialHwInit()通過讀取設備對應的BSP_Config.xml文件,對多個低速串行設備結構體FPGA_CHAN中的各個寄存器地址進行初始化以及驅動函數和回調函數的掛接。
設備加載層:實現標準I/O設備驅動的加載。
 功能描述層:應用程序通過讀取USER_Config.xml文件,獲取設備的對外連接狀態及設備提供的功能,對多個低速串行設備read、write以及ioctl等操作。
通常設備驅動人員只需要進行對BSP_Config.xml和USER_Config.xml兩個配置文件進行修改、更新。
3.2 XML配置文件的設計及實現
 BSP_Config.xml文件格式示例如下:
const char*bspXmlCfg=
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
"<Settings>"
"<DevSerial>"
"<inBase>\"10xd0100000\"</inBase>"
"<outBase>\"10xd0100100\"</outBase>"
……
"<IntSourceMask>\"10xd0100800\"</IntSourceMask>"
"</DevSerial>"
……
"</Settings>"
USER_Config.xml文件格式示例如下:
const char*userXmlCfg=
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<Settings>"
        "<DevSerial>"
        "<DevSerial Config Port=\"2\" Baud=\"38400\"
Enabled=\"1\"/>"
     "</DevSerial>"
……
"</Settings>"
XML文件的遍歷和讀取方法如下:
TiXmlDocument doc(CONFIG_FILE_NAME);
bool loadOkay=doc.LoadFile();/*讀取文件*/
doc.Print();/*輸出打印*/
rootNode=doc.FirstChild("Settings");/*獲取根節點*/
    ……
node=rootNode->FirstChild("System");
/*獲取匹配的子節點*/
itemElement=node->ToElement();/*轉換為元素*/
itemElement->Attribute("Type",&dValue);/*讀取屬性*/
XML文件的保存和更新方法如下:
TiXmlDocument doc;
doc.Parse(demoXmlCfg);
/*讀取需要保存的XML文件框架結構*/
rootNode=doc.FirstChild("Settings");/*獲取根節點*/
    ……
node=rootNode->FirstChild("System");
/*獲取匹配的子節點*/
itemElement=node->ToElement();/*轉換為元素*/
itemElement->SetDoubleAttribute("Type",Type)
;/*更新屬性*/
    ……
doc.SaveFile(CONFIG_FILE_NAME);
/*存儲更新配置文件*/

 


 本文提出并實現了一種VxWorks低速串行設備驅動的層次化設計方法,通過驅動程序功能分層設計方式,屏蔽各層的實現細節,克服了嵌入式系統開發過程中,由于設備驅動程序的設計不受驅動體系約束帶來的程序代碼的可移植性、可讀性差,開發流程并行度不高,層次性不明確等不足之處;在實際的工程實現中節約了開發時間,極大地提高了效率。
參考文獻
[1] Vxworks kernel programmers guide[Z].Wind River Systems Inc,2006.
[2] Vxworks device driver developers guide[Z]. Wind River Systems Inc, 2006.
[3] 內核示例源代碼[Z]. Wind River Systems Inc, 2006.
[4] 陳智育,等.VxWorks程序開發實踐[M].北京:人民郵電出版社,2004.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲国产婷婷香蕉久久久久久| 亚洲性夜色噜噜噜7777| 欧美二区不卡| 久久精品三级| 亚洲欧美日韩在线观看a三区 | 久久精品视频99| 午夜精品久久久久久久99热浪潮 | 免费欧美在线视频| 久久综合图片| 久久综合久色欧美综合狠狠| 久久精品91| 久久精品国产第一区二区三区最新章节 | 亚洲欧美日韩一区二区在线| 亚洲永久精品大片| 亚洲午夜激情| 亚洲神马久久| 一本综合久久| 一本一本久久a久久精品综合麻豆| 亚洲精品永久免费| 亚洲免费观看高清完整版在线观看熊| 最新国产成人在线观看| 最新亚洲一区| 99精品免费视频| 一区二区三区精品视频| 亚洲视频一二区| 亚洲综合色视频| 欧美一区二区成人| 久久久九九九九| 麻豆精品在线视频| 欧美国产精品专区| 亚洲精品国产精品国产自| 精品va天堂亚洲国产| 永久免费毛片在线播放不卡| 在线观看精品一区| 亚洲激情校园春色| 99国产精品视频免费观看一公开 | 亚洲精品社区| aa级大片欧美| 亚洲一区在线播放| 性做久久久久久| 久久久久久网站| 两个人的视频www国产精品| 欧美va亚洲va日韩∨a综合色| 欧美日本国产| 国产精品日韩在线播放| 国产一区日韩欧美| 亚洲电影在线看| 亚洲看片免费| 亚洲欧美日本精品| 亚洲国产精品热久久| 亚洲久久一区| 亚洲一区国产| 久久久999成人| 欧美刺激性大交免费视频| 欧美日韩高清一区| 国产模特精品视频久久久久 | 欧美在线观看视频一区二区三区 | 欧美一区二区三区日韩视频| 久久免费精品视频| 欧美国产在线电影| 国产精品草莓在线免费观看| 国产欧美一二三区| 亚洲国产岛国毛片在线| 一区二区免费看| 欧美在线地址| 中文在线不卡视频| 久久国产精品久久精品国产| 欧美国产日本| 国产女主播一区二区| 亚洲国产欧美国产综合一区| 亚洲无线一线二线三线区别av| 亚洲高清不卡在线| 亚洲一区在线直播| 免费永久网站黄欧美| 国产精品久久久久久久久久久久久久 | 亚洲欧洲一区二区在线播放| 亚洲免费小视频| 免费在线看成人av| 国产精品一区二区久久国产| 在线精品观看| 亚洲直播在线一区| 亚洲国产综合视频在线观看| 亚洲欧美日韩国产另类专区| 欧美aa国产视频| 国产精品综合| 99精品国产福利在线观看免费| 欧美在线一二三| 亚洲欧美清纯在线制服| 欧美大片91| 国产一区二区三区久久精品| 99在线精品免费视频九九视| 亚洲电影中文字幕| 午夜精品一区二区三区在线播放| 欧美凹凸一区二区三区视频| 国产欧美日韩专区发布| 日韩视频在线观看国产| 亚洲国产高清在线| 欧美中文日韩| 欧美性色视频在线| 91久久精品久久国产性色也91| 欧美在线精品免播放器视频| 亚洲女人天堂成人av在线| 欧美极品在线播放| 激情综合网激情| 亚洲欧美日韩另类| 亚洲免费在线视频| 欧美日韩情趣电影| 最新成人在线| 日韩亚洲国产欧美| 欧美精品一区二区三区在线播放| 在线观看一区| 亚洲人成毛片在线播放| 免费久久99精品国产自| 精品成人一区二区三区四区| 久久精品91久久久久久再现| 久久久www成人免费毛片麻豆| 国产精品免费看久久久香蕉| 在线视频一区观看| 亚洲特色特黄| 国产精品白丝黑袜喷水久久久| 夜色激情一区二区| 亚洲制服少妇| 国产精品你懂的| 亚洲影音先锋| 欧美一区二区三区在线看| 国产精品久久久久一区二区三区 | 亚洲一区二区不卡免费| 欧美日韩卡一卡二| 日韩视频免费大全中文字幕| 日韩一级成人av| 欧美理论电影网| 日韩视频在线免费观看| 亚洲人成高清| 欧美激情一区二区在线| 一区在线视频观看| 久久精品国产清高在天天线| 欧美在线|欧美| 狠狠狠色丁香婷婷综合激情| 先锋影音久久| 久久精品国产69国产精品亚洲| 国产免费成人在线视频| 91久久国产综合久久91精品网站| av成人免费在线观看| 欧美激情一区二区三区高清视频 | 亚洲欧美日本国产专区一区| 国产精品a级| 这里只有视频精品| 性欧美大战久久久久久久久| 国产精品乱人伦中文| 中日韩美女免费视频网址在线观看 | 一区二区不卡在线视频 午夜欧美不卡'| 亚洲免费中文字幕| 国产精品久久久久aaaa| 9国产精品视频| 亚洲女人天堂av| 国产精品夜夜夜| 亚洲国产成人精品女人久久久 | 国产精品美女久久久免费| 亚洲一区激情| 性欧美精品高清| 国产伦精品一区二区三区免费| 亚洲国产成人av在线| 免费不卡欧美自拍视频| 在线精品视频在线观看高清| 亚洲国产精品精华液网站| 老色鬼久久亚洲一区二区| 亚洲美女视频| 亚洲欧美日韩国产综合| 国产日韩av在线播放| 久久国产66| 欧美成人免费全部观看天天性色| 宅男66日本亚洲欧美视频| 性做久久久久久久免费看| 国产欧美在线| 亚洲电影欧美电影有声小说| 欧美激情第9页| 一区二区三区免费观看| 久久综合色播五月| 最新日韩欧美| 亚洲免费视频在线观看| 国产亚洲激情| 一区二区欧美日韩| 国产精品午夜av在线| 香蕉成人啪国产精品视频综合网| 久久免费视频观看| 亚洲精品久久嫩草网站秘色 | 欧美在线视频免费播放| 伊人伊人伊人久久| 9l国产精品久久久久麻豆| 欧美亚洲第一页| 久久激情视频| 免费看的黄色欧美网站| 亚洲一区二区在线免费观看| 久久这里有精品视频| 亚洲精品无人区| 亚洲欧美日韩国产成人| 红桃视频国产精品| 午夜精品99久久免费| 亚洲电影免费| 亚洲欧美一区二区在线观看|