閔衛鋒,馬安良
(楊凌職業技術學院陜西楊凌712100)
MPC852T是一款高性能通用通信處理器,在該芯片中,將PowerPC內核和通信外設集成于一體,配有多個支持各種通信協議的外設接口因此,該處理器芯片特別適用于通信領域。相對于其他操作系統,VxWorks除了具備常見操作系統的功能外,系統調度和硬實時(確定性)方面有明顯的優勢,開發工具非常完善,能提供良好的調試機制。它以其良好的可靠性和卓越性能廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中。實現了一個基于MPC852T處理器和VxWorks操作系統的END接口標準的以太網驅動程序,為上層軟件提供標準調用接口,分層設計保證了相對的獨立性,方便跨平臺移植。
MPC852T具有快速以太網控制器(FEC),通過配置FEC的工作模式寄存器GFMR,可以使FEC工作于以太網模式,FEC相對獨立,FEC的實現不影響CPM的其它性能。
以太網驅動主要是實現數據的發送、接收,以及完成BD表等,整個過程內核參與較少。發送過程主要由FEC來完成,太網發送被內核使能之后,FEC就按照固定的時間間隔(512個串行時鐘)去輪詢發送BD表,如果BD表中有數據需要發送,則進行發送操作。這種輪詢方式有可能會造成數據延遲。對于實時性要求比較高的數據發送,上層軟件在數據準備好之后,可以通過置位TODR[TOD],直接進行發送操作,而不必等到下一次的查詢。在全雙工方式下,以太網控制器不檢測沖突,只維持幀間的最小間隔(96個串行時鐘),但是在半雙工模式下,在數據發送之前,就需要進行沖突檢測。如果線路忙,則推遲發送。只有當CRS信號保持60個串行時鐘的無效狀態后,再等待CRS信號繼續無效36個串行時鐘才開始數據發送。
接收被內核使能后,在搜索模式(RX_DV有效且COL無效)判斷FEC數據同步寄存器(FDSR)和進入接收移位寄存器的數據,直到匹配時搜索模式結束。提取數據數據幀的首字節,進行數據鑒權,通過后開始接收數據并寫入內存,所有數據接收完畢后通知內核進行后續處理。
驅動程序需要完成的部分,是提供CPU相關的TxBD和RxBD操作的方法,當有數據需要發送時,要從CPU取得數據,填充到TxBD中去,當收到數據時,需要將收到的數據通知到網絡接收任務。與TTY設備相似地,基于此,需要完成硬件寄存器的初始化,緩存空間的初始化,中斷向量的關聯,向VxWorks內核提供標準的接口函數。
為了保證網絡協議層與網絡設備驅動層的無關性,VxWorks操作系統在網絡設備驅動層和網絡協議層之間增加了MUX接口層,MUX接口層有效隔離了網絡設備驅動程序和協議層協議,使得網絡設備驅動程序和協議相對獨立,雙方只有一個公共的接口就是MUX接口層。MUX接口層分別為網絡設備驅動層和網絡協議層提供了統一標準接口,而網絡設備驅動層和網絡協議層只需要跟對應的接口進行操作,雙方并無直接交互。MUX接口層的加入,有效的避免了網絡設備驅動層和網絡協議層直接操作,方便設備驅動程序和協議的移植和擴展。
MUX提供的接口如圖1所示。
以太網驅動程序也可以劃分為硬件初始化和API兩部分。其中,硬件初始化工作是在系統上電初始化的時候完成的。API部分主要是提供了MUX接口層必須的一些標準接口函數。這里重點介紹硬件初始化部分以及驅動程序中用到的關鍵數據結構。
以太網設備的初始化一般要在作為控制端口的TTY設備初始化完成之后才開始。實際上,網口也可以在整個系統任務都運行完之后再進行加載。加載函數的接口是以結構END_TBL_ENTRY為元素的函數入口。END_TBL_ENTRY結構定義如下:


圖1MUX接口示意圖
第一個數值是設備的單元號,當加載這個驅動入口時,相應的設備名就是devName#unit,這樣可以使用同一個加載函數入口實現多個設備單元的加載。
第二個就是加載函數入口,后續會詳細描述。第三個是加載的入口字符串,用以提供對設備的詳細描述。
第四個是借用緩存的標識,即收發數據時是否作一次拷貝?目前不使用這個參數。
第五個是BSP的參數入口,即當系統調用函數endLoadFunc()時,提供的void*參數。
第六個是記錄是否有效的標志。這個辦法可以讓一個入口不必使用注釋掉代碼的辦法停止一個驅動的加載。要使能這個驅動的加載,這個變量值寫為FALSE,那么系統會加載這個驅動,在完成加載后將這個值寫為TRUE。如果在靜態配置中把這個值寫為TRUE,系統就會停止該驅動的加載。
END_TBL_ENTRY結構變量存放在文件configNet.h文件的數組endDevTbl[]里,最終這個文件會被包含在xxxConfig.c文件(xxxConfig.c文件是指bootConfig.c或者prjConfig.c)里。系統通過muxDevLoad()函 數 來 加 載 endLoadFunc(參 考 <usrNetwork.c>):


