新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > VxWorks系統下的RTL8139驅動程序改進

        VxWorks系統下的RTL8139驅動程序改進

        ——
        作者:蔡衛平,張怡典 (九江職業技術學院 江西省九江市 332007) 時間:2007-01-26 來源:《電子工程師》 收藏

        0 引言

        rtl8139是臺灣realtek半導體公司生產的一種快速以太網控制器,提供符合pci2.2標準的接口,兼容ieee802.3u 100base-t規范,支持ieee-802.3x全雙工流量控制,支持10mbit.s-1/100mbit.s-1全雙工、半雙工自適應,價格便宜,性能穩定,是pc機、電信終端產品中應用最多的以太網控制器之一。rtl8139在各種操作系統下的驅動都能從realtek公司網頁下載,其中包括vxworks系統下的驅動,而且提供c源代碼。但是在嵌入式系統下,針對不同的硬件平臺,往往需要修改該驅動程序以提高其穩定性和效率。基于mpc8241 cpu的硬件平臺,本文提出rtl8139在vxworks系統下驅動程序的改進措施。

        1 硬件平臺簡介

        圖1所示為某交換機終端設備的部分硬件框圖。

        本文引用地址:http://www.104case.com/article/21292.htm

        cpu采用motorola公司的powerpc系列處理器之一的mpc8241,該芯片除嵌入32位powerpc處理器內核外,還集成了mpc107橋,提供pci接口與rtl8139連接,橋上有內存控制器,掛16mb sdram和4 mbflash。cpu時鐘是166mhz,sdram時鐘是66mhz,pci時鐘是33mhz,rtl8139工作在10mbit/s,半雙工方式,通過集線器(hub)連入internet,其作用是轉發由話音信號打成的數據包,要求1200pps(每秒數據包),且cpu占用率不高于50%。

        vxworks支持end(增加型網絡驅動)格式的以太網控制器驅動,提供mux層作為網絡協議和以太網控制器驅動間的接口,mux規定了驅動的接口函數,rtl8139驅動程序rtl8139end.c是完全按照end格式編寫的代碼,提供了所有mux層規定的接口函數,只要寫好rtl8139 pci配制空間寄存器,在sysrtl8139end.c中傳入pci空間首地址、中斷向量號和中斷優先級參數,按照end格式驅動裝載程序,裝載成功后rtl8139就能順利運行。

        2 驅動程序中需要解決的問題

        如果數據包的收發速率是均勻的,rtl8139完全可以達到前文提出的要求,但是internet上經常有突發的數據包,而rtl8139的接收fifo和發送fifo都只有2kb,加之rtl8139對收發數據包采取完全拷貝方式,在數據包突發期間,cpu占用率過高,來不及處理過多的數據包,從而造成丟包。在rtl8139end.c中,驅動的數據包緩沖和協議棧的內存池是完全分開的,數據包接收和發送都有1次拷貝過程,而高性能以太網控制器一般只在發送時需要拷貝1次,這樣每收發一個包,cpu需要多拷貝1次,這是導致rtl8139性能不高的重要原因,但這種包處理方式是由硬件決定的,驅動程序不能改變。事實上,在突發包很多的情況下,以太網控制器丟包是允許的,但突發時間過后,應恢復正常的收發包流程。但在前文介紹的硬件平臺上運行rtl8139end.c,在pc機上用sniffer以連續方式給rtl8139發數據包,測試時間為數十秒,停止發包后,在pc機上用ping命令測試rtl8139能否正常回包,結果不能ping通,表明rtl8139的收發包流程因突發包太多而中斷,且不能恢復。

        分析rtl8139end.c程序,其發送數據包流程如圖2所示。

        rtl8139有4個發送描述符,有各自的發送狀態寄存器tsd0~tsd3和發送起始地址寄存器tsad0~tsad3,每個發送描述符可發送1個數據包。在函數rtl8139send()中申請1個發送數據包緩沖區,將協議棧傳下來的數據包拷貝進該緩沖區,然后將該緩沖區的首地址寫入發送起始地址寄存器,最后填寫發送狀態寄存器,并將其own位置0,表示將該緩沖區交給rtl8139的發送dma管理,啟動發送操作。發送完成后rtl8139產生中斷,進人中斷服務程序rtl8139int(),調用rtl8139handlesendint(),在該函數中讀取發送狀態寄存器。如果own位為1,則表示發送dma操作完成,釋放相應的發送緩沖;否則表示發送dma操作未完成,該發送緩沖仍由rtl8139硬件所有,下次進入發送中斷再重新查看own位。如此循環往復,直到own位變為1,才能釋放相應的發送緩沖,其占用的發送描述符變為可用。

        以上過程可歸結為兩點:

        a)在rtl8139send()中申請1個數據包緩沖區,占用1個發送描述符;

        b)在rtl8139int()中釋放相應的數據包緩沖區和發送描述符。

        從以上分析可以看出,只要發包的這兩個環節不出問題,發包流程就不會中斷,另外,在rtl8139handlesendint()中,不是僅僅釋放1個包緩沖和描述符,而是將所有啟動過發包操作、發送狀態寄存器的own位變為1的描述符和相應包緩沖都釋放掉。這樣可增強程序的穩定性,在有突發包的情況下,cpu可能來不及響應中斷,即造成中斷丟失,但只要還有1個描述符可用,發包完成后能進中斷,就可以把以前占用的緩沖和描述符全部釋放掉。如果突發包太多,cpu連續4個發包中斷未響應,發送描述符全被占用,下次進入rtl8139send()將無發送描述符可用,也就不會再有發包中斷,rtl8139handlesendint()不會被調用,發送描述符無法釋放,發包流程就此中斷,不能恢復,這就是上述rtl8139不能ping通的原因。

        3 解決辦法

        根據以上分析,只有將被占用的發送描述符和發送緩沖釋放,發包流程才能恢復,這只要調用一次rtl8139handlesendint()就能實現。mpc8241片內集成有4個定時器(timero~timer3),可以使用其中的timero來產生硬件定時中斷。在中斷服務程序中,以rtl8139handlesendint函數指針作為入口參數調用netjobadd(),這樣就可以定時執行rtl8139handlesendint(),及時釋放被占用的發送描述符。這需要在rtl8139start()中添加如下代碼:

        電機保護器相關文章:電機保護器原理


        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宣威市| 九寨沟县| 阿拉善右旗| 通辽市| 咸丰县| 永靖县| 志丹县| 荃湾区| 高雄市| 江川县| 黄浦区| 郯城县| 九寨沟县| 秦安县| 潼关县| 柏乡县| 朝阳县| 奉新县| 华安县| 登封市| 新余市| 梨树县| 临沧市| 承德县| 正宁县| 巫山县| 岳西县| 尉犁县| 江口县| 溧阳市| 马边| 邵阳市| 铜山县| 昭平县| 冀州市| 沂水县| 定安县| 泾川县| 镇宁| 沧州市| 柏乡县|