閔衛(wèi)鋒,馬安良
(楊凌職業(yè)技術(shù)學(xué)院陜西楊凌712100)
MPC852T是一款高性能通用通信處理器,在該芯片中,將PowerPC內(nèi)核和通信外設(shè)集成于一體,配有多個(gè)支持各種通信協(xié)議的外設(shè)接口因此,該處理器芯片特別適用于通信領(lǐng)域。相對于其他操作系統(tǒng),VxWorks除了具備常見操作系統(tǒng)的功能外,系統(tǒng)調(diào)度和硬實(shí)時(shí)(確定性)方面有明顯的優(yōu)勢,開發(fā)工具非常完善,能提供良好的調(diào)試機(jī)制。它以其良好的可靠性和卓越性能廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中。實(shí)現(xiàn)了一個(gè)基于MPC852T處理器和VxWorks操作系統(tǒng)的END接口標(biāo)準(zhǔn)的以太網(wǎng)驅(qū)動程序,為上層軟件提供標(biāo)準(zhǔn)調(diào)用接口,分層設(shè)計(jì)保證了相對的獨(dú)立性,方便跨平臺移植。
MPC852T具有快速以太網(wǎng)控制器(FEC),通過配置FEC的工作模式寄存器GFMR,可以使FEC工作于以太網(wǎng)模式,F(xiàn)EC相對獨(dú)立,F(xiàn)EC的實(shí)現(xiàn)不影響CPM的其它性能。
以太網(wǎng)驅(qū)動主要是實(shí)現(xiàn)數(shù)據(jù)的發(fā)送、接收,以及完成BD表等,整個(gè)過程內(nèi)核參與較少。發(fā)送過程主要由FEC來完成,太網(wǎng)發(fā)送被內(nèi)核使能之后,F(xiàn)EC就按照固定的時(shí)間間隔(512個(gè)串行時(shí)鐘)去輪詢發(fā)送BD表,如果BD表中有數(shù)據(jù)需要發(fā)送,則進(jìn)行發(fā)送操作。這種輪詢方式有可能會造成數(shù)據(jù)延遲。對于實(shí)時(shí)性要求比較高的數(shù)據(jù)發(fā)送,上層軟件在數(shù)據(jù)準(zhǔn)備好之后,可以通過置位TODR[TOD],直接進(jìn)行發(fā)送操作,而不必等到下一次的查詢。在全雙工方式下,以太網(wǎng)控制器不檢測沖突,只維持幀間的最小間隔(96個(gè)串行時(shí)鐘),但是在半雙工模式下,在數(shù)據(jù)發(fā)送之前,就需要進(jìn)行沖突檢測。如果線路忙,則推遲發(fā)送。只有當(dāng)CRS信號保持60個(gè)串行時(shí)鐘的無效狀態(tài)后,再等待CRS信號繼續(xù)無效36個(gè)串行時(shí)鐘才開始數(shù)據(jù)發(fā)送。
接收被內(nèi)核使能后,在搜索模式(RX_DV有效且COL無效)判斷FEC數(shù)據(jù)同步寄存器(FDSR)和進(jìn)入接收移位寄存器的數(shù)據(jù),直到匹配時(shí)搜索模式結(jié)束。提取數(shù)據(jù)數(shù)據(jù)幀的首字節(jié),進(jìn)行數(shù)據(jù)鑒權(quán),通過后開始接收數(shù)據(jù)并寫入內(nèi)存,所有數(shù)據(jù)接收完畢后通知內(nèi)核進(jìn)行后續(xù)處理。
驅(qū)動程序需要完成的部分,是提供CPU相關(guān)的TxBD和RxBD操作的方法,當(dāng)有數(shù)據(jù)需要發(fā)送時(shí),要從CPU取得數(shù)據(jù),填充到TxBD中去,當(dāng)收到數(shù)據(jù)時(shí),需要將收到的數(shù)據(jù)通知到網(wǎng)絡(luò)接收任務(wù)。與TTY設(shè)備相似地,基于此,需要完成硬件寄存器的初始化,緩存空間的初始化,中斷向量的關(guān)聯(lián),向VxWorks內(nèi)核提供標(biāo)準(zhǔn)的接口函數(shù)。
為了保證網(wǎng)絡(luò)協(xié)議層與網(wǎng)絡(luò)設(shè)備驅(qū)動層的無關(guān)性,VxWorks操作系統(tǒng)在網(wǎng)絡(luò)設(shè)備驅(qū)動層和網(wǎng)絡(luò)協(xié)議層之間增加了MUX接口層,MUX接口層有效隔離了網(wǎng)絡(luò)設(shè)備驅(qū)動程序和協(xié)議層協(xié)議,使得網(wǎng)絡(luò)設(shè)備驅(qū)動程序和協(xié)議相對獨(dú)立,雙方只有一個(gè)公共的接口就是MUX接口層。MUX接口層分別為網(wǎng)絡(luò)設(shè)備驅(qū)動層和網(wǎng)絡(luò)協(xié)議層提供了統(tǒng)一標(biāo)準(zhǔn)接口,而網(wǎng)絡(luò)設(shè)備驅(qū)動層和網(wǎng)絡(luò)協(xié)議層只需要跟對應(yīng)的接口進(jìn)行操作,雙方并無直接交互。MUX接口層的加入,有效的避免了網(wǎng)絡(luò)設(shè)備驅(qū)動層和網(wǎng)絡(luò)協(xié)議層直接操作,方便設(shè)備驅(qū)動程序和協(xié)議的移植和擴(kuò)展。
MUX提供的接口如圖1所示。
以太網(wǎng)驅(qū)動程序也可以劃分為硬件初始化和API兩部分。其中,硬件初始化工作是在系統(tǒng)上電初始化的時(shí)候完成的。API部分主要是提供了MUX接口層必須的一些標(biāo)準(zhǔn)接口函數(shù)。這里重點(diǎn)介紹硬件初始化部分以及驅(qū)動程序中用到的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
以太網(wǎng)設(shè)備的初始化一般要在作為控制端口的TTY設(shè)備初始化完成之后才開始。實(shí)際上,網(wǎng)口也可以在整個(gè)系統(tǒng)任務(wù)都運(yùn)行完之后再進(jìn)行加載。加載函數(shù)的接口是以結(jié)構(gòu)END_TBL_ENTRY為元素的函數(shù)入口。END_TBL_ENTRY結(jié)構(gòu)定義如下:
圖1MUX接口示意圖
第一個(gè)數(shù)值是設(shè)備的單元號,當(dāng)加載這個(gè)驅(qū)動入口時(shí),相應(yīng)的設(shè)備名就是devName#unit,這樣可以使用同一個(gè)加載函數(shù)入口實(shí)現(xiàn)多個(gè)設(shè)備單元的加載。
第二個(gè)就是加載函數(shù)入口,后續(xù)會詳細(xì)描述。第三個(gè)是加載的入口字符串,用以提供對設(shè)備的詳細(xì)描述。
第四個(gè)是借用緩存的標(biāo)識,即收發(fā)數(shù)據(jù)時(shí)是否作一次拷貝?目前不使用這個(gè)參數(shù)。
第五個(gè)是BSP的參數(shù)入口,即當(dāng)系統(tǒng)調(diào)用函數(shù)endLoadFunc()時(shí),提供的void*參數(shù)。
第六個(gè)是記錄是否有效的標(biāo)志。這個(gè)辦法可以讓一個(gè)入口不必使用注釋掉代碼的辦法停止一個(gè)驅(qū)動的加載。要使能這個(gè)驅(qū)動的加載,這個(gè)變量值寫為FALSE,那么系統(tǒng)會加載這個(gè)驅(qū)動,在完成加載后將這個(gè)值寫為TRUE。如果在靜態(tài)配置中把這個(gè)值寫為TRUE,系統(tǒng)就會停止該驅(qū)動的加載。
END_TBL_ENTRY結(jié)構(gòu)變量存放在文件configNet.h文件的數(shù)組endDevTbl[]里,最終這個(gè)文件會被包含在xxxConfig.c文件(xxxConfig.c文件是指bootConfig.c或者prjConfig.c)里。系統(tǒng)通過muxDevLoad()函 數(shù) 來 加 載 endLoadFunc(參 考 <usrNetwork.c>):
endLoadFunc()函數(shù)從 muxDevLoad()入口點(diǎn)被系統(tǒng)加載后,就會在需要的地方被系統(tǒng)調(diào)用。
END驅(qū)動加載如圖2所示。
圖2 END驅(qū)動加載示意圖
系統(tǒng)在muxDevLoad()函數(shù)中調(diào)用endLoadFunc()函數(shù)時(shí),并不是直接將END_TBL_ENTRY表中的初始化字符提供給endLoadFunc()函數(shù),而是先提供一個(gè)空的字符串以獲取該設(shè)備的名稱,然后在設(shè)備列表中尋找這個(gè)設(shè)備的驅(qū)動,如果找到該驅(qū)動,則停止調(diào)用endLoadFunc()函數(shù)以免重復(fù)執(zhí)行,如果找不到該驅(qū)動,才會繼續(xù)執(zhí)行加載,并會將該驅(qū)動的單元號追加到初始化字符串的頭部。這在TORNADO的相關(guān)說明文檔中并沒有提及。
在加載完畢后系統(tǒng)通過調(diào)用NET_FUNCS驅(qū)動函數(shù)組中的motFecStar(t)函數(shù)將中斷和處理函數(shù)連接并且使中斷使能。也可以手動調(diào)用muxDevStart()函數(shù)執(zhí)行網(wǎng)口的啟用。
這里特別敘述一下數(shù)據(jù)的接收處理過程。數(shù)據(jù)接收通過motFecStar(t)函數(shù)使能接收中斷,當(dāng)滿足條件的數(shù)據(jù)完成一幀的接收,它首先被放在RxBD指向的BUFFER中,然后觸發(fā)CPU的接收中斷。在由硬件驅(qū)動完成的中斷處理函數(shù)中,需要通過netJobAdd()將任務(wù)級接收函數(shù)轉(zhuǎn)交tNetTask任務(wù)處理。
netJobAdd()函數(shù)處理的主要流程即是調(diào)用msgQSend()函數(shù)向tNetTask任務(wù)發(fā)送一個(gè)消息,消息的第一個(gè)參數(shù)即是期望的處理函數(shù)入口指針,其余的參數(shù)則是提供給處理函數(shù)的參數(shù)。tNetTask()任務(wù)在收到該消息之后即將消息緩存中的第一個(gè)4字節(jié)組作為函數(shù)指針,其余的消息作為函數(shù)指針的入?yún)ⅲ缓笳{(diào)用處理函數(shù)。所以如果使用netJobAdd()調(diào)用的函數(shù)處理出現(xiàn)異常,將會導(dǎo)致網(wǎng)絡(luò)任務(wù)的異常乃至崩潰產(chǎn)生。
驅(qū)動層處理收到的數(shù)據(jù)時(shí),可以調(diào)用endLib.h庫中提供的 END_RCV_RTN_CALL(pEnd,pMblk)宏。該宏實(shí)際上是調(diào)用muxReceive()函數(shù)進(jìn)行數(shù)據(jù)的接收處理,該函數(shù)是在運(yùn)行muxDevLoad()時(shí)被TORNADO系統(tǒng)加載的,這就將數(shù)據(jù)的接收流程交給了TORNADO系統(tǒng)。在TORNADO的MUX層,系統(tǒng)會通過muxBind()函數(shù)將不同協(xié)議的數(shù)據(jù)接收數(shù)理函數(shù)添加到處理函數(shù)列表中,這些處理函數(shù)就會在muxReceive()函數(shù)中得到執(zhí)行。
文中分析了在VxWorks操作系統(tǒng)上實(shí)現(xiàn)基于MPC852T的END標(biāo)準(zhǔn)以太網(wǎng)驅(qū)動的設(shè)計(jì)原理和軟件架構(gòu),充分發(fā)揮了MPC852T的強(qiáng)大控制能力和通信能力,以及VxWorks操作系統(tǒng)資源調(diào)度能力和實(shí)時(shí)性的特性,滿足了用戶的需求,達(dá)到預(yù)期目標(biāo)。為上層軟件提供了標(biāo)準(zhǔn)調(diào)用接口,經(jīng)實(shí)際產(chǎn)品驗(yàn)證,該END標(biāo)準(zhǔn)以太網(wǎng)驅(qū)動穩(wěn)定、可靠。
[1]周俊杰,何攀峰.基于VxWorks的實(shí)時(shí)多任務(wù)軟件框架設(shè)計(jì)[J].國外電子測量技術(shù),2012,31(4):80-82.
[2]馮先成,李寒,張鐵男.基于MPC850 VxWorks系統(tǒng)的BSP設(shè)計(jì)[J].計(jì)算機(jī)與數(shù)字工程,2012,40(6):39-43.
[3]張宇坤,袁冬莉,黃鑫鑫,等.基于VxWorks的網(wǎng)卡驅(qū)動程序開發(fā)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013(1):18-20.
[4]張宇,王省書,胡春生.基于VxWorks的多任務(wù)實(shí)時(shí)性分析[J].微處理機(jī),2013,34(1):53-57.
[5]樓楊.基于MPC8548的嵌入式設(shè)備光通信接口設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)測量與控制,2011(4):45-50.
[6]屈丹.基于MPC8270的MCC驅(qū)動設(shè)計(jì)[J].電子設(shè)計(jì)工程,2014(24):174-176.
[7]張寅生,雷杰.基于MPC8270的VxWorks BSP的移植[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013(4):96-99.
[8]呂晨,李健,張激,等.VxWorks下UDP過載斷流問題的改進(jìn)[J].信息技術(shù),2016(8):167-170.
[9]張煜,陳欣,宋力兵,等.基于MPC8280的CPU單元與內(nèi)部總線驅(qū)動程序設(shè)計(jì)[J].電子設(shè)計(jì)工程,2014(19):43-46.
[10]張?jiān)?,鄒程帥,張帥,等.基于VxWorks的PCI總線多功能數(shù)據(jù)采集卡驅(qū)動開發(fā)[J].電子設(shè)計(jì)工程,2012(12):39-41.
[11]李艷軍,高華,顧欣莉.實(shí)時(shí)嵌入式操作系統(tǒng)VxWorks設(shè)備驅(qū)動程序的設(shè)計(jì)[J].電子設(shè)計(jì)工程,2011(5):130-133.
[12]周勇軍.關(guān)于VxWorks系統(tǒng)及其研究現(xiàn)狀的評述[J].測控技術(shù),2015(3):89-90.
[13]肖磊.VxWorks下基于socket的網(wǎng)絡(luò)通信設(shè)計(jì)[J].計(jì)算機(jī)與網(wǎng)絡(luò),2012(9):13-15.
[14]陳懷民.VxWorks下設(shè)備驅(qū)動程序開發(fā)技術(shù)研究[J].現(xiàn)代電子技術(shù),2015(10):79-80.
[15]胡明民.基于實(shí)時(shí)操作系統(tǒng)VxWorks的驅(qū)動程序開發(fā)[D].西安:西安電子科技大學(xué),2012.
[16]曹桂平.VxWorkss設(shè)備驅(qū)動開發(fā)詳解[M].北京:電子工業(yè)出版社,2011.
[17]孫智博.嵌入式設(shè)備驅(qū)動開發(fā)精解[M].北京:人民郵電出版社,2013.