版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄第1章操作系統(tǒng)根本概念4實時操作系統(tǒng)和分時操作系統(tǒng)的區(qū)別4嵌入式操作系統(tǒng)VxWorks簡介41.3VxWorks的特點5可靠性5實時性51.3.3可裁減性6對一個實時內(nèi)核的要求61.4VxWorks的整體構(gòu)架7第2章vxWorks驅(qū)動開發(fā)預(yù)備72.1VxWorks映像82.2BSP主要文件目錄的組成及作用:11系統(tǒng)啟動順序142.4Vxworks驅(qū)動概要17第3章vxWorks網(wǎng)絡(luò)驅(qū)動開發(fā)21驅(qū)動類別223.2Vxworks下網(wǎng)絡(luò)驅(qū)動開發(fā)243.3VxWorks網(wǎng)絡(luò)驅(qū)動配置及分析60第4章VxWorks系統(tǒng)中常見問題65前言在通信,電子領(lǐng)域,目前主流的嵌入式操作系統(tǒng)為linux和vxworks。Linux多用于消費電子產(chǎn)品,像大家熟悉的andriod,原始系統(tǒng)就是linux,也就是說andriod也是一種linux系統(tǒng)。還有大家熟悉的MP3,也是使用linux操作系統(tǒng)的。Linux因為價格廉價〔開源的,不需要付licence〕,穩(wěn)定性好占據(jù)了一定的市場份額。Vxworks是風河系統(tǒng)1983開發(fā)的一款嵌入式實時操作系統(tǒng),多用于通信,導(dǎo)航,航天等領(lǐng)域。因為這些領(lǐng)域?qū)崟r性要求非常高,比方現(xiàn)在LTE系統(tǒng)就是使用vxworks系統(tǒng),因為是采用TDD模式,而這種模式,顯然對實時性要求非常高。也就注定了vxwroks在這些領(lǐng)域的特有優(yōu)勢。選擇linux還是vxworks看自己的專業(yè)方向,還有自己的興趣所有。每個領(lǐng)域只要研究透徹,都是很有前途的。既然兩者都是主流的嵌入式操作系統(tǒng),其還是有很多相似性。小編也初步接觸過linux,發(fā)現(xiàn)具備一定的linux根底對日后深入學(xué)習(xí)vxworks很有好處,很多思想都是相似的。另外,本人系小碩,目前的研究領(lǐng)域是vxworks驅(qū)動開發(fā),主攻網(wǎng)絡(luò)驅(qū)動開發(fā)。在平常的日常學(xué)習(xí)中,結(jié)合各位網(wǎng)友提供的資料〔自己在百度上收集的〕,還有workbench提供的document〔自己翻譯,特別是針對網(wǎng)絡(luò)驅(qū)動局部〕,希望對廣闊嵌入式驅(qū)動開發(fā)者有所幫助。聲明:此文檔并不適合于vxworks初學(xué)者,因為這里,小編省去了很多vxworks下的根本知識,包括內(nèi)核中常用的進程,信號量等等支持。也沒有提及集成開發(fā)環(huán)境tornado/vworkbench.這里的探索重點是vxwroks底層的東西,包括啟動過程,BSP開發(fā)等。附錄:Vxworks的應(yīng)用領(lǐng)域嵌入式Vxworks系統(tǒng)的主要應(yīng)用領(lǐng)域主要有以下幾方面:1.數(shù)據(jù)網(wǎng)絡(luò):如:以太網(wǎng)交換機、路由器、遠程接入效勞器等2.遠程通訊:如:電信用的專用分組交換機和自動呼叫分配器,蜂窩系統(tǒng)等3.醫(yī)療設(shè)備:如:放射理療設(shè)備4.消費電子:如:個人數(shù)字助理等5.交通運輸:如:導(dǎo)航系統(tǒng)、高速火車控制系統(tǒng)等6.工業(yè):如:機器人7.航空航天:如:衛(wèi)星跟蹤系統(tǒng)8.多媒體:如:電視會議設(shè)備9.計算機外圍設(shè)備:如:X終端、I/O系統(tǒng)等總之,VxWorks的系統(tǒng)結(jié)構(gòu)是一個相當小的微內(nèi)核的層次結(jié)構(gòu)。內(nèi)核僅提供多任務(wù)環(huán)境、進程間通信和同步功能。這些功能模塊足夠支持VxWorks在較高層次所提供的豐富的性能的要求。第1章操作系統(tǒng)根本概念實時操作系統(tǒng)和分時操作系統(tǒng)的區(qū)別從操作系統(tǒng)能否滿足實時性要求來區(qū)分,可把操作系統(tǒng)分成分時操作系統(tǒng)和實時操作系統(tǒng)。分時操作系統(tǒng)按照相等的時間片調(diào)度進程輪流運行,分時操作系統(tǒng)由調(diào)度程序自動計算進程的優(yōu)先級,而不是由用戶控制進程的優(yōu)先級。這樣的系統(tǒng)無法實時響應(yīng)外部異步事件。實時操作系統(tǒng)能夠在限定的時間內(nèi)執(zhí)行完所規(guī)定的功能,并能在限定的時間內(nèi)對外部的異步事件作出響應(yīng)。分時系統(tǒng)主要應(yīng)用于科學(xué)計算和一般實時性要求不高的場合。實時性系統(tǒng)主要應(yīng)用于過程控制、數(shù)據(jù)采集、通信、多媒體信息處理等對時間敏感的場合。VxWorks簡介VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設(shè)計開發(fā)的一種嵌入式實時操作系統(tǒng)〔RTOS〕,是嵌入式開發(fā)環(huán)境的關(guān)鍵組成局部。良好的持續(xù)開展能力、高性能的內(nèi)核以及友好的用戶開發(fā)環(huán)境,在嵌入式實時操作系統(tǒng)領(lǐng)域占據(jù)一席之地。它以其良好的可靠性和卓越的實時性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機導(dǎo)航等。在美國的F-16、FA-18戰(zhàn)斗機、B-2隱形轟炸機和愛國者導(dǎo)彈上,甚至連1997年4月在火星外表登陸的火星探測器上也使用到了VxWorks。VxWorks操作系統(tǒng)是一個嵌入式實時操作系統(tǒng)〔RTOS〕。VxWorks與其它實時OS一樣,基于以下兩個重要機制:多任務(wù)環(huán)境及任務(wù)間通信。硬件中斷處理。VxWorks多任務(wù)內(nèi)核完成的功能是:實時調(diào)度,任務(wù)間通信及互斥。其它功能那么作為系統(tǒng)庫圍繞在內(nèi)核周圍,它們可根據(jù)需要進行剪裁。VxWorks與非實時系統(tǒng)的不同之處在于:VxWorks的優(yōu)先搶占機制基于調(diào)度,VxWorks對外部事件的反響和處理快,VxWorks容量小并且可配置〔微內(nèi)核結(jié)構(gòu)〕1.3VxWorks的特點可靠性操作系統(tǒng)的用戶希望在一個工作穩(wěn)定,可以信賴的環(huán)境中工作,所以操作系統(tǒng)的可靠性是用戶首先要考慮的問題。而穩(wěn)定、可靠一直是VxWorks的一個突出優(yōu)點。自從對中國的銷售解禁以來,VxWorks以其良好的可靠性在中國贏得了越來越多的用戶。實時性
實時性是指能夠在限定時間內(nèi)執(zhí)行完規(guī)定的功能并對外部的異步事件作出響應(yīng)的能力。實時性的強弱是以完成規(guī)定功能和作出響應(yīng)時間的長短來衡量的。
VxWorks的實時性做得非常好,其系統(tǒng)本身的開銷很小,進程調(diào)度、進程間通信、中斷處理等系統(tǒng)公用程序精練而有效,它們造成的延遲很短。VxWorks提供的多任務(wù)機制中對任務(wù)的控制采用了優(yōu)先級搶占〔PreemptivePriorityScheduling〕和輪轉(zhuǎn)調(diào)度〔Round-RobinScheduling〕機制,也充分保證了可靠的實時性,使同樣的硬件配置能滿足更強的實時性要求,為應(yīng)用的開發(fā)留下更大的余地。1.3.3可裁減性用戶在使用操作系統(tǒng)時,并不是操作系統(tǒng)中的每一個部件都要用到。例如圖形顯示、文件系統(tǒng)以及一些設(shè)備驅(qū)動在某些嵌入系統(tǒng)中往往并不使用。VxWorks由一個體積很小的內(nèi)核及一些可以根據(jù)需要進行定制的系統(tǒng)模塊組成。VxWorks內(nèi)核最小為8kB,即便加上其它必要模塊,所占用的空間也很小,且不失其實時、多任務(wù)的系統(tǒng)特征。由于它的高度靈活性,用戶可以很容易地對這一操作系統(tǒng)進行定制或作適當開發(fā),來滿足自己的實際應(yīng)用需要。1.3.4對一個實時內(nèi)核的要求一個實時操作系統(tǒng)內(nèi)核需滿足許多特定的實時環(huán)境所提出的根本要求,這些包括:多任務(wù):由于真實世界的事件的異步性,能夠運行許多并發(fā)進程或任務(wù)是很重要的。多任務(wù)提供了一個較好的對真實世界的匹配,因為它允許對應(yīng)于許多外部事件的多線程執(zhí)行。系統(tǒng)內(nèi)核分配CPU給這些任務(wù)來獲得并發(fā)性。搶占調(diào)度:真實世界的事件具有繼承的優(yōu)先級,在分配CPU的時候要注意到這些優(yōu)先級?;趦?yōu)先級的搶占調(diào)度,任務(wù)都被指定了優(yōu)先級,在能夠執(zhí)行的任務(wù)〔沒有被掛起或正在等待資源〕中,優(yōu)先級最高的任務(wù)被分配CPU資源。換句話說,當一個高優(yōu)先級的任務(wù)變?yōu)榭蓤?zhí)行態(tài),它會立即搶占當前正在運行的較低優(yōu)先級的任務(wù)。任務(wù)間的通訊與同步:在一個實時系統(tǒng)中,可能有許多任務(wù)作為一個應(yīng)用的一局部執(zhí)行。系統(tǒng)必須提供這些任務(wù)間的快速且功能強大的通信機制。內(nèi)核也要提供為了有效地共享不可搶占的資源或臨界區(qū)所需的同步機制。任務(wù)與中斷之間的通信:盡管真實世界的事件通常作為中斷方式到來,但為了提供有效的排隊、優(yōu)先化和減少中斷延時,我們通常希望在任務(wù)級處理相應(yīng)的工作。所以需要雜任務(wù)級和中斷級之間存在通信。1.4VxWorks的整體構(gòu)架VxWorks支持多種處理器,對硬件不做假設(shè),可支持ARM.PPC,MPIS架構(gòu)處理器。第2章vxWorks驅(qū)動開發(fā)預(yù)備BSP定義:Boardsupportpacket,為各種目標板的硬件功能提供了統(tǒng)一的軟件接口它們包括:硬件初始化中斷處理和產(chǎn)生硬件時鐘和定時器管理內(nèi)存映射和分配BSP還包括bootRom和其它啟動機制,sysLib和sysALib庫是VxWorks可移植的核心,BSP庫是硬件與軟件的接口,處理硬件的初始化、中斷處理與產(chǎn)生、硬件時鐘與定時管理、局部和總線內(nèi)存空間的映射、內(nèi)存大小定義,等等2.1VxWorks映像用戶通過定制VxWorks組件和進行應(yīng)用程序開發(fā)所生成映像包括wind多任務(wù)微內(nèi)核,也包括BSP的引導(dǎo)代碼Vxworks映像的三局部組成BSS段〔BlockStartedbySymbol,未手動初始化的數(shù)據(jù)〕代碼段數(shù)據(jù)段兩大類BootRom類型映像VxWorks類型BootRom類型映像最小化、專用的VxWorks引導(dǎo)映像,實現(xiàn)最少的系統(tǒng)初始化用于啟動裝載VxWorks映像,功能類似于PC機的BIOS。BootRom運行時建立起多任務(wù)環(huán)境usrRoot任務(wù)、網(wǎng)絡(luò)任務(wù)〔tNettask〕、TFFS任務(wù)和FTP任務(wù)等。運行地點可能在ROM/Flash中執(zhí)行(例如ROM駐留型引導(dǎo)映像),也可能在RAM中執(zhí)行。在系統(tǒng)中其對應(yīng)的編譯規(guī)那么文件是BootRom類型分為三種BootRom_res一直運行在rom中的映象,只把data段拷貝到ram里面。BootRom_uncmp非壓縮方式的映象,data段和text段都要拷貝到ram里面,并在ram里面運行。BootRom壓縮方式的映象,生成的時候編譯器會把除掉romlnit.s和之外的目標文件壓縮并“匯編〞成一個,最后和,,進行鏈接,生成bootrom映像。要全部拷貝到ram中,并必須要進行解壓縮的工作。而這些工作根本上都是在中進行的。VxWorks類型映像系統(tǒng)的主映像,是系統(tǒng)最終要運行的映像該映像在運行時至少有一局部(如:數(shù)據(jù)段和BSS段)需要在RAM中運行。在系統(tǒng)中其對應(yīng)的編譯規(guī)那么文件是Vxworks類型映像運行環(huán)境RAM運行的壓縮的ROM運行的非壓縮的VxWorks類型四種映像VxWorks:RAM運行的VxWorks映像不包含引導(dǎo)程序,需要獨立的引導(dǎo)程序從本地存儲器或者經(jīng)由網(wǎng)絡(luò)獲取該映像,然后將其下載到RAM中的RAM_LOW_LADRS處運行VxWorks_romROM自動RAM運行的VxWorks映像,不需要BootRom輔助VxWorks_romResidentROM啟動ROM運行的VxWorks映像,不需要BootRom輔助。包含引導(dǎo)代碼,在重啟時清空RAM,引導(dǎo)代碼只將data段拷貝到RAM中的RAM_LOW_ADRS處,系統(tǒng)的運行是在ROM中進行的,啟動速度快,需要的RAM空間少,但是運行速度慢。VxWorks_romCompressVxWorks_rom的壓縮形式VxWorks型vsBootROM型映像對于沒有自啟動功能的VxWorks類型映像(如VxWorks型),映像運行前需一段程序?qū)⒃撚诚窨截惖絉AM中運行,BootRom類型映像完成VxWorks系統(tǒng)下載,完畢后BootRom的任務(wù)就結(jié)束了二者在系統(tǒng)初始化的時候,所做的功能根本相同,BootRom類型映像調(diào)用,而VxWorks類型映像調(diào)用映像鏈接方式可被靜態(tài)或動態(tài)鏈接VxWorks在開發(fā)階段可動態(tài)地下載目標文件,并與操作系統(tǒng)及其它目標文件動態(tài)鏈接。鏈接以后是浮動的,只在裝載時才與絕對物理地址相對應(yīng)。靜態(tài)VxWorks成品階段是采用靜態(tài)鏈接的。要對系統(tǒng)底層驅(qū)動清楚,也就是對CPU及相關(guān)的硬件有所了解.主要是32微處理器(上電啟動過程,downloadimage的方式方法,讀寫ROM,地址空間分配,MMU,存放器,中斷定義,..).參照硬件資料,多讀一些源碼會有所幫助.Tornado2開發(fā)調(diào)試環(huán)境協(xié)議框圖主機開發(fā)(HostDevelopmentSystem)目標機(TargetSystem)Tornado工具WTX協(xié)議通信<==========>EditorProjectShellDebuggerBrowserWindviewTargetServer|TargetAgentVxWorksTargetSimulatorWDB協(xié)議通信
<==========>ApplicationVxWorksOSVxWorksTarget(WDB)Agent兩個主要兩個協(xié)議WTX協(xié)議(WindRiverTooleXchange):用于開發(fā)機內(nèi)部Tornado工具與TargetServer之間通信.WDB協(xié)議(WindDeBug):用于主機TargetServer與目標機之間的通信.2.2BSP主要文件目錄的組成及作用:Install_direction/target/config/All:這個目錄下的文件是所有BSP文件共享的,不是特別需要不要更改里面的任何文件.configAll.h:缺省定義了所有VxWorks的設(shè)置.如果不用缺省的設(shè)置,可在BSP目錄下的文件中用#define或#undef方式來更改設(shè)置.bootInit.c:在ro后,完成BootROM的第二步初始化.程序從中的romInit()跳到這個文件中的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ā)布紀錄,版本,總的文檔包括所有涉及CPU主板的設(shè)置及定義(includes,definations),參見BSP設(shè)置文件及生成下載網(wǎng)絡(luò)驅(qū)動的主要設(shè)置文件,主要對END驅(qū)動設(shè)置.匯編語言文件,是VxWorksBootROM和ROMbasedimage的入口,參見系統(tǒng)啟動局部匯編語言文件,程序員可以把自己的匯編函數(shù)放在這個文件里,在上層調(diào)用.VxWorksimage的入口點_sysInit在這個文件里,是在RAM中執(zhí)行的第一個函數(shù)。包含一些系統(tǒng)相關(guān)的函數(shù)例程,提供了一個board-level的接口,VxWorks和應(yīng)用程序可以以system-indepent的方式生成.這個文件還能包含目錄target/config/comps/src的驅(qū)動.可選文件用于Scsi設(shè)備設(shè)置和初始化.sys可選文件用于所有的串口設(shè)置和初始化.ASIC文件包含VxWorksBootROM代碼VxWorks運行在目標機上,完整的,連結(jié)后的VxWorks二進制文件.VxWorks.sym完全的,連結(jié)后帶有符號表的VxWorks二進制文件完全的,連結(jié)后,standalone,帶有符號表的VxWorks二進制文件BSP用"make"來編譯連接生成(Created),而不是用Tornado的工具.BSP和應(yīng)用程序都可以在"make"或"tornade"上開發(fā)(developed)。BSP被設(shè)置包括以下驅(qū)動:中斷控制interruptcontroller計時器timer(sys/aux)串口UART(serial)顯示屏LCD鍵盤Keyboard(opt)觸摸屏touch-screen(opt).系統(tǒng)啟動順序VxWorksimage分為在ROM中運行和在RAM中運行兩種.兩者啟動順序的區(qū)別在于sysInit()函數(shù)的調(diào)用.該函數(shù)在RAM運行的VxWorks中初始化RAM.ROM中運行的VxWorksVxWorks在ROM中運行,即寫入ROM中的VxWorks是非壓縮的,不需要解壓,系統(tǒng)直接跳到ROM的首地址,運行VxWorks.注意:ROM運行的VxWorks并不支持所有的主扳,應(yīng)以主扳手冊為準.文件中的romInit()>文件中的romStart()-->文usrConfigusrInit()>sysHwInit()>usrKernelInit()>KernelInit(usrRoot,...)。Vxwroks在ROM中運行的優(yōu)勢VxWorksVxWorksimage的data段復(fù)制到RAM的LOCAL_LOW_ADRS,text局部留在ROM并在ROM中執(zhí)行.。ROM中運行的VxWorks缺點是運行速度慢.RAM中運行的VxWorksVxWorks在RAM中運行,即寫入ROM中的Boot或VxWorksImage是壓縮的,需要先解壓copy所有的text和data到RAM的LOCAL_LOW_ADRS中,下面sysInit()主要是初始化RAM用的,系統(tǒng)直接跳到RAM的首地址,運行VxWorksusrInit()前面不壓縮,即romInit(),romStart()不能壓縮.啟動過程文件中的romInit()>文件中的中的sysInit()>文件中的usrInit()>sysHwInit()>usrKernelInit()>KernelInit(usrRoot,...)。RAM運行的Boot或VxWorksimage的text段或data段會從ROM復(fù)制到RAM,在RAM中運行。其中usrRoot()是VxWorks啟動的第一個任務(wù),由它來初始化driver,network等。BootROMimage的啟動過程最少的系統(tǒng)初始化,主要用于啟動裝載VxWorksimage.一般有壓縮和不壓縮兩種形式,如bootrom和boot_uncmp.與VxWorksimage的區(qū)別在于一個Bootrom調(diào)用bootConfig.c,而VxWorks調(diào)用usrConfig.c.啟動順序文件中的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)啟動中幾個很重要的函數(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)時鐘(systemclock)。初始化輸入輸出系統(tǒng)(I/Osystem)可選Createdevices可選設(shè)置網(wǎng)絡(luò)(Configurenetwork)可選激活WDB目標通信(ActivateWDBagent)可選調(diào)用程序(Activateapplication)VxWorksImage在RAM中解壓的位置RAMLowAddressRAMHighAddressVxWorks運行的位置Bootimage由ROM解壓后Copy的位置,即bootRom區(qū)BSP配置文件及生成下載VxWorks在ROM中的情況ROM低高地址位ROM低地址位壓縮的VxWorksImgage沒有壓縮的romInit.s和romStart()在ROM的起始位置,系統(tǒng)powerup后,從這個起始位開始執(zhí)行,即執(zhí)行romInit(),起始位置由硬件定義,一般為0x00000000注:淺藍色為整個VxWorksImage.BSP配置文件及生成下載2.4Vxworks驅(qū)動概要總線類型PLB〔processorlocalbus〕,VME,PCI,PCI-Express,RapidIO,Mii,Virtual,MF〔multifunctiondevicebus〕,USB,IIC,SPI.驅(qū)動可以提供的效勞配置配置資源例如ns83902VxbEnd.c設(shè)備驅(qū)動中有這么一段devResourceGet(pHcf,"regWidth",HCF_RES_INT,(void*)®isterWidth;這里的registerwidth就是資源配置參數(shù)vxbInstParamByNameGet(pInst,"jumboEnable",VXB_PARAM_INT32,&val);這句話的意思是支持大包處理,jumboenable.這個就是參數(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)啟動過程中分配內(nèi)存。當系統(tǒng)早期啟動的過程中,那些最初被初始化的設(shè)備驅(qū)動是不能使用malloc,calloc.memPartAlloc()等函數(shù)分配內(nèi)存的,因為這些方法要使用信號量等操作。這時,只能使用如下函數(shù)分配內(nèi)存hwMemAlloc()從一個靜態(tài)池中分配N個字節(jié),并清零。hwMemFree()將內(nèi)存分配給靜態(tài)池。注意hwMemAlloc()和hmMemFree()是在系統(tǒng)啟動初期分配和釋放內(nèi)存,一旦系統(tǒng)完成初始化,就可以使用標準的內(nèi)存分配哈數(shù)進行分配。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().進行映射/*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時,跳出,將地址存儲到【pDrvCtrl】中,同時調(diào)用函數(shù)完成映射,返回句柄,供繼續(xù)讀寫用。中斷處理vxbIntConnect()vxbIntDisconnect()vxbIntEnable()vxbIntDisable()同步任務(wù)水平的同步采用信號量〔這里說mux〕,spinlock,中斷鎖。中斷水平的同步采用信號量〔mux〕,添加item到消息隊列。當使用后者時,在ISR中使用msgsend時,timeout應(yīng)該為zero。中斷水平的同步采用中斷鎖intCpulock,unCpuLockkey=intCpuLock();/*accessshareddatastructures.*/intCpuUnlock(key);注意雖然中斷鎖很簡單,很有效,但是現(xiàn)在不怎么使用中斷鎖了,因為以下兩個原因增加了系統(tǒng)開銷。在多個CPU或vxwroksSMP模式下中斷鎖不起作用。第3章vxWorks網(wǎng)絡(luò)驅(qū)動開發(fā)驅(qū)動說明風河早期的驅(qū)動采用legacydriver,在早期的版即vxWorks5.x中使用,在新的版本中已經(jīng)不再提供legacydriver了,特別是使用SMP的用戶,風河強烈建議采用vxbus模型的驅(qū)動。驅(qū)動開發(fā)可利用到的資源包含網(wǎng)絡(luò)驅(qū)動,總線控制,定時器驅(qū)動,串行設(shè)備驅(qū)動。installDir/vxWorks-6.xinstallDir/vxWorks-6.xinstallDir/vxWorks-6.xinstallDir/vxWorks-6.x/target/src關(guān)于定時器驅(qū)動installDir/vxWorks-6.x這里的驅(qū)動采用vxbus模型開發(fā),是從legacydriver遷移到vxbus的。installDir/vxWorks-6.x提供了PPC8260的定時器驅(qū)動,采用legacydriver開發(fā)。驅(qū)動類別注意開發(fā)驅(qū)動對vxWorks的I/O系統(tǒng)也要有所了解。通用類別:串行設(shè)備。軟件提供open〔〕,write〔〕,ioctl〔〕調(diào)用。串行設(shè)備驅(qū)動例程存放路徑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ū)動MAC層驅(qū)動installDir/vxWorks-6.x/target/src/hwif/endMAC驅(qū)動與MUX相連。物理層驅(qū)動installDir/vxWorks-6.x/target/src/hwif/miiPHY與MAC之間由MII相連。NVRAM〔非易失性RAM〕驅(qū)動installDir/vxWorks-6.x/target/src/hwif/nvram定時器驅(qū)動installDir/vxWorks-6.x/target/src/hwif/timer定時器驅(qū)動的作用:告訴CPU某事件已經(jīng)消耗了指定時間提供加減計數(shù)DMA驅(qū)動installDir/vxWorks-6.x/target/src/hwif/dmaBusControllerDrivers〔總線控制器驅(qū)動〕為不同的總線之間提供接口每一個CPU在設(shè)計的時候都提供了一個與外界相連的接口,稱為總線接口。一般情況下,不考慮CPU類型,直接與總線相連,稱為PLB〔processorlocalbus〕。在某些情況下,需要將不同的總線之間進行橋接,用到PCE或VME.installDir/vxWorks-6.x/target/src/hwif/busCtlr作用:總線控制器確定系統(tǒng)當前是那種總線在工作。2.總線控制器負責配置下行設(shè)備,使之能夠工作。3.總線控制器負責管理地址映射。USB驅(qū)動USB主機設(shè)配驅(qū)動installDir/vxWorks-6.x/target/src/hwif/busCtlr/usb/hcdUSB類驅(qū)動installDir/vxWorks-6.x/target/src/drv/usbInterruptControllerDrivers〔中斷控制器驅(qū)動〕作用:當設(shè)備產(chǎn)生中斷時,中斷控制器負責將中斷傳遞個處理器,并且保證其他中斷源不再送往CPU當其正在處理當前中斷時。installDir/vxWorks-6.x/target/src/hwif/intCtlrMultifunctionDriversRemoteProcessingElementDriversinstallDir/vxWorks-6.x/target/src/hwif/cpuconsole驅(qū)動installDir/vxWorks-6.x/target/src/hwif/consoleResourceDriversinstallDir/vxWorks-6.x/target/src/hwif/resource資源驅(qū)動的功能是為外圍設(shè)備及其配置資源其他類A/DD/A要寫驅(qū)動,首先要知道驅(qū)動文件所在位置,這里有三個路徑存放與驅(qū)動有關(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ū)動是采用legacy,模型〔區(qū)別于vxbus模型〕,Legacy模型用于驅(qū)動開發(fā)是應(yīng)用在vxworks早期版本中。驅(qū)動源文件提供某些實體的邏輯實現(xiàn)DriversourcefileinstallDir/vxWorks-6.x/target/src/hwifThird-partydriversarefoundunder:installDir/vxWorks-6.x/target/3rdpartyTheexampleinthissectiondiscussesthefilelocations3.2Vxworks下網(wǎng)絡(luò)驅(qū)動開發(fā)說明:vxworks下網(wǎng)絡(luò)驅(qū)動開發(fā),是本文檔要講述的重點。在本章節(jié)中,將重點介紹vxworks下驅(qū)動開發(fā)要完成的工作,熟悉驅(qū)動開發(fā)有關(guān)的源文件及其頭文件,根據(jù)具體情況進行修改和配置。理解使用vxbus開發(fā)模型進行驅(qū)動開發(fā)的一般流程。知道在系統(tǒng)初始化過程系統(tǒng)是如何對網(wǎng)絡(luò)驅(qū)動進行初始化的,包括網(wǎng)絡(luò)驅(qū)動的聲明,注冊等。在本章節(jié)中,讀者要重點關(guān)注與網(wǎng)絡(luò)驅(qū)動有關(guān)的頭文件,源文件〔對于命名中有end這樣字眼的程序要多加留意〕,可以仔細研讀,發(fā)現(xiàn)其中的一般性。最后結(jié)合風河代碼,給出一款網(wǎng)卡驅(qū)動的開發(fā)方法。vxWorks網(wǎng)絡(luò)協(xié)議棧與windows下TCP/IP協(xié)議棧相比,vxWorks增加了MUX層。VxWorks下網(wǎng)絡(luò)驅(qū)動的開發(fā)要掌握的根本概念網(wǎng)絡(luò)驅(qū)動包括MAC層驅(qū)動和PHY驅(qū)動。MAC層和PHY層通過MII連接。MII是meidiaindependentinterface的縮寫,是一種連接機制。其他媒介還有SGMII,GMII,PLB等等??梢酝ㄟ^配置MAC相關(guān)的存放器實現(xiàn)。Vworks下網(wǎng)絡(luò)驅(qū)動分為END模型驅(qū)動和BSD模型驅(qū)動?,F(xiàn)在比擬流行的還是END模型驅(qū)動。寫vxWorks下的驅(qū)動只要實現(xiàn)模板函數(shù)完成的功能即可,如endload(),endunload(),endpollsend(),endpollreceive()等。具體函數(shù)看數(shù)據(jù)結(jié)構(gòu)netfun,有需要實現(xiàn)的函數(shù)接口。這些接口在系統(tǒng)初始化硬件的過程中有mux層調(diào)用實現(xiàn)。驅(qū)動開發(fā)者只需關(guān)心底層的這幾個函數(shù)實現(xiàn),無須關(guān)心mux層的實現(xiàn)方法。Socket與vxWorks網(wǎng)絡(luò)驅(qū)動的關(guān)系Socket是在應(yīng)用層調(diào)用。起始在vxworks下表現(xiàn)為一種文件。通過socket在不同進程之間傳遞信息。Socket的發(fā)送接收功能,說到底最后還是調(diào)用底層的驅(qū)動send,receive實現(xiàn)。對vxwroks網(wǎng)絡(luò)驅(qū)動有一點了解之后,我們來重點學(xué)習(xí)END驅(qū)動了解什么是MUX這個圖說明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ò)接口硬件上實現(xiàn)多種協(xié)議而增加的一層。它主要用于管理底層的多種硬件的設(shè)備驅(qū)動,向上層不同協(xié)議提供統(tǒng)一的接口,降低了上層協(xié)議與底層物理硬件的藕合,使得網(wǎng)絡(luò)驅(qū)動和上層協(xié)議彼此保持獨立,既方便在現(xiàn)有硬件根底上實現(xiàn)新的上層協(xié)議,也利于用新的硬件支持原有的上層協(xié)議。MUX與END的交互是通過提供一套可供底層調(diào)用接口效勞來實現(xiàn)的,實現(xiàn)END驅(qū)動必須遵循這套接口關(guān)系。如下圖。MUX與END的接口關(guān)系圖3中右邊框中列出的函數(shù)是驅(qū)動需要實現(xiàn)的函數(shù),供MUX層調(diào)用在必要的時間調(diào)用,如當上層使用該網(wǎng)卡發(fā)送數(shù)據(jù)時,MUX會調(diào)用該網(wǎng)卡END驅(qū)動提供的Send函數(shù),將數(shù)據(jù)提交給網(wǎng)卡芯片硬件。緩沖池數(shù)據(jù)結(jié)構(gòu)網(wǎng)絡(luò)設(shè)備驅(qū)動與上層協(xié)議進行數(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ū)動可以直接使用也可以在此根底上設(shè)計自己特定的內(nèi)存緩沖池。數(shù)據(jù)以簇的形式保存,數(shù)據(jù)結(jié)構(gòu)mBlks〔內(nèi)存塊〕和clBlks〔簇塊〕形成的數(shù)據(jù)鏈結(jié)構(gòu)那么用于指定各個簇。在clBlk之上是mBlk結(jié)構(gòu)。該結(jié)構(gòu)存儲一個到clBlk的連接,也可以存儲一個到另一個mBlk的連接。通過mBlk的連接,可以引用任意數(shù)量的數(shù)據(jù),如圖4所示。圖4mBlks和clBlks的數(shù)據(jù)結(jié)構(gòu)裝載及啟動END設(shè)備的系統(tǒng)函數(shù)主要用到以下幾個:(1).muxDevLoad()該函數(shù)裝載指定設(shè)備的驅(qū)動程序裝載函數(shù)。如果要裝載END設(shè)備,系統(tǒng)必須調(diào)用muxDevLoad()函數(shù)。(2).muxDevStart()啟動設(shè)備函數(shù)(3).muxBind()muxBind()可以將協(xié)議綁定到指定的END設(shè)備上。其調(diào)用過程是系統(tǒng)調(diào)用ipAttach()函數(shù),而該函數(shù)調(diào)用muxBind()函數(shù),綁定協(xié)議堆棧到MUX上的一個指定的網(wǎng)絡(luò)接口。當一個網(wǎng)絡(luò)接口被關(guān)閉時,ipAttach()函數(shù)將釋放網(wǎng)絡(luò)接口所關(guān)聯(lián)的TCP/IP堆棧模塊。裝載及啟動END設(shè)備驅(qū)動程序的流程如下:使用指定的END設(shè)備驅(qū)動程序的BSP引導(dǎo)VxWorks系統(tǒng)時,在引導(dǎo)過程中,系統(tǒng)將執(zhí)行任務(wù)tUsrRoot來完成如下各項:(1)初始化網(wǎng)絡(luò)任務(wù)的工作隊列;(2)創(chuàng)立tNetTask任務(wù)來處理網(wǎng)絡(luò)任務(wù)工作隊列的條目;(3)調(diào)用muxDevLoad()裝載指定的網(wǎng)絡(luò)驅(qū)動程序;(4)調(diào)用muxDevStart()啟動指定的網(wǎng)絡(luò)驅(qū)動程序。tUsrRoot任務(wù)調(diào)用MUX設(shè)備裝載函數(shù)muxDevLoad()和設(shè)備啟動函數(shù)muxDevStart(),通過這兩個函數(shù)來裝載和啟動設(shè)備驅(qū)動程序。muxDevLoad()函數(shù)會根據(jù)網(wǎng)絡(luò)設(shè)備表endDevTbl[]中的定義逐一調(diào)用各網(wǎng)絡(luò)設(shè)備的裝載函數(shù),其中這個函數(shù)是muxDevLoad()的一個輸入?yún)?shù)。muxDevStart()函數(shù)也會根據(jù)endDevTbl[]逐一調(diào)用網(wǎng)絡(luò)設(shè)備所定義的設(shè)備開始函數(shù)。至此MUX的初始化以及END驅(qū)動程序的初始化工作已經(jīng)完成。但是網(wǎng)絡(luò)設(shè)備還是不可以使用,因為還需要將協(xié)議綁定到指定的END指定的設(shè)備上,這一步需要用muxBind()函數(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ū)動程序的安裝過程即圖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分析,主要包含以下幾個處理。(1)用戶調(diào)用write()函數(shù),通過套接字訪問網(wǎng)絡(luò)。(2)網(wǎng)絡(luò)協(xié)議拷貝需要發(fā)送的數(shù)據(jù)到網(wǎng)絡(luò)緩沖區(qū)中,并調(diào)用協(xié)議驅(qū)動程序的發(fā)送程序。(3)協(xié)議驅(qū)動程序調(diào)用muxSend()啟動發(fā)送循環(huán)。(4)muxSend()通過調(diào)用send()回調(diào)函數(shù),把緩沖區(qū)傳遞給END。(5)數(shù)據(jù)發(fā)送程序把數(shù)據(jù)拷貝到設(shè)備緩沖區(qū)中,并把它放置到設(shè)備的發(fā)送隊列中。(6)當產(chǎn)生發(fā)送中斷時,驅(qū)動程序的中斷效勞程序調(diào)度程序丟棄已發(fā)送的數(shù)據(jù)包,徹底清理發(fā)送隊列。接收數(shù)據(jù)在VxWorks網(wǎng)絡(luò)系統(tǒng)中,接收數(shù)據(jù)的流程如圖7。通過對圖7進行分析,它主要包含以下幾個處理。(1)設(shè)備接收到數(shù)據(jù)包后直接把數(shù)據(jù)存放到預(yù)先分配的簇中。(2)當接收到中斷時,驅(qū)動程序的中斷效勞程序調(diào)度任務(wù)級接收程序進行如下操作。①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ū)動程序的中斷處理中斷處理函數(shù)fei82557INT()處理設(shè)備中斷。根據(jù)中斷狀態(tài)調(diào)用相應(yīng)的中斷處理程序,如接收終端程序、發(fā)送中斷程序等。當網(wǎng)絡(luò)接口產(chǎn)生中斷時,系統(tǒng)調(diào)用中斷效勞程序。為了將中斷阻塞減到最小,中斷驅(qū)動程序只處理那些需要最小時間的工作,把其他耗時的任務(wù)排列到網(wǎng)絡(luò)任務(wù)的工作隊列中。為了排列任務(wù)級的包接收處理工作,網(wǎng)絡(luò)驅(qū)動程序中斷效勞程序必須調(diào)用netJobAdd()函數(shù)。在調(diào)用netJobAdd()函數(shù)時,應(yīng)當指定任務(wù)級處理數(shù)據(jù)包的驅(qū)動程序入口。然后由netJobAdd()把函數(shù)指派到網(wǎng)絡(luò)系統(tǒng)任務(wù)——tNetTask的工作隊列中。VxWorks通過tNetTask處理任務(wù)級的網(wǎng)絡(luò)處理。tNetTask調(diào)用隊列中處理程序如下:〔1〕包接收程序:把接收到的數(shù)據(jù)包上傳到網(wǎng)絡(luò)緩沖區(qū)的堆棧中,通過一個調(diào)用上傳給MUX?!?〕釋放所有發(fā)送幀程序:程序調(diào)用netClFree()函數(shù)釋放發(fā)送緩沖區(qū)中所有已經(jīng)發(fā)送的數(shù)據(jù)幀。協(xié)議層執(zhí)行以下入口點stackShutdownRtn()stackError()stackRcvRtn()stackTxRestartRtn()Mux與網(wǎng)絡(luò)驅(qū)動之間的接口這局部學(xué)習(xí)可以參考風河代碼MuxLibmux執(zhí)行的函數(shù)有muxbind〔〕,muxDevload〔〕等。Mux相關(guān)API詳解muxDevLoad()將設(shè)備裝載到MUXmuxDevStart()從MUX啟動設(shè)備muxBind()綁定協(xié)議層到MUX〔hook〕muxSend()從協(xié)議層接收數(shù)據(jù)包,然后發(fā)往設(shè)備muxDataPacketGet()獲取一個只包含包數(shù)據(jù)的mblk,不包含鏈路層次的頭部信息〔omitted.〕muxAddressForm()將包地址放入指定的buffer.muxIoctl()訪問控制函數(shù)muxMCastAddrAdd()為設(shè)備中的表添加一個多播地址muxMCastAddrDel()刪除一個多播表muxMCastAddrGet()獲取設(shè)備中的多播地址表muxUnbind()斷開協(xié)議層與MUX層的鏈接muxDevStop()停止設(shè)備muxDevUnload()卸載設(shè)備muxPacketDataGet()提起一個submittedmblk中的包數(shù)據(jù),并將它寫入一個新的mblkmuxPacketAddrGet()從一個submittedmblk中提取數(shù)據(jù)包中的源地址和目的地址,并將每個地址寫入它們自己的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()添加一個地址解決函數(shù)muxAddrResFuncGet()從列表中獲取一個特別的地址解決函數(shù)muxAddrResFuncDel()從列表中刪除一個特別的地址解決函數(shù)這個圖說明了三個層次之間的關(guān)系,對于驅(qū)動開發(fā)者來說,只需關(guān)心實現(xiàn)END的相關(guān)接口即可。注意這里有一個問題,我們發(fā)現(xiàn)在protocol層上并沒有調(diào)用muxsend的接口。不是沒有,而是在標準的API之外〔風河文檔說明〕協(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().*/)返回錯誤信息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ū)動初始化過程驅(qū)動初始化順序驅(qū)動實例理解1.驅(qū)動在vxwroks中注冊,使用如下數(shù)據(jù)結(jié)構(gòu)。LOCALstructdrvBusFuncscn3xxxTimerDrvFuncs={cn3xxxTimerInstInit,/*devInstanceInit*/cn3xxxTimerInstInit2,/*devInstanceInit2*/cn3xxxTimerInstConnect/*devConnect*/};2.描述驅(qū)動支持的方法。LOCALstructvxbDeviceMethodcn3xxxTimerDrv_methods[]={DEVMETHOD(vxbTimerFuncGet,cn3xxxTimerFuncGet),{0,NULL}};3.提供驅(qū)動注冊信息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在啟動過程中,將驅(qū)動與特定的硬件相連。voidvxbCn3xxxTimerDrvRegister(void){vxbDevRegister(&cn3xxxTimerDrvRegistration);}驅(qū)動在vxbus注冊后,vxwroks使用驅(qū)動配置文件中的相關(guān)文件找到vxbus中注冊的驅(qū)動函數(shù)的入口。特別說明VXBUS的驅(qū)動初始化過程在每一個驅(qū)動程序的最前面都可以看到,讀者可以翻開intalldirection\target\src\hwif\不管是網(wǎng)絡(luò)驅(qū)動還是其他的串口驅(qū)動,都可以首先看到驅(qū)動初始化相關(guān)的這四個函數(shù)。以下是風河文檔的截屏這里有一些限制系統(tǒng)啟動時iInstInit()由sysHwInit()調(diào)用。因為這個時候系統(tǒng)剛剛啟動,堆的初始化還沒完成。所以這里不能分配內(nèi)存等。所以這里只是初步初始化,只能訪問硬件存放器。在InstInit2()過程中,系統(tǒng)根本初始化完成,可以調(diào)用系統(tǒng)內(nèi)核中的內(nèi)核如信號量,可以使用malloc和free在堆中分配內(nèi)存。添加vxbus驅(qū)動方法例程這個nicinstconnect是vxbus初始化的第三個步驟,直到這里才可以連接中斷。添加vxbus驅(qū)動之后,要做的就是更新源文件中的名稱〔name〕;Ingeneral,youcanchangeallotherroutinestoLOCAL.VxWorks操作系統(tǒng)接口介紹驅(qū)動如何是與操作系統(tǒng)接口的,即操作系統(tǒng)如何lauch驅(qū)動,如何把驅(qū)動添加到操作系統(tǒng)中的,如何管理分配內(nèi)存資源的。通過操作系統(tǒng)中tNetTask任務(wù)完成的,開始由tNet0.取代。VxWorks如何lauch驅(qū)動系統(tǒng)啟動后,系統(tǒng)執(zhí)行任務(wù)tUsrRoot,處理以下事情初始化網(wǎng)絡(luò)工作任務(wù)隊列。執(zhí)行tNetTask,處理網(wǎng)絡(luò)工作隊列上的條目〔item〕。調(diào)用muxDevLoad()加載網(wǎng)絡(luò)驅(qū)動,把驅(qū)動裝載到MUX層?!仓笥衜uxload調(diào)用endload〕調(diào)用muxDevStart()啟動網(wǎng)絡(luò)驅(qū)動。注冊中斷處理程序在endstart〔〕中調(diào)用sysIntConnect().。當muxload驅(qū)動時,它調(diào)用muxDevstart〔〕,然后調(diào)用endstart〔〕驅(qū)動入口點。使用tNetTask驅(qū)動操作系統(tǒng)直接使用網(wǎng)絡(luò)驅(qū)動處理進來的包,直接將包分發(fā)處理交給應(yīng)用程序,ThisoperationisdoneinthelowerhalfoftheOS,fromwithininterruptcontext.Therefore,muchofthenetworkstackisexecutedfromwithininterruptserviceroutines(ISRs).這個操作經(jīng)常在低效率的操作系統(tǒng)中完成,由中斷效勞函數(shù)完成。但是vxWorks是實時操作系統(tǒng),ISR必須短,所以vxWorks沒有使用長的ISR來處理包。因為這個原因,所有關(guān)于協(xié)議棧的包的處理,vxWroks都交給了tNettask來處理fromwithaISR。中斷處理一旦接受到設(shè)備發(fā)送過來的中斷,vxWorks立即喚醒之前注冊的中斷效勞函數(shù)執(zhí)行,而且要盡快處理完成。所以這里中斷效勞函數(shù)完成了最根本的事情:錯誤/狀態(tài)改變。為了給包拒絕任務(wù)排隊,ISR必須使用netjobAdd函數(shù)。使用tNetTask處理任務(wù)層次的網(wǎng)絡(luò)處理。STATUSnetJobAdd(FUNCPTRroutine,/*routinetoaddtonetTaskworkqueue*/intparam1,/*firstargtoaddedroutine*/intparam2,/*secondargtoaddedroutine*/intparam3,/*thirdargtoaddedroutine*/intparam4,/*fourthargtoaddedroutine*/intparam5/*fifthargtoaddedroutine*/)中斷處理往往提供三種功能,寫驅(qū)動時必須注意處理接收中斷。包發(fā)送出去后,將資源還給緩沖池。處理錯誤事件。如何添加網(wǎng)絡(luò)接口驅(qū)動到vxWorks編譯并include代碼到vxWorksimage〔參考workbech使用方法或者內(nèi)核編程〕。創(chuàng)立END驅(qū)動的配置表〔endDevTbl[]〕.信息,讓MUX識別END驅(qū)動,往表里面添加具體的驅(qū)動信息,配置,要使用define包含某些信息。系統(tǒng)初始化過程中由usrNetInit()完成網(wǎng)絡(luò)設(shè)備的初始化,默認情況下市自動調(diào)用的,所以宏定義中一般包含INCLUDE_NETWORK和INCLUDE_NET_INITsysDev.c,這個函數(shù)也要注意,包含驅(qū)動訪問存放器相關(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ū)動的入口點,例如如果你的驅(qū)動endLoad〔〕入口點是fei82557EndLoad(),,那么在必須做如下配置#defineEND_LOAD_FUNCfei82557EndLoadEND_LOAD_STRING傳遞給muxDevLoad的初始串參數(shù)。注意每一個END驅(qū)動的參數(shù)都不同,在寫驅(qū)動的時候要仔細檢查。編輯endTbl表中的信息,確保END驅(qū)動包含到鏡像中。表在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表示入口沒有被處理。當系統(tǒng)成功加載了驅(qū)動,這里的FALSE將被改為TRUE。最后修改BSPconfig.hfiletodefineINCLUDE_END.這將告訴進程包含END驅(qū)動。當新的映像重新啟動時,系統(tǒng)調(diào)用MuxDevLoad,完成相關(guān)設(shè)備的初始化。與END驅(qū)動有關(guān)的5中結(jié)構(gòu)需要分配內(nèi)存驅(qū)動控制結(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提供了兩個重要函數(shù)netPoolCreate()創(chuàng)立一個網(wǎng)絡(luò)池netPoolInit().風河強烈推薦開發(fā)者使用前者而非后者。通常的cluster大小是64,128,256,512,1024,2048。網(wǎng)絡(luò)的最大傳輸單元(MTU)是1500字節(jié)。如何建立網(wǎng)絡(luò)驅(qū)動池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ū)動中一種很重要的數(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)資健康管理辦法
- 企事業(yè)單位綠化養(yǎng)護項目招標
- 通信工程商品混凝土施工合同
- 兒童節(jié)目制片合作協(xié)議
- 珠寶共享租賃協(xié)議-時尚活動
- 短期技術(shù)研發(fā)聘用合同
- 網(wǎng)絡(luò)安全服務(wù)招標申請
- 汽車制造業(yè)裝卸規(guī)范
- 2025廚師承包餐廳合同
- 市政工程人員文明施工承諾書
- 2023-2024學(xué)年山東省泰安市高一下學(xué)期7月期末考試物理試題(解析版)
- 基于認知行為療法的藥物干預(yù)研究
- 舞蹈鑒賞學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 市政工程單位、分部、分項工程劃分方案
- 期末檢測(試題)-2024-2025學(xué)年三年級上冊數(shù)學(xué)人教版
- 康復(fù)醫(yī)學(xué)治療技術(shù)士考試歷年真題
- 2024國家開放大學(xué)電大《藥理學(xué)》機考終結(jié)性5套真題題庫及答案2-百度文
- JGJ/T 241-2011人工砂混凝土應(yīng)用技術(shù)規(guī)程
- 短視頻拍攝合作協(xié)議范本
- 2024海南省圖書館公開招聘財政定額補貼人員15人(一)(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
- 2024年越南板式降膜蒸發(fā)器行業(yè)現(xiàn)狀及前景分析2024-2030
評論
0/150
提交評論