小碩vxworks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)筆記_第1頁
小碩vxworks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)筆記_第2頁
小碩vxworks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)筆記_第3頁
小碩vxworks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)筆記_第4頁
小碩vxworks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)筆記_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

目錄第1章操作系統(tǒng)根本概念4實(shí)時(shí)操作系統(tǒng)和分時(shí)操作系統(tǒng)的區(qū)別4嵌入式操作系統(tǒng)VxWorks簡介41.3VxWorks的特點(diǎn)5可靠性5實(shí)時(shí)性51.3.3可裁減性6對一個(gè)實(shí)時(shí)內(nèi)核的要求61.4VxWorks的整體構(gòu)架7第2章vxWorks驅(qū)動(dòng)開發(fā)預(yù)備72.1VxWorks映像82.2BSP主要文件目錄的組成及作用:11系統(tǒng)啟動(dòng)順序142.4Vxworks驅(qū)動(dòng)概要17第3章vxWorks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)21驅(qū)動(dòng)類別223.2Vxworks下網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)243.3VxWorks網(wǎng)絡(luò)驅(qū)動(dòng)配置及分析60第4章VxWorks系統(tǒng)中常見問題65前言在通信,電子領(lǐng)域,目前主流的嵌入式操作系統(tǒng)為linux和vxworks。Linux多用于消費(fèi)電子產(chǎn)品,像大家熟悉的andriod,原始系統(tǒng)就是linux,也就是說andriod也是一種linux系統(tǒng)。還有大家熟悉的MP3,也是使用linux操作系統(tǒng)的。Linux因?yàn)閮r(jià)格廉價(jià)〔開源的,不需要付licence〕,穩(wěn)定性好占據(jù)了一定的市場份額。Vxworks是風(fēng)河系統(tǒng)1983開發(fā)的一款嵌入式實(shí)時(shí)操作系統(tǒng),多用于通信,導(dǎo)航,航天等領(lǐng)域。因?yàn)檫@些領(lǐng)域?qū)?shí)時(shí)性要求非常高,比方現(xiàn)在LTE系統(tǒng)就是使用vxworks系統(tǒng),因?yàn)槭遣捎肨DD模式,而這種模式,顯然對實(shí)時(shí)性要求非常高。也就注定了vxwroks在這些領(lǐng)域的特有優(yōu)勢。選擇linux還是vxworks看自己的專業(yè)方向,還有自己的興趣所有。每個(gè)領(lǐng)域只要研究透徹,都是很有前途的。既然兩者都是主流的嵌入式操作系統(tǒng),其還是有很多相似性。小編也初步接觸過linux,發(fā)現(xiàn)具備一定的linux根底對日后深入學(xué)習(xí)vxworks很有好處,很多思想都是相似的。另外,本人系小碩,目前的研究領(lǐng)域是vxworks驅(qū)動(dòng)開發(fā),主攻網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)。在平常的日常學(xué)習(xí)中,結(jié)合各位網(wǎng)友提供的資料〔自己在百度上收集的〕,還有workbench提供的document〔自己翻譯,特別是針對網(wǎng)絡(luò)驅(qū)動(dòng)局部〕,希望對廣闊嵌入式驅(qū)動(dòng)開發(fā)者有所幫助。聲明:此文檔并不適合于vxworks初學(xué)者,因?yàn)檫@里,小編省去了很多vxworks下的根本知識,包括內(nèi)核中常用的進(jìn)程,信號量等等支持。也沒有提及集成開發(fā)環(huán)境tornado/vworkbench.這里的探索重點(diǎn)是vxwroks底層的東西,包括啟動(dòng)過程,BSP開發(fā)等。附錄:Vxworks的應(yīng)用領(lǐng)域嵌入式Vxworks系統(tǒng)的主要應(yīng)用領(lǐng)域主要有以下幾方面:1.數(shù)據(jù)網(wǎng)絡(luò):如:以太網(wǎng)交換機(jī)、路由器、遠(yuǎn)程接入效勞器等2.遠(yuǎn)程通訊:如:電信用的專用分組交換機(jī)和自動(dòng)呼叫分配器,蜂窩系統(tǒng)等3.醫(yī)療設(shè)備:如:放射理療設(shè)備4.消費(fèi)電子:如:個(gè)人數(shù)字助理等5.交通運(yùn)輸:如:導(dǎo)航系統(tǒng)、高速火車控制系統(tǒng)等6.工業(yè):如:機(jī)器人7.航空航天:如:衛(wèi)星跟蹤系統(tǒng)8.多媒體:如:電視會議設(shè)備9.計(jì)算機(jī)外圍設(shè)備:如:X終端、I/O系統(tǒng)等總之,VxWorks的系統(tǒng)結(jié)構(gòu)是一個(gè)相當(dāng)小的微內(nèi)核的層次結(jié)構(gòu)。內(nèi)核僅提供多任務(wù)環(huán)境、進(jìn)程間通信和同步功能。這些功能模塊足夠支持VxWorks在較高層次所提供的豐富的性能的要求。第1章操作系統(tǒng)根本概念實(shí)時(shí)操作系統(tǒng)和分時(shí)操作系統(tǒng)的區(qū)別從操作系統(tǒng)能否滿足實(shí)時(shí)性要求來區(qū)分,可把操作系統(tǒng)分成分時(shí)操作系統(tǒng)和實(shí)時(shí)操作系統(tǒng)。分時(shí)操作系統(tǒng)按照相等的時(shí)間片調(diào)度進(jìn)程輪流運(yùn)行,分時(shí)操作系統(tǒng)由調(diào)度程序自動(dòng)計(jì)算進(jìn)程的優(yōu)先級,而不是由用戶控制進(jìn)程的優(yōu)先級。這樣的系統(tǒng)無法實(shí)時(shí)響應(yīng)外部異步事件。實(shí)時(shí)操作系統(tǒng)能夠在限定的時(shí)間內(nèi)執(zhí)行完所規(guī)定的功能,并能在限定的時(shí)間內(nèi)對外部的異步事件作出響應(yīng)。分時(shí)系統(tǒng)主要應(yīng)用于科學(xué)計(jì)算和一般實(shí)時(shí)性要求不高的場合。實(shí)時(shí)性系統(tǒng)主要應(yīng)用于過程控制、數(shù)據(jù)采集、通信、多媒體信息處理等對時(shí)間敏感的場合。VxWorks簡介VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設(shè)計(jì)開發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng)〔RTOS〕,是嵌入式開發(fā)環(huán)境的關(guān)鍵組成局部。良好的持續(xù)開展能力、高性能的內(nèi)核以及友好的用戶開發(fā)環(huán)境,在嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域占據(jù)一席之地。它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。在美國的F-16、FA-18戰(zhàn)斗機(jī)、B-2隱形轟炸機(jī)和愛國者導(dǎo)彈上,甚至連1997年4月在火星外表登陸的火星探測器上也使用到了VxWorks。VxWorks操作系統(tǒng)是一個(gè)嵌入式實(shí)時(shí)操作系統(tǒng)〔RTOS〕。VxWorks與其它實(shí)時(shí)OS一樣,基于以下兩個(gè)重要機(jī)制:多任務(wù)環(huán)境及任務(wù)間通信。硬件中斷處理。VxWorks多任務(wù)內(nèi)核完成的功能是:實(shí)時(shí)調(diào)度,任務(wù)間通信及互斥。其它功能那么作為系統(tǒng)庫圍繞在內(nèi)核周圍,它們可根據(jù)需要進(jìn)行剪裁。VxWorks與非實(shí)時(shí)系統(tǒng)的不同之處在于:VxWorks的優(yōu)先搶占機(jī)制基于調(diào)度,VxWorks對外部事件的反響和處理快,VxWorks容量小并且可配置〔微內(nèi)核結(jié)構(gòu)〕1.3VxWorks的特點(diǎn)可靠性操作系統(tǒng)的用戶希望在一個(gè)工作穩(wěn)定,可以信賴的環(huán)境中工作,所以操作系統(tǒng)的可靠性是用戶首先要考慮的問題。而穩(wěn)定、可靠一直是VxWorks的一個(gè)突出優(yōu)點(diǎn)。自從對中國的銷售解禁以來,VxWorks以其良好的可靠性在中國贏得了越來越多的用戶。實(shí)時(shí)性

實(shí)時(shí)性是指能夠在限定時(shí)間內(nèi)執(zhí)行完規(guī)定的功能并對外部的異步事件作出響應(yīng)的能力。實(shí)時(shí)性的強(qiáng)弱是以完成規(guī)定功能和作出響應(yīng)時(shí)間的長短來衡量的。