endLoadFunc()函數從 muxDevLoad()入口點被系統加載后,就會在需要的地方被系統調用。
END驅動加載如圖2所示。

圖2 END驅動加載示意圖
系統在muxDevLoad()函數中調用endLoadFunc()函數時,并不是直接將END_TBL_ENTRY表中的初始化字符提供給endLoadFunc()函數,而是先提供一個空的字符串以獲取該設備的名稱,然后在設備列表中尋找這個設備的驅動,如果找到該驅動,則停止調用endLoadFunc()函數以免重復執行,如果找不到該驅動,才會繼續執行加載,并會將該驅動的單元號追加到初始化字符串的頭部。這在TORNADO的相關說明文檔中并沒有提及。
在加載完畢后系統通過調用NET_FUNCS驅動函數組中的motFecStar(t)函數將中斷和處理函數連接并且使中斷使能。也可以手動調用muxDevStart()函數執行網口的啟用。
這里特別敘述一下數據的接收處理過程。數據接收通過motFecStar(t)函數使能接收中斷,當滿足條件的數據完成一幀的接收,它首先被放在RxBD指向的BUFFER中,然后觸發CPU的接收中斷。在由硬件驅動完成的中斷處理函數中,需要通過netJobAdd()將任務級接收函數轉交tNetTask任務處理。
netJobAdd()函數處理的主要流程即是調用msgQSend()函數向tNetTask任務發送一個消息,消息的第一個參數即是期望的處理函數入口指針,其余的參數則是提供給處理函數的參數。tNetTask()任務在收到該消息之后即將消息緩存中的第一個4字節組作為函數指針,其余的消息作為函數指針的入參,然后調用處理函數。所以如果使用netJobAdd()調用的函數處理出現異常,將會導致網絡任務的異常乃至崩潰產生。
驅動層處理收到的數據時,可以調用endLib.h庫中提供的 END_RCV_RTN_CALL(pEnd,pMblk)宏。該宏實際上是調用muxReceive()函數進行數據的接收處理,該函數是在運行muxDevLoad()時被TORNADO系統加載的,這就將數據的接收流程交給了TORNADO系統。在TORNADO的MUX層,系統會通過muxBind()函數將不同協議的數據接收數理函數添加到處理函數列表中,這些處理函數就會在muxReceive()函數中得到執行。
文中分析了在VxWorks操作系統上實現基于MPC852T的END標準以太網驅動的設計原理和軟件架構,充分發揮了MPC852T的強大控制能力和通信能力,以及VxWorks操作系統資源調度能力和實時性的特性,滿足了用戶的需求,達到預期目標。為上層軟件提供了標準調用接口,經實際產品驗證,該END標準以太網驅動穩定、可靠。
[1]周俊杰,何攀峰.基于VxWorks的實時多任務軟件框架設計[J].國外電子測量技術,2012,31(4):80-82.
[2]馮先成,李寒,張鐵男.基于MPC850 VxWorks系統的BSP設計[J].計算機與數字工程,2012,40(6):39-43.
[3]張宇坤,袁冬莉,黃鑫鑫,等.基于VxWorks的網卡驅動程序開發[J].計算機技術與發展,2013(1):18-20.
[4]張宇,王省書,胡春生.基于VxWorks的多任務實時性分析[J].微處理機,2013,34(1):53-57.
[5]樓楊.基于MPC8548的嵌入式設備光通信接口設計與實現[J].計算機測量與控制,2011(4):45-50.
[6]屈丹.基于MPC8270的MCC驅動設計[J].電子設計工程,2014(24):174-176.
[7]張寅生,雷杰.基于MPC8270的VxWorks BSP的移植[J].計算機技術與發展,2013(4):96-99.
[8]呂晨,李健,張激,等.VxWorks下UDP過載斷流問題的改進[J].信息技術,2016(8):167-170.
[9]張煜,陳欣,宋力兵,等.基于MPC8280的CPU單元與內部總線驅動程序設計[J].電子設計工程,2014(19):43-46.
[10]張原,鄒程帥,張帥,等.基于VxWorks的PCI總線多功能數據采集卡驅動開發[J].電子設計工程,2012(12):39-41.
[11]李艷軍,高華,顧欣莉.實時嵌入式操作系統VxWorks設備驅動程序的設計[J].電子設計工程,2011(5):130-133.
[12]周勇軍.關于VxWorks系統及其研究現狀的評述[J].測控技術,2015(3):89-90.
[13]肖磊.VxWorks下基于socket的網絡通信設計[J].計算機與網絡,2012(9):13-15.
[14]陳懷民.VxWorks下設備驅動程序開發技術研究[J].現代電子技術,2015(10):79-80.
[15]胡明民.基于實時操作系統VxWorks的驅動程序開發[D].西安:西安電子科技大學,2012.
[16]曹桂平.VxWorkss設備驅動開發詳解[M].北京:電子工業出版社,2011.
[17]孫智博.嵌入式設備驅動開發精解[M].北京:人民郵電出版社,2013.