VxWorks的實(shí)時(shí)性做得非常好,其系統(tǒng)本身的開銷很小,進(jìn)程調(diào)度、進(jìn)程間通信、中斷處理等系統(tǒng)公用程序精練而有效,它們造成的延遲很短。VxWorks提供的多任務(wù)機(jī)制中對任務(wù)的控制采用了優(yōu)先級搶占〔PreemptivePriorityScheduling〕和輪轉(zhuǎn)調(diào)度〔Round-RobinScheduling〕機(jī)制,也充分保證了可靠的實(shí)時(shí)性,使同樣的硬件配置能滿足更強(qiáng)的實(shí)時(shí)性要求,為應(yīng)用的開發(fā)留下更大的余地。1.3.3可裁減性用戶在使用操作系統(tǒng)時(shí),并不是操作系統(tǒng)中的每一個(gè)部件都要用到。例如圖形顯示、文件系統(tǒng)以及一些設(shè)備驅(qū)動(dòng)在某些嵌入系統(tǒng)中往往并不使用。VxWorks由一個(gè)體積很小的內(nèi)核及一些可以根據(jù)需要進(jìn)行定制的系統(tǒng)模塊組成。VxWorks內(nèi)核最小為8kB,即便加上其它必要模塊,所占用的空間也很小,且不失其實(shí)時(shí)、多任務(wù)的系統(tǒng)特征。由于它的高度靈活性,用戶可以很容易地對這一操作系統(tǒng)進(jìn)行定制或作適當(dāng)開發(fā),來滿足自己的實(shí)際應(yīng)用需要。1.3.4對一個(gè)實(shí)時(shí)內(nèi)核的要求一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核需滿足許多特定的實(shí)時(shí)環(huán)境所提出的根本要求,這些包括:多任務(wù):由于真實(shí)世界的事件的異步性,能夠運(yùn)行許多并發(fā)進(jìn)程或任務(wù)是很重要的。多任務(wù)提供了一個(gè)較好的對真實(shí)世界的匹配,因?yàn)樗试S對應(yīng)于許多外部事件的多線程執(zhí)行。系統(tǒng)內(nèi)核分配CPU給這些任務(wù)來獲得并發(fā)性。搶占調(diào)度:真實(shí)世界的事件具有繼承的優(yōu)先級,在分配CPU的時(shí)候要注意到這些優(yōu)先級?;趦?yōu)先級的搶占調(diào)度,任務(wù)都被指定了優(yōu)先級,在能夠執(zhí)行的任務(wù)〔沒有被掛起或正在等待資源〕中,優(yōu)先級最高的任務(wù)被分配CPU資源。換句話說,當(dāng)一個(gè)高優(yōu)先級的任務(wù)變?yōu)榭蓤?zhí)行態(tài),它會立即搶占當(dāng)前正在運(yùn)行的較低優(yōu)先級的任務(wù)。任務(wù)間的通訊與同步:在一個(gè)實(shí)時(shí)系統(tǒng)中,可能有許多任務(wù)作為一個(gè)應(yīng)用的一局部執(zhí)行。系統(tǒng)必須提供這些任務(wù)間的快速且功能強(qiáng)大的通信機(jī)制。內(nèi)核也要提供為了有效地共享不可搶占的資源或臨界區(qū)所需的同步機(jī)制。任務(wù)與中斷之間的通信:盡管真實(shí)世界的事件通常作為中斷方式到來,但為了提供有效的排隊(duì)、優(yōu)先化和減少中斷延時(shí),我們通常希望在任務(wù)級處理相應(yīng)的工作。所以需要雜任務(wù)級和中斷級之間存在通信。1.4VxWorks的整體構(gòu)架VxWorks支持多種處理器,對硬件不做假設(shè),可支持ARM.PPC,MPIS架構(gòu)處理器。第2章vxWorks驅(qū)動(dòng)開發(fā)預(yù)備BSP定義:Boardsupportpacket,為各種目標(biāo)板的硬件功能提供了統(tǒng)一的軟件接口它們包括:硬件初始化中斷處理和產(chǎn)生硬件時(shí)鐘和定時(shí)器管理內(nèi)存映射和分配BSP還包括bootRom和其它啟動(dòng)機(jī)制,sysLib和sysALib庫是VxWorks可移植的核心,BSP庫是硬件與軟件的接口,處理硬件的初始化、中斷處理與產(chǎn)生、硬件時(shí)鐘與定時(shí)管理、局部和總線內(nèi)存空間的映射、內(nèi)存大小定義,等等2.1VxWorks映像用戶通過定制VxWorks組件和進(jìn)行應(yīng)用程序開發(fā)所生成映像包括wind多任務(wù)微內(nèi)核,也包括BSP的引導(dǎo)代碼Vxworks映像的三局部組成BSS段〔BlockStartedbySymbol,未手動(dòng)初始化的數(shù)據(jù)〕代碼段數(shù)據(jù)段兩大類BootRom類型映像VxWorks類型BootRom類型映像最小化、專用的VxWorks引導(dǎo)映像,實(shí)現(xiàn)最少的系統(tǒng)初始化用于啟動(dòng)裝載VxWorks映像,功能類似于PC機(jī)的BIOS。BootRom運(yùn)行時(shí)建立起多任務(wù)環(huán)境usrRoot任務(wù)、網(wǎng)絡(luò)任務(wù)〔tNettask〕、TFFS任務(wù)和FTP任務(wù)等。運(yùn)行地點(diǎn)可能在ROM/Flash中執(zhí)行(例如ROM駐留型引導(dǎo)映像),也可能在RAM中執(zhí)行。在系統(tǒng)中其對應(yīng)的編譯規(guī)那么文件是BootRom類型分為三種BootRom_res一直運(yùn)行在rom中的映象,只把data段拷貝到ram里面。BootRom_uncmp非壓縮方式的映象,data段和text段都要拷貝到ram里面,并在ram里面運(yùn)行。BootRom壓縮方式的映象,生成的時(shí)候編譯器會把除掉romlnit.s和之外的目標(biāo)文件壓縮并“匯編〞成一個(gè),最后和,,進(jìn)行鏈接,生成bootrom映像。要全部拷貝到ram中,并必須要進(jìn)行解壓縮的工作。而這些工作根本上都是在中進(jìn)行的。VxWorks類型映像系統(tǒng)的主映像,是系統(tǒng)最終要運(yùn)行的映像該映像在運(yùn)行時(shí)至少有一局部(如:數(shù)據(jù)段和BSS段)需要在RAM中運(yùn)行。在系統(tǒng)中其對應(yīng)的編譯規(guī)那么文件是Vxworks類型映像運(yùn)行環(huán)境RAM運(yùn)行的壓縮的ROM運(yùn)行的非壓縮的VxWorks類型四種映像VxWorks:RAM運(yùn)行的VxWorks映像不包含引導(dǎo)程序,需要獨(dú)立的引導(dǎo)程序從本地存儲器或者經(jīng)由網(wǎng)絡(luò)獲取該映像,然后將其下載到RAM中的RAM_LOW_LADRS處運(yùn)行VxWorks_romROM自動(dòng)RAM運(yùn)行的VxWorks映像,不需要BootRom輔助VxWorks_romResidentROM啟動(dòng)ROM運(yùn)行的VxWorks映像,不需要BootRom輔助。包含引導(dǎo)代碼,在重啟時(shí)清空RAM,引導(dǎo)代碼只將data段拷貝到RAM中的RAM_LOW_ADRS處,系統(tǒng)的運(yùn)行是在ROM中進(jìn)行的,啟動(dòng)速度快,需要的RAM空間少,但是運(yùn)行速度慢。VxWorks_romCompressVxWorks_rom的壓縮形式VxWorks型vsBootROM型映像對于沒有自啟動(dòng)功能的VxWorks類型映像(如VxWorks型),映像運(yùn)行前需一段程序?qū)⒃撚诚窨截惖絉AM中運(yùn)行,BootRom類型映像完成VxWorks系統(tǒng)下載,完畢后BootRom的任務(wù)就結(jié)束了二者在系統(tǒng)初始化的時(shí)候,所做的功能根本相同,BootRom類型映像調(diào)用,而VxWorks類型映像調(diào)用映像鏈接方式可被靜態(tài)或動(dòng)態(tài)鏈接VxWorks在開發(fā)階段可動(dòng)態(tài)地下載目標(biāo)文件,并與操作系統(tǒng)及其它目標(biāo)文件動(dòng)態(tài)鏈接。鏈接以后是浮動(dòng)的,只在裝載時(shí)才與絕對物理地址相對應(yīng)。靜態(tài)VxWorks成品階段是采用靜態(tài)鏈接的。要對系統(tǒng)底層驅(qū)動(dòng)清楚,也就是對CPU及相關(guān)的硬件有所了解.主要是32微處理器(上電啟動(dòng)過程,downloadimage的方式方法,讀寫ROM,地址空間分配,MMU,存放器,中斷定義,..).參照硬件資料,多讀一些源碼會有所幫助.Tornado2開發(fā)調(diào)試環(huán)境協(xié)議框圖主機(jī)開發(fā)(HostDevelopmentSystem)目標(biāo)機(jī)(TargetSystem)Tornado工具WTX協(xié)議通信<==========>EditorProjectShellDebuggerBrowserWindviewTargetServer|TargetAgentVxWorksTargetSimulatorWDB協(xié)議通信

<==========>ApplicationVxWorksOSVxWorksTarget(WDB)Agent兩個(gè)主要兩個(gè)協(xié)議WTX協(xié)議(WindRiverTooleXchange):用于開發(fā)機(jī)內(nèi)部Tornado工具與TargetServer之間通信.WDB協(xié)議(WindDeBug):用于主機(jī)TargetServer與目標(biāo)機(jī)之間的通信.2.2BSP主要文件目錄的組成及作用:Install_direction/target/config/All:這個(gè)目錄下的文件是所有BSP文件共享的,不是特別需要不要更改里面的任何文件.configAll.h:缺省定義了所有VxWorks的設(shè)置.如果不用缺省的設(shè)置,可在BSP目錄下的文件中用#define或#undef方式來更改設(shè)置.bootInit.c:在ro后,完成BootROM的第二步初始化.程序從中的romInit()跳到這個(gè)文件中的romStart().來執(zhí)行必要的解壓和ROMimage的放置.bootConfig.c:完成BootROMimage的初始化和控制.usrConfig.c:VxWorksimage的初始化代碼.Install/target/config/comps/src:.intasll/target/config/bspname:包含系統(tǒng)或硬件相關(guān)的BSP文件.Makefile一些命令行控制images的生成,參見BSP設(shè)置局部及生成下載READMEBSP發(fā)布紀(jì)錄,版本,總的文檔包括所有涉及CPU主板的設(shè)置及定義(includes,definations),參見BSP設(shè)置文件及生成下載網(wǎng)絡(luò)驅(qū)動(dòng)的主要設(shè)置文件,主要對END驅(qū)動(dòng)設(shè)置.匯編語言文件,是VxWorksBootROM和ROMbasedimage的入口,參見系統(tǒng)啟動(dòng)局部匯編語言文件,程序員可以把自己的匯編函數(shù)放在這個(gè)文件里,在上層調(diào)用.VxWorksimage的入口點(diǎn)_sysInit在這個(gè)文件里,是在RAM中執(zhí)行的第一個(gè)函數(shù)。包含一些系統(tǒng)相關(guān)的函數(shù)例程,提供了一個(gè)board-level的接口,VxWorks和應(yīng)用程序可以以system-indepent的方式生成.這個(gè)文件還能包含目錄target/config/comps/src的驅(qū)動(dòng).可選文件用于Scsi設(shè)備設(shè)置和初始化.sys可選文件用于所有的串口設(shè)置和初始化.ASIC文件包含VxWorksBootROM代碼VxWorks運(yùn)行在目標(biāo)機(jī)上,完整的,連結(jié)后的VxWorks二進(jìn)制文件.VxWorks.sym完全的,連結(jié)后帶有符號表的VxWorks二進(jìn)制文件完全的,連結(jié)后,standalone,帶有符號表的VxWorks二進(jìn)制文件BSP用"make"來編譯連接生成(Created),而不是用Tornado的工具.BSP和應(yīng)用程序都可以在"make"或"tornade"上開發(fā)(developed)。BSP被設(shè)置包括以下驅(qū)動(dòng):中斷控制interruptcontroller計(jì)時(shí)器timer(sys/aux)串口UART(serial)顯示屏LCD鍵盤Keyboard(opt)觸摸屏touch-screen(opt).系統(tǒng)啟動(dòng)順序VxWorksimage分為在ROM中運(yùn)行和在RAM中運(yùn)行兩種.兩者啟動(dòng)順序的區(qū)別在于sysInit()函數(shù)的調(diào)用.該函數(shù)在RAM運(yùn)行的VxWorks中初始化RAM.ROM中運(yùn)行的VxWorksVxWorks在ROM中運(yùn)行,即寫入ROM中的VxWorks是非壓縮的,不需要解壓,系統(tǒng)直接跳到ROM的首地址,運(yùn)行VxWorks.注意:ROM運(yùn)行的VxWorks并不支持所有的主扳,應(yīng)以主扳手冊為準(zhǔn).文件中的romInit()>文件中的romStart()-->文usrConfigusrInit()>sysHwInit()>usrKernelInit()>KernelInit(usrRoot,...)。Vxwroks在ROM中運(yùn)行的優(yōu)勢VxWorksVxWorksimage的data段復(fù)制到RAM的LOCAL_LOW_ADRS,text局部留在ROM并在ROM中執(zhí)行.。ROM中運(yùn)行的VxWorks缺點(diǎn)是運(yùn)行速度慢.RAM中運(yùn)行的VxWorksVxWorks在RAM中運(yùn)行,即寫入ROM中的Boot或VxWorksImage是壓縮的,需要先解壓copy所有的text和data到RAM的LOCAL_LOW_ADRS中,下面sysInit()主要是初始化RAM用的,系統(tǒng)直接跳到RAM的首地址,運(yùn)行VxWorksusrInit()前面不壓縮,即romInit(),romStart()不能壓縮.啟動(dòng)過程文件中的romInit()>文件中的中的sysInit()>文件中的usrInit()>sysHwInit()>usrKernelInit()>KernelInit(usrRoot,...)。RAM運(yùn)行的Boot或VxWorksimage的text段或data段會從ROM復(fù)制到RAM,在RAM中運(yùn)行。其中usrRoot()是VxWorks啟動(dòng)的第一個(gè)任務(wù),由它來初始化driver,network等。BootROMimage的啟動(dòng)過程最少的系統(tǒng)初始化,主要用于啟動(dòng)裝載VxWorksimage.一般有壓縮和不壓縮兩種形式,如bootrom和boot_uncmp.與VxWorksimage的區(qū)別在于一個(gè)Bootrom調(diào)用bootConfig.c,而VxWorks調(diào)用usrConfig.c.啟動(dòng)順序文件中的romInit()>文件中的romStart()>文件bootConfig中的usrInit()>sysHwInit()>usrKernelInit()>KernelInit(usrRoot,...)其中是BootROM設(shè)置模塊.用于通過網(wǎng)絡(luò)加載VxWorksimage.usrRoot()>bootCmdLoop(void)命令行選擇,或autobooting>bootLoad(pLine,&entry)載模塊到內(nèi)存(網(wǎng)絡(luò),TFFS,TSFS...)>netifAttach()>go(entry)>(entry)()從入口開始執(zhí)行,不返回.系統(tǒng)啟動(dòng)中幾個(gè)很重要的函數(shù)及其作用romInit()powerup,disableinterrupt,putboottypeonthestack,clearscaches.romStart()loadImageSegmentsintoRAM.usrInit()Interruptlockout,saveimformationaboutboottype,handlealltheInitializationbeforethekernelisactuallystarted,thenstartsthekernelexecutiontocreateaninitialtaskusrRoot().Thistaskcompletesthestartup.sysHwInit()Interruplocked,Initializeshardware,registers,activationkernel.KernelInit(usrRoot,...)Initializesandstartsthekernel.Definessystemmemorypartition.ActivatesatasktUsrRoottocompleteinitalization.Unlocksinierrupts.UsesusrInit()initatestack.usrRoot()初始化內(nèi)存分區(qū)表(memorypartitionlibrary),初始化系統(tǒng)系統(tǒng)時(shí)鐘(systemclock)。初始化輸入輸出系統(tǒng)(I/Osystem)可選Createdevices可選設(shè)置網(wǎng)絡(luò)(Configurenetwork)可選激活WDB目標(biāo)通信(ActivateWDBagent)可選調(diào)用程序(Activateapplication)VxWorksImage在RAM中解壓的位置RAMLowAddressRAMHighAddressVxWorks運(yùn)行的位置Bootimage由ROM解壓后Copy的位置,即bootRom區(qū)BSP配置文件及生成下載VxWorks在ROM中的情況ROM低高地址位ROM低地址位壓縮的VxWorksImgage沒有壓縮的romInit.s和romStart()在ROM的起始位置,系統(tǒng)powerup后,從這個(gè)起始位開始執(zhí)行,即執(zhí)行romInit(),起始位置由硬件定義,一般為0x00000000注:淺藍(lán)色為整個(gè)VxWorksImage.BSP配置文件及生成下載2.4Vxworks驅(qū)動(dòng)概要總線類型PLB〔processorlocalbus〕,VME,PCI,PCI-Express,RapidIO,Mii,Virtual,MF〔multifunctiondevicebus〕,USB,IIC,SPI.驅(qū)動(dòng)可以提供的效勞配置配置資源例如ns83902VxbEnd.c設(shè)備驅(qū)動(dòng)中有這么一段devResourceGet(pHcf,"regWidth",HCF_RES_INT,(void*)®isterWidth;這里的registerwidth就是資源配置參數(shù)vxbInstParamByNameGet(pInst,"jumboEnable",VXB_PARAM_INT32,&val);這句話的意思是支持大包處理,jumboenable.這個(gè)就是參數(shù)配置又如:中有這么一段LOCALVXB_PARAMETERSrtgParamDefaults[]={{"rxQueue00",VXB_PARAM_POINTER,{(void*)&rtgRxQueueDefault}},{"txQueue00",VXB_PARAM_POINTER,{(void*)&rtgTxQueueDefault}},{"jumboEnable",VXB_PARAM_INT32,{(void*)0}},{NULL,VXB_PARAM_END_OF_LIST,{NULL}}};內(nèi)存管理系統(tǒng)啟動(dòng)過程中分配內(nèi)存。當(dāng)系統(tǒng)早期啟動(dòng)的過程中,那些最初被初始化的設(shè)備驅(qū)動(dòng)是不能使用malloc,calloc.memPartAlloc()等函數(shù)分配內(nèi)存的,因?yàn)檫@些方法要使用信號量等操作。這時(shí),只能使用如下函數(shù)分配內(nèi)存hwMemAlloc()從一個(gè)靜態(tài)池中分配N個(gè)字節(jié),并清零。hwMemFree()將內(nèi)存分配給靜態(tài)池。注意hwMemAlloc()和hmMemFree()是在系統(tǒng)啟動(dòng)初期分配和釋放內(nèi)存,一旦系統(tǒng)完成初始化,就可以使用標(biāo)準(zhǔn)的內(nèi)存分配哈數(shù)進(jìn)行分配。malloc(),calloc(),memPartAlloc(),這里怎么沒有memalign〔〕硬件訪問讀寫硬件存放器vxbRead8()vxbRead16()vxbRead32()vxbRead64()vxbWrite8()vxbWrite16()vxbWrite32()vxbWrite64()使用vxbus訪問存放器的宏定義在下面的路徑installDir/vxWorks-6.x/target/src/hwif/h/vxbus/vxbAccess.h采用vxbRegMap().進(jìn)行映射/*findthememorymappedwindowforthedeviceregisters*/for(i=0;i<VXB_MAXBARS;i++){if(pInst->regBaseFlags[i]==VXB_REG_MEM)break;}pDrvCtrl->feiBar=pInst->pRegBase[i];/*storethebaseaddress*/vxbRegMap(pInst,i,&pDrvCtrl->feiHandle);/*mapthewindow*/這段程序完成的功能是首先查找空間,找到VXB_REG_MEM時(shí),跳出,將地址存儲到【pDrvCtrl】中,同時(shí)調(diào)用函數(shù)完成映射,返回句柄,供繼續(xù)讀寫用。中斷處理vxbIntConnect()vxbIntDisconnect()vxbIntEnable()vxbIntDisable()同步任務(wù)水平的同步采用信號量〔這里說mux〕,spinlock,中斷鎖。中斷水平的同步采用信號量〔mux〕,添加item到消息隊(duì)列。當(dāng)使用后者時(shí),在ISR中使用msgsend時(shí),timeout應(yīng)該為zero。中斷水平的同步采用中斷鎖intCpulock,unCpuLockkey=intCpuLock();/*accessshareddatastructures.*/intCpuUnlock(key);注意雖然中斷鎖很簡單,很有效,但是現(xiàn)在不怎么使用中斷鎖了,因?yàn)橐韵聝蓚€(gè)原因增加了系統(tǒng)開銷。在多個(gè)CPU或vxwroksSMP模式下中斷鎖不起作用。第3章vxWorks網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)驅(qū)動(dòng)說明風(fēng)河早期的驅(qū)動(dòng)采用legacydriver,在早期的版即vxWorks5.x中使用,在新的版本中已經(jīng)不再提供legacydriver了,特別是使用SMP的用戶,風(fēng)河強(qiáng)烈建議采用vxbus模型的驅(qū)動(dòng)。驅(qū)動(dòng)開發(fā)可利用到的資源包含網(wǎng)絡(luò)驅(qū)動(dòng),總線控制,定時(shí)器驅(qū)動(dòng),串行設(shè)備驅(qū)動(dòng)。installDir/vxWorks-6.xinstallDir/vxWorks-6.xinstallDir/vxWorks-6.xinstallDir/vxWorks-6.x/target/src關(guān)于定時(shí)器驅(qū)動(dòng)installDir/vxWorks-6.x這里的驅(qū)動(dòng)采用vxbus模型開發(fā),是從legacydriver遷移到vxbus的。installDir/vxWorks-6.x提供了PPC8260的定時(shí)器驅(qū)動(dòng),采用legacydriver開發(fā)。驅(qū)動(dòng)類別注意開發(fā)驅(qū)動(dòng)對vxWorks的I/O系統(tǒng)也要有所了解。通用類別:串行設(shè)備。軟件提供open〔〕,write〔〕,ioctl〔〕調(diào)用。串行設(shè)備驅(qū)動(dòng)例程存放路徑installDir/vxWorks-6.x/target/src/hwif/sio存儲設(shè)備管理ram,taperam,及其板上的flash設(shè)備,ATA盤,串行ata盤,scsi盤,usbflash盤等。路徑:installDir/vxWorks-6.x/target/src/hwif/storage網(wǎng)絡(luò)接口驅(qū)動(dòng)MAC層驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/endMAC驅(qū)動(dòng)與MUX相連。物理層驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/miiPHY與MAC之間由MII相連。NVRAM〔非易失性RAM〕驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/nvram定時(shí)器驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/timer定時(shí)器驅(qū)動(dòng)的作用:告訴CPU某事件已經(jīng)消耗了指定時(shí)間提供加減計(jì)數(shù)DMA驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/dmaBusControllerDrivers〔總線控制器驅(qū)動(dòng)〕為不同的總線之間提供接口每一個(gè)CPU在設(shè)計(jì)的時(shí)候都提供了一個(gè)與外界相連的接口,稱為總線接口。一般情況下,不考慮CPU類型,直接與總線相連,稱為PLB〔processorlocalbus〕。在某些情況下,需要將不同的總線之間進(jìn)行橋接,用到PCE或VME.installDir/vxWorks-6.x/target/src/hwif/busCtlr作用:總線控制器確定系統(tǒng)當(dāng)前是那種總線在工作。2.總線控制器負(fù)責(zé)配置下行設(shè)備,使之能夠工作。3.總線控制器負(fù)責(zé)管理地址映射。USB驅(qū)動(dòng)USB主機(jī)設(shè)配驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/busCtlr/usb/hcdUSB類驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/drv/usbInterruptControllerDrivers〔中斷控制器驅(qū)動(dòng)〕作用:當(dāng)設(shè)備產(chǎn)生中斷時(shí),中斷控制器負(fù)責(zé)將中斷傳遞個(gè)處理器,并且保證其他中斷源不再送往CPU當(dāng)其正在處理當(dāng)前中斷時(shí)。installDir/vxWorks-6.x/target/src/hwif/intCtlrMultifunctionDriversRemoteProcessingElementDriversinstallDir/vxWorks-6.x/target/src/hwif/cpuconsole驅(qū)動(dòng)installDir/vxWorks-6.x/target/src/hwif/consoleResourceDriversinstallDir/vxWorks-6.x/target/src/hwif/resource資源驅(qū)動(dòng)的功能是為外圍設(shè)備及其配置資源其他類A/DD/A要寫驅(qū)動(dòng),首先要知道驅(qū)動(dòng)文件所在位置,這里有三個(gè)路徑存放與驅(qū)動(dòng)有關(guān)的文件installDir/vxWorks-6.x/target/3rdpartyVxBusmodeldevicedriverswrittenbythirdpartydevelopersthatareinstalledasadd-onstoanexistingVxWorksinstallation.installDir/vxWorks-6.x/target/src/hwifDriverswrittenincompliancewiththeVxBusdevicemodel,distributedandsupportedbyWindRiver,andprovidedaspartofastandardproduct,installationorpatch.installDir/vxWorks-6.x/target/src/drvWindRiverlegacydrivers(notinVxBuscompliance).這里的驅(qū)動(dòng)是采用legacy,模型〔區(qū)別于vxbus模型〕,Legacy模型用于驅(qū)動(dòng)開發(fā)是應(yīng)用在vxworks早期版本中。驅(qū)動(dòng)源文件提供某些實(shí)體的邏輯實(shí)現(xiàn)DriversourcefileinstallDir/vxWorks-6.x/target/src/hwifThird-partydriversarefoundunder:installDir/vxWorks-6.x/target/3rdpartyTheexampleinthissectiondiscussesthefilelocations3.2Vxworks下網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā)說明:vxworks下網(wǎng)絡(luò)驅(qū)動(dòng)開發(fā),是本文檔要講述的重點(diǎn)。在本章節(jié)中,將重點(diǎn)介紹vxworks下驅(qū)動(dòng)開發(fā)要完成的工作,熟悉驅(qū)動(dòng)開發(fā)有關(guān)的源文件及其頭文件,根據(jù)具體情況進(jìn)行修改和配置。理解使用vxbus開發(fā)模型進(jìn)行驅(qū)動(dòng)開發(fā)的一般流程。知道在系統(tǒng)初始化過程系統(tǒng)是如何對網(wǎng)絡(luò)驅(qū)動(dòng)進(jìn)行初始化的,包括網(wǎng)絡(luò)驅(qū)動(dòng)的聲明,注冊等。在本章節(jié)中,讀者要重點(diǎn)關(guān)注與網(wǎng)絡(luò)驅(qū)動(dòng)有關(guān)的頭文件,源文件〔對于命名中有end這樣字眼的程序要多加留意〕,可以仔細(xì)研讀,發(fā)現(xiàn)其中的一般性。最后結(jié)合風(fēng)河代碼,給出一款網(wǎng)卡驅(qū)動(dòng)的開發(fā)方法。vxWorks網(wǎng)絡(luò)協(xié)議棧與windows下TCP/IP協(xié)議棧相比,vxWorks增加了MUX層。VxWorks下網(wǎng)絡(luò)驅(qū)動(dòng)的開發(fā)要掌握的根本概念網(wǎng)絡(luò)驅(qū)動(dòng)包括MAC層驅(qū)動(dòng)和PHY驅(qū)動(dòng)。MAC層和PHY層通過MII連接。MII是meidiaindependentinterface的縮寫,是一種連接機(jī)制。其他媒介還有SGMII,GMII,PLB等等??梢酝ㄟ^配置MAC相關(guān)的存放器實(shí)現(xiàn)。Vworks下網(wǎng)絡(luò)驅(qū)動(dòng)分為END模型驅(qū)動(dòng)和BSD模型驅(qū)動(dòng)。現(xiàn)在比擬流行的還是END模型驅(qū)動(dòng)。寫vxWorks下的驅(qū)動(dòng)只要實(shí)現(xiàn)模板函數(shù)完成的功能即可,如endload(),endunload(),endpollsend(),endpollreceive()等。具體函數(shù)看數(shù)據(jù)結(jié)構(gòu)netfun,有需要實(shí)現(xiàn)的函數(shù)接口。這些接口在系統(tǒng)初始化硬件的過程中有mux層調(diào)用實(shí)現(xiàn)。驅(qū)動(dòng)開發(fā)者只需關(guān)心底層的這幾個(gè)函數(shù)實(shí)現(xiàn),無須關(guān)心mux層的實(shí)現(xiàn)方法。Socket與vxWorks網(wǎng)絡(luò)驅(qū)動(dòng)的關(guān)系Socket是在應(yīng)用層調(diào)用。起始在vxworks下表現(xiàn)為一種文件。通過socket在不同進(jìn)程之間傳遞信息。Socket的發(fā)送接收功能,說到底最后還是調(diào)用底層的驅(qū)動(dòng)send,receive實(shí)現(xiàn)。對vxwroks網(wǎng)絡(luò)驅(qū)動(dòng)有一點(diǎn)了解之后,我們來重點(diǎn)學(xué)習(xí)END驅(qū)動(dòng)了解什么是MUX這個(gè)圖說明MUX在協(xié)議棧中的位置,與傳統(tǒng)TCP/IP協(xié)議棧相比,增加了一層MUX,是數(shù)據(jù)鏈路層與IP層之間的接口。這里的協(xié)議層是與傳輸層及其往上應(yīng)用層的接口。與其他TCP/IP協(xié)議相比VxWorks網(wǎng)絡(luò)協(xié)議棧增加一層MUX層。MUX層是VxWorks為方便在網(wǎng)絡(luò)接口硬件上實(shí)現(xiàn)多種協(xié)議而增加的一層。它主要用于管理底層的多種硬件的設(shè)備驅(qū)動(dòng),向上層不同協(xié)議提供統(tǒng)一的接口,降低了上層協(xié)議與底層物理硬件的藕合,使得網(wǎng)絡(luò)驅(qū)動(dòng)和上層協(xié)議彼此保持獨(dú)立,既方便在現(xiàn)有硬件根底上實(shí)現(xiàn)新的上層協(xié)議,也利于用新的硬件支持原有的上層協(xié)議。MUX與END的交互是通過提供一套可供底層調(diào)用接口效勞來實(shí)現(xiàn)的,實(shí)現(xiàn)END驅(qū)動(dòng)必須遵循這套接口關(guān)系。如下圖。MUX與END的接口關(guān)系圖3中右邊框中列出的函數(shù)是驅(qū)動(dòng)需要實(shí)現(xiàn)的函數(shù),供MUX層調(diào)用在必要的時(shí)間調(diào)用,如當(dāng)上層使用該網(wǎng)卡發(fā)送數(shù)據(jù)時(shí),MUX會調(diào)用該網(wǎng)卡END驅(qū)動(dòng)提供的Send函數(shù),將數(shù)據(jù)提交給網(wǎng)卡芯片硬件。緩沖池?cái)?shù)據(jù)結(jié)構(gòu)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)與上層協(xié)議進(jìn)行數(shù)據(jù)交換需要相應(yīng)的內(nèi)存緩沖,并且管理這些緩沖也需要相應(yīng)的函數(shù)。VxWorks提供了netBufLib函數(shù)庫用于創(chuàng)立和管理網(wǎng)絡(luò)設(shè)備用到的內(nèi)存緩沖池,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)可以直接使用也可以在此根底上設(shè)計(jì)自己特定的內(nèi)存緩沖池。數(shù)據(jù)以簇的形式保存,數(shù)據(jù)結(jié)構(gòu)mBlks〔內(nèi)存塊〕和clBlks〔簇塊〕形成的數(shù)據(jù)鏈結(jié)構(gòu)那么用于指定各個(gè)簇。在clBlk之上是mBlk結(jié)構(gòu)。該結(jié)構(gòu)存儲一個(gè)到clBlk的連接,也可以存儲一個(gè)到另一個(gè)mBlk的連接。通過mBlk的連接,可以引用任意數(shù)量的數(shù)據(jù),如圖4所示。圖4mBlks和clBlks的數(shù)據(jù)結(jié)構(gòu)裝載及啟動(dòng)END設(shè)備的系統(tǒng)函數(shù)主要用到以下幾個(gè):(1).muxDevLoad()該函數(shù)裝載指定設(shè)備的驅(qū)動(dòng)程序裝載函數(shù)。如果要裝載END設(shè)備,系統(tǒng)必須調(diào)用muxDevLoad()函數(shù)。(2).muxDevStart()啟動(dòng)設(shè)備函數(shù)(3).muxBind()muxBind()可以將協(xié)議綁定到指定的END設(shè)備上。其調(diào)用過程是系統(tǒng)調(diào)用ipAttach()函數(shù),而該函數(shù)調(diào)用muxBind()函數(shù),綁定協(xié)議堆棧到MUX上的一個(gè)指定的網(wǎng)絡(luò)接口。當(dāng)一個(gè)網(wǎng)絡(luò)接口被關(guān)閉時(shí),ipAttach()函數(shù)將釋放網(wǎng)絡(luò)接口所關(guān)聯(lián)的TCP/IP堆棧模塊。裝載及啟動(dòng)END設(shè)備驅(qū)動(dòng)程序的流程如下:使用指定的END設(shè)備驅(qū)動(dòng)程序的BSP引導(dǎo)VxWorks系統(tǒng)時(shí),在引導(dǎo)過程中,系統(tǒng)將執(zhí)行任務(wù)tUsrRoot來完成如下各項(xiàng):(1)初始化網(wǎng)絡(luò)任務(wù)的工作隊(duì)列;(2)創(chuàng)立tNetTask任務(wù)來處理網(wǎng)絡(luò)任務(wù)工作隊(duì)列的條目;(3)調(diào)用muxDevLoad()裝載指定的網(wǎng)絡(luò)驅(qū)動(dòng)程序;(4)調(diào)用muxDevStart()啟動(dòng)指定的網(wǎng)絡(luò)驅(qū)動(dòng)程序。tUsrRoot任務(wù)調(diào)用MUX設(shè)備裝載函數(shù)muxDevLoad()和設(shè)備啟動(dòng)函數(shù)muxDevStart(),通過這兩個(gè)函數(shù)來裝載和啟動(dòng)設(shè)備驅(qū)動(dòng)程序。muxDevLoad()函數(shù)會根據(jù)網(wǎng)絡(luò)設(shè)備表endDevTbl[]中的定義逐一調(diào)用各網(wǎng)絡(luò)設(shè)備的裝載函數(shù),其中這個(gè)函數(shù)是muxDevLoad()的一個(gè)輸入?yún)?shù)。muxDevStart()函數(shù)也會根據(jù)endDevTbl[]逐一調(diào)用網(wǎng)絡(luò)設(shè)備所定義的設(shè)備開始函數(shù)。至此MUX的初始化以及END驅(qū)動(dòng)程序的初始化工作已經(jīng)完成。但是網(wǎng)絡(luò)設(shè)備還是不可以使用,因?yàn)檫€需要將協(xié)議綁定到指定的END指定的設(shè)備上,這一步需要用muxBind()函數(shù)實(shí)現(xiàn)。在VxWorks中,系統(tǒng)通過usrRoot()函數(shù)調(diào)用usrNetInit()函數(shù)完成MUX的初始化、裝載網(wǎng)絡(luò)設(shè)備表endDevTbl[]中描述的所有設(shè)備并將IP協(xié)議綁定到網(wǎng)絡(luò)引導(dǎo)設(shè)備上等工作。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的安裝過程即圖5所示的網(wǎng)絡(luò)初始化順序。圖5網(wǎng)絡(luò)初始化順序發(fā)送數(shù)據(jù)在VxWorks網(wǎng)絡(luò)系統(tǒng)中,發(fā)送數(shù)據(jù)的流程如圖6。圖6數(shù)據(jù)發(fā)送通過對圖6分析,主要包含以下幾個(gè)處理。(1)用戶調(diào)用write()函數(shù),通過套接字訪問網(wǎng)絡(luò)。(2)網(wǎng)絡(luò)協(xié)議拷貝需要發(fā)送的數(shù)據(jù)到網(wǎng)絡(luò)緩沖區(qū)中,并調(diào)用協(xié)議驅(qū)動(dòng)程序的發(fā)送程序。(3)協(xié)議驅(qū)動(dòng)程序調(diào)用muxSend()啟動(dòng)發(fā)送循環(huán)。(4)muxSend()通過調(diào)用send()回調(diào)函數(shù),把緩沖區(qū)傳遞給END。(5)數(shù)據(jù)發(fā)送程序把數(shù)據(jù)拷貝到設(shè)備緩沖區(qū)中,并把它放置到設(shè)備的發(fā)送隊(duì)列中。(6)當(dāng)產(chǎn)生發(fā)送中斷時(shí),驅(qū)動(dòng)程序的中斷效勞程序調(diào)度程序丟棄已發(fā)送的數(shù)據(jù)包,徹底清理發(fā)送隊(duì)列。接收數(shù)據(jù)在VxWorks網(wǎng)絡(luò)系統(tǒng)中,接收數(shù)據(jù)的流程如圖7。通過對圖7進(jìn)行分析,它主要包含以下幾個(gè)處理。(1)設(shè)備接收到數(shù)據(jù)包后直接把數(shù)據(jù)存放到預(yù)先分配的簇中。(2)當(dāng)接收到中斷時(shí),驅(qū)動(dòng)程序的中斷效勞程序調(diào)度任務(wù)級接收程序進(jìn)行如下操作。①clBlk結(jié)構(gòu)和簇連接;mBlk和clBlk連接;最后構(gòu)成緩沖區(qū)。②通過調(diào)用receiveRtn()函數(shù),把緩沖區(qū)傳遞給更高級別的協(xié)議。(3)muxReceive()調(diào)用協(xié)議的stackRcvRtn()函數(shù),把成列的緩沖區(qū)傳遞給應(yīng)用。用戶使用read()函數(shù),通過套接字訪問網(wǎng)絡(luò)中的成列緩沖區(qū)驅(qū)動(dòng)程序的中斷處理中斷處理函數(shù)fei82557INT()處理設(shè)備中斷。根據(jù)中斷狀態(tài)調(diào)用相應(yīng)的中斷處理程序,如接收終端程序、發(fā)送中斷程序等。當(dāng)網(wǎng)絡(luò)接口產(chǎn)生中斷時(shí),系統(tǒng)調(diào)用中斷效勞程序。為了將中斷阻塞減到最小,中斷驅(qū)動(dòng)程序只處理那些需要最小時(shí)間的工作,把其他耗時(shí)的任務(wù)排列到網(wǎng)絡(luò)任務(wù)的工作隊(duì)列中。為了排列任務(wù)級的包接收處理工作,網(wǎng)絡(luò)驅(qū)動(dòng)程序中斷效勞程序必須調(diào)用netJobAdd()函數(shù)。在調(diào)用netJobAdd()函數(shù)時(shí),應(yīng)當(dāng)指定任務(wù)級處理數(shù)據(jù)包的驅(qū)動(dòng)程序入口。然后由netJobAdd()把函數(shù)指派到網(wǎng)絡(luò)系統(tǒng)任務(wù)——tNetTask的工作隊(duì)列中。VxWorks通過tNetTask處理任務(wù)級的網(wǎng)絡(luò)處理。tNetTask調(diào)用隊(duì)列中處理程序如下:〔1〕包接收程序:把接收到的數(shù)據(jù)包上傳到網(wǎng)絡(luò)緩沖區(qū)的堆棧中,通過一個(gè)調(diào)用上傳給MUX?!?〕釋放所有發(fā)送幀程序:程序調(diào)用netClFree()函數(shù)釋放發(fā)送緩沖區(qū)中所有已經(jīng)發(fā)送的數(shù)據(jù)幀。協(xié)議層執(zhí)行以下入口點(diǎn)stackShutdownRtn()stackError()stackRcvRtn()stackTxRestartRtn()Mux與網(wǎng)絡(luò)驅(qū)動(dòng)之間的接口這局部學(xué)習(xí)可以參考風(fēng)河代碼MuxLibmux執(zhí)行的函數(shù)有muxbind〔〕,muxDevload〔〕等。Mux相關(guān)API詳解muxDevLoad()將設(shè)備裝載到MUXmuxDevStart()從MUX啟動(dòng)設(shè)備muxBind()綁定協(xié)議層到MUX〔hook〕muxSend()從協(xié)議層接收數(shù)據(jù)包,然后發(fā)往設(shè)備muxDataPacketGet()獲取一個(gè)只包含包數(shù)據(jù)的mblk,不包含鏈路層次的頭部信息〔omitted.〕muxAddressForm()將包地址放入指定的buffer.muxIoctl()訪問控制函數(shù)muxMCastAddrAdd()為設(shè)備中的表添加一個(gè)多播地址muxMCastAddrDel()刪除一個(gè)多播表muxMCastAddrGet()獲取設(shè)備中的多播地址表muxUnbind()斷開協(xié)議層與MUX層的鏈接muxDevStop()停止設(shè)備muxDevUnload()卸載設(shè)備muxPacketDataGet()提起一個(gè)submittedmblk中的包數(shù)據(jù),并將它寫入一個(gè)新的mblkmuxPacketAddrGet()從一個(gè)submittedmblk中提取數(shù)據(jù)包中的源地址和目的地址,并將每個(gè)地址寫入它們自己的mblk。如果本地源/目的地址與END源/目的地址不同,函數(shù)將吸入足夠多的mblk。Ifthelocalsource/destinationaddressesdifferfromtheendsource/destinationaddresses,thisroutinewritestoasmanyasfourmBlks.muxTxRestart()由stackTxRestartRtn()調(diào)用,往底層發(fā)送數(shù)據(jù)包。muxReceive()接收來自設(shè)備的包發(fā)往MUXmuxShutdown()關(guān)閉與設(shè)備有關(guān)的所有協(xié)議。muxAddrResFuncAdd()添加一個(gè)地址解決函數(shù)muxAddrResFuncGet()從列表中獲取一個(gè)特別的地址解決函數(shù)muxAddrResFuncDel()從列表中刪除一個(gè)特別的地址解決函數(shù)這個(gè)圖說明了三個(gè)層次之間的關(guān)系,對于驅(qū)動(dòng)開發(fā)者來說,只需關(guān)心實(shí)現(xiàn)END的相關(guān)接口即可。注意這里有一個(gè)問題,我們發(fā)現(xiàn)在protocol層上并沒有調(diào)用muxsend的接口。不是沒有,而是在標(biāo)準(zhǔn)的API之外〔風(fēng)河文檔說明〕協(xié)議層(protocol)的數(shù)據(jù)結(jié)構(gòu)Mux使用該數(shù)據(jù)結(jié)構(gòu)存儲于協(xié)議有關(guān)的信息typedefstructnet_protocol{NODEnode;/*Howwestayinalist.*/charname[32];/*Stringnameforthisprotocol.*/longtype;/*ProtocoltypefromRFC1700*/intflags;/*Isprotocolinapromiscuousmode?*/BOOL(*stackRcvRtn)(void*,long,M_BLK_ID,M_BLK_ID,void*);/*Theroutinetocallwhenweget*//*apacket.*/STATUS(*stackShutdownRtn)(void*,void*);/*Theroutinetocalltoshutdown*//*theprotocolstack.*/STATUS(*stackTxRestartRtn)(void*,void*);/*Callbackforrestartingonblockedtx.*/void(*stackErrorRtn)(END_OBJ*,END_ERR*,void*);/*Callbackfordeviceerrors.*/void*pSpare;/*Sparepointerthatcanbepassedto*//*theprotocol.*/}NET_PROTOCOL;接收數(shù)據(jù)包發(fā)往協(xié)議層stackRcvRtn()voidstackRcvRtn(void*pCookie,/*returnedbymuxBind()call*/longtype,/*protocoltypefromRFC1700*/M_BLK_IDpNetBuff,/*packetwithlinklevelinfo*/LL_HDR_INFO*pLinkHdr,/*link-levelheaderinfostructure*/void*pSpare/*avoid*theprotocolcanusetogetinfo*//*onreceive.ThiswaspassedtomuxBind().*/)返回錯(cuò)誤信息voidstackError(END_OBJ*pEnd,/*pointertoEND_OBJ*/END_ERR*pError,/*pointertoEND_ERR*/void*pSpare/*pointertoprotocolprivatedatapassedinmuxBind*/)typedefstructend_err{INT32errCode;/*errorcode,seeabove*/char*pMesg;/*NULL-terminatederrormessage,canbeNULL*/void*pSpare;/*pointertouserdefineddata,canbeNULL*/}END_ERR;關(guān)閉協(xié)議層voidstackShutdownRtn(void*pCookie/*ReturnedbymuxBind()call.*/void*pSpare/*avoid*thatcanbeusedbytheprotocoltoget*//*infoonreceive.ThiswaspassedtomuxBind().*/)重新發(fā)送voidmuxTxRestart(void*pCookie/*ReturnedbymuxBind()call.*/)網(wǎng)絡(luò)層往鏈路層地址解決STATUSmuxAddrResFuncAdd(longifType,/*Mediainterfacetypefromm2Lib.h*/longprotocol,/*ProtocoltypefromRFC1700*/FUNCPTRaddrResFunc/*Functiontocall.*/)STATUSmuxAddrResFuncDel(longifType,/*Mediainterfacetypefromm2Lib.h*/longprotocol/*ProtocoltypefromRFC1700*/)FUNCPTRmuxAddrResFuncGet(longifType,/*ifTypefromm2Lib.h*/longprotocol/*protocolfromRFC1700*/)Vxbus驅(qū)動(dòng)初始化過程驅(qū)動(dòng)初始化順序驅(qū)動(dòng)實(shí)例理解1.驅(qū)動(dòng)在vxwroks中注冊,使用如下數(shù)據(jù)結(jié)構(gòu)。LOCALstructdrvBusFuncscn3xxxTimerDrvFuncs={cn3xxxTimerInstInit,/*devInstanceInit*/cn3xxxTimerInstInit2,/*devInstanceInit2*/cn3xxxTimerInstConnect/*devConnect*/};2.描述驅(qū)動(dòng)支持的方法。LOCALstructvxbDeviceMethodcn3xxxTimerDrv_methods[]={DEVMETHOD(vxbTimerFuncGet,cn3xxxTimerFuncGet),{0,NULL}};3.提供驅(qū)動(dòng)注冊信息LOCALstructvxbDevRegInfocn3xxxTimerDrvRegistration={NULL,/*reservedforVxBususe*/VXB_DEVID_DEVICE,/*devID*/VXB_BUSID_PLB,/*busID=PLB*/VXB_VER_4_0_0,/*vxbVersion*/"cn3xxxTimerDev",/*drvName*/&cn3xxxTimerDrvFuncs,/*pDrvBusFuncs*/NULL/*pMethods*/NULL/*devProbe*/};。Vxwroks在啟動(dòng)過程中,將驅(qū)動(dòng)與特定的硬件相連。voidvxbCn3xxxTimerDrvRegister(void){vxbDevRegister(&cn3xxxTimerDrvRegistration);}驅(qū)動(dòng)在vxbus注冊后,vxwroks使用驅(qū)動(dòng)配置文件中的相關(guān)文件找到vxbus中注冊的驅(qū)動(dòng)函數(shù)的入口。特別說明VXBUS的驅(qū)動(dòng)初始化過程在每一個(gè)驅(qū)動(dòng)程序的最前面都可以看到,讀者可以翻開intalldirection\target\src\hwif\不管是網(wǎng)絡(luò)驅(qū)動(dòng)還是其他的串口驅(qū)動(dòng),都可以首先看到驅(qū)動(dòng)初始化相關(guān)的這四個(gè)函數(shù)。以下是風(fēng)河文檔的截屏這里有一些限制系統(tǒng)啟動(dòng)時(shí)iInstInit()由sysHwInit()調(diào)用。因?yàn)檫@個(gè)時(shí)候系統(tǒng)剛剛啟動(dòng),堆的初始化還沒完成。所以這里不能分配內(nèi)存等。所以這里只是初步初始化,只能訪問硬件存放器。在InstInit2()過程中,系統(tǒng)根本初始化完成,可以調(diào)用系統(tǒng)內(nèi)核中的內(nèi)核如信號量,可以使用malloc和free在堆中分配內(nèi)存。添加vxbus驅(qū)動(dòng)方法例程這個(gè)nicinstconnect是vxbus初始化的第三個(gè)步驟,直到這里才可以連接中斷。添加vxbus驅(qū)動(dòng)之后,要做的就是更新源文件中的名稱〔name〕;Ingeneral,youcanchangeallotherroutinestoLOCAL.VxWorks操作系統(tǒng)接口介紹驅(qū)動(dòng)如何是與操作系統(tǒng)接口的,即操作系統(tǒng)如何lauch驅(qū)動(dòng),如何把驅(qū)動(dòng)添加到操作系統(tǒng)中的,如何管理分配內(nèi)存資源的。通過操作系統(tǒng)中tNetTask任務(wù)完成的,開始由tNet0.取代。VxWorks如何lauch驅(qū)動(dòng)系統(tǒng)啟動(dòng)后,系統(tǒng)執(zhí)行任務(wù)tUsrRoot,處理以下事情初始化網(wǎng)絡(luò)工作任務(wù)隊(duì)列。執(zhí)行tNetTask,處理網(wǎng)絡(luò)工作隊(duì)列上的條目〔item〕。調(diào)用muxDevLoad()加載網(wǎng)絡(luò)驅(qū)動(dòng),把驅(qū)動(dòng)裝載到MUX層?!仓笥衜uxload調(diào)用endload〕調(diào)用muxDevStart()啟動(dòng)網(wǎng)絡(luò)驅(qū)動(dòng)。注冊中斷處理程序在endstart〔〕中調(diào)用sysIntConnect().。當(dāng)muxload驅(qū)動(dòng)時(shí),它調(diào)用muxDevstart〔〕,然后調(diào)用endstart〔〕驅(qū)動(dòng)入口點(diǎn)。使用tNetTask驅(qū)動(dòng)操作系統(tǒng)直接使用網(wǎng)絡(luò)驅(qū)動(dòng)處理進(jìn)來的包,直接將包分發(fā)處理交給應(yīng)用程序,ThisoperationisdoneinthelowerhalfoftheOS,fromwithininterruptcontext.Therefore,muchofthenetworkstackisexecutedfromwithininterruptserviceroutines(ISRs).這個(gè)操作經(jīng)常在低效率的操作系統(tǒng)中完成,由中斷效勞函數(shù)完成。但是vxWorks是實(shí)時(shí)操作系統(tǒng),ISR必須短,所以vxWorks沒有使用長的ISR來處理包。因?yàn)檫@個(gè)原因,所有關(guān)于協(xié)議棧的包的處理,vxWroks都交給了tNettask來處理fromwithaISR。中斷處理一旦接受到設(shè)備發(fā)送過來的中斷,vxWorks立即喚醒之前注冊的中斷效勞函數(shù)執(zhí)行,而且要盡快處理完成。所以這里中斷效勞函數(shù)完成了最根本的事情:錯(cuò)誤/狀態(tài)改變。為了給包拒絕任務(wù)排隊(duì),ISR必須使用netjobAdd函數(shù)。使用tNetTask處理任務(wù)層次的網(wǎng)絡(luò)處理。STATUSnetJobAdd(FUNCPTRroutine,/*routinetoaddtonetTaskworkqueue*/intparam1,/*firstargtoaddedroutine*/intparam2,/*secondargtoaddedroutine*/intparam3,/*thirdargtoaddedroutine*/intparam4,/*fourthargtoaddedroutine*/intparam5/*fifthargtoaddedroutine*/)中斷處理往往提供三種功能,寫驅(qū)動(dòng)時(shí)必須注意處理接收中斷。包發(fā)送出去后,將資源還給緩沖池。處理錯(cuò)誤事件。如何添加網(wǎng)絡(luò)接口驅(qū)動(dòng)到vxWorks編譯并include代碼到vxWorksimage〔參考workbech使用方法或者內(nèi)核編程〕。創(chuàng)立END驅(qū)動(dòng)的配置表〔endDevTbl[]〕.信息,讓MUX識別END驅(qū)動(dòng),往表里面添加具體的驅(qū)動(dòng)信息,配置,要使用define包含某些信息。系統(tǒng)初始化過程中由usrNetInit()完成網(wǎng)絡(luò)設(shè)備的初始化,默認(rèn)情況下市自動(dòng)調(diào)用的,所以宏定義中一般包含INCLUDE_NETWORK和INCLUDE_NET_INITsysDev.c,這個(gè)函數(shù)也要注意,包含驅(qū)動(dòng)訪問存放器相關(guān)定義及其代碼。例如如果創(chuàng)立兩種網(wǎng)絡(luò)設(shè)備,一種支持bufferloaning,一種不支持。那么首先就必須修改中相關(guān)宏定義/*Parametersforloadingthedriversupportingbufferloaning.*/#defineLOAD_FUNC_0ln7990EndLoad#defineLOAD_STRING_0"0xfffffe0:0xffffffe2:0:1:1"#defineBSP_0NULL/*ParametersforloadingthedriverNOTsupportingbufferloaning.*/#defineLOAD_FUNC_1LOAD_FUNC_0#defineLOAD_STRING_1"0xffffee0:0xfffffee2:4:1:1"#defineBSP_1NULLEND_LOAD_FUNC確定驅(qū)動(dòng)的入口點(diǎn),例如如果你的驅(qū)動(dòng)endLoad〔〕入口點(diǎn)是fei82557EndLoad(),,那么在必須做如下配置#defineEND_LOAD_FUNCfei82557EndLoadEND_LOAD_STRING傳遞給muxDevLoad的初始串參數(shù)。注意每一個(gè)END驅(qū)動(dòng)的參數(shù)都不同,在寫驅(qū)動(dòng)的時(shí)候要仔細(xì)檢查。編輯endTbl表中的信息,確保END驅(qū)動(dòng)包含到鏡像中。表在configNet.h中。END_TBL_ENTRYendTbl{{0,LOAD_FUNC_0,LOAD_STRING_0,BSP_0,FALSE},{1,LOAD_FUNC_1,LOAD_STRING_1,BSP_1,FALSE},{0,END_TBL_END,0,NULL},};注意這里的FALSE表示入口沒有被處理。當(dāng)系統(tǒng)成功加載了驅(qū)動(dòng),這里的FALSE將被改為TRUE。最后修改BSPconfig.hfiletodefineINCLUDE_END.這將告訴進(jìn)程包含END驅(qū)動(dòng)。當(dāng)新的映像重新啟動(dòng)時(shí),系統(tǒng)調(diào)用MuxDevLoad,完成相關(guān)設(shè)備的初始化。與END驅(qū)動(dòng)有關(guān)的5中結(jié)構(gòu)需要分配內(nèi)存驅(qū)動(dòng)控制結(jié)構(gòu)END_Driver接收和發(fā)送描述符〔與DMA的操作有關(guān),見文檔〕相關(guān)列表Mblk,clblkClusterbuffers建立使用緩存來處理數(shù)據(jù)包mBlks,clBlks,andClusterBuffersvxWorks協(xié)議棧提供netBufLib,來管理內(nèi)存,其使用的根本元素是mblk,clblk。Clusters包含mblk和clblk。我們稱由mblk和clblk以某種方式相連的結(jié)構(gòu)稱為BufLib提供了兩個(gè)重要函數(shù)netPoolCreate()創(chuàng)立一個(gè)網(wǎng)絡(luò)池netPoolInit().風(fēng)河強(qiáng)烈推薦開發(fā)者使用前者而非后者。通常的cluster大小是64,128,256,512,1024,2048。網(wǎng)絡(luò)的最大傳輸單元(MTU)是1500字節(jié)。如何建立網(wǎng)絡(luò)驅(qū)動(dòng)池1.Allocatememoryforanetworkbufferconfigurationstructureandaddenoughspacetoalsohold8additionalbytesforthepDrvCtrl->pNetBufCfg->pNamefield.if(pDrvCtrl->pNetBufCfg=(NETBUF_CFG*)memalign(sizeof(long),(sizeof(NETBUF_CFG)+END_NAME_MAX))==NULL)return(ERROR);bzero(pDrvCtrl->pNetBufCfg,sizeof(NETBUF_CFG));2.InitializethepNamefield.pDrvCtrl->pNetBufCfg->pName=(char*)((int)pDrvCtrl->pNetBufCfg+sizeof(NETBUF_CFG));sprintf(pDrvCtrl->pNetBufCfg->pName,"%s%d","fei",pDrvCtrl->unit);3.Settheattributestobecached,cache-aligned,sharable,andISRsafe.pDrvCtrl->pNetBufCfg->attributes=ATTR_AC_SH_ISR;4.UseaNULLvaluetosetpDomaintokernel.ThisinstructsnetPoolCreate()toallocatememoryaccessibleinthekerneldomain.pDrvCtrl->pNetBufCfg->pDomain=NULL;5.SettheratioofmBlkstoclusters.pDrvCtrl->pNetBufCfg->ctrlNumber=pDrvCtrl->nClusters*10;6.UseaNULLvaluetosetthememorypartitionofmBlkstokernel.pDrvCtrl->pNetBufCfg->ctrlPartId=NULL;7.Fornow,setextramemorysizetozero.pDrvCtrl->pNetBufCfg->bMemExtraSize=0;8.Settheclustermemorypartitiontokernel,useNULL.pDrvCtrl->pNetBufCfg->bMemPartId=NULL;9.Allocatememoryforthenetworkclusterdescriptor.pDrvCtrl->pNetBufCfg->pClDescTbl=(NETBUF_CL_DESC*)memalign(sizeof(long),sizeof(NETBUF_CL_DESC));10.Initializetheclusterdescriptor.pDrvCtrl->pNetBufCfg->pClDescTbl->clSize=CLUSTER_SIZE;pDrvCtrl->pNetBufCfg->pClDescTbl->clNum=pDrvCtrl->nClusters*10;pDrvCtrl->pNetBufCfg->clDescTblNumEnt=1;11.CallnetPoolCreate()withthelinkpoolfunctiontable.if((pDrvCtrl->endObj.pNetPool=netPoolCreate((NETBUF_CFG*)pDrvCtrl->pNetBufCfg,_pLinkPoolFuncTbl))==NULL)return(ERROR);12.FreethepDrvCtrl->pNetBufCfgandpDrvCtrl->pNetBufCfg->pCIDescTbl.free(pDrvCtrl->pNetBufCfg->pClDescTbl);free(pDrvCtrl->pNetBufCfg);網(wǎng)絡(luò)驅(qū)動(dòng)中一種很重要的數(shù)據(jù)結(jié)構(gòu)END_OBJtypedefstructend_object{NODEnode;/*rootofthedevicehierarchy*/DEV_OBJdevObject;/*accessesyourdevice’sctrlstruct*/FUNCPTRreceiveRtn;/*routinetocallonreception*/BOOLattached;/*indicatesunitisattached*/SEM_IDtxSem;/*transmittersemaphore*/longflags;/*variousflags*/structnet_funcs*pFuncTable;/*functiontable*/M2_INTERFACETBLmib2Tbl;/*MIBIIcounters*/structETHER_MULTI*pAddrList;/*headofthemulticastaddresslist*/intnMulti;/*numberofelementsinthelist*/LISTprotocols;/*protocolnodelist*/BOOLsnarfProto;/*issomeonesnarfingus?*/void*pMemPool;/*memorycookieusedbyMUXbufrmgr.*/M2_ID*pMib2Tbl;/*RFC2233MIBobjects*/}END_OBJ;這里這里的flag很有含義,說明網(wǎng)絡(luò)的各種參數(shù)IFF_UP接口是開啟的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論