ARM嵌入式系統開發之傳送過程的實現

2021-08-22 20:23:29 字數 1852 閱讀 1029

arm嵌入式系統開發之傳送過程的實現

要通過網絡卡傳送資料時,上層協議實體呼叫函式

hard_start_xmit()

,在我們的驅動程式中這個函式被對映成

dm9000_wait_to_send_packet()

函式,正如它名字中

wait

所表示的那樣,這個函式只完成了等待傳送的工作,實際的傳送是呼叫

dm9000_hardware_send_packet()

函式完成的,這也是前面提到的

buffer

分配機制的一種體現。

在具體介紹這兩個函式之前,有必要簡單說一說dm9000晶元傳送資料的工作原理。前面已經講過,為了增加網路吞吐量dm9000晶元內部整合了8k的buffer,晶元對這些buffer採用了記憶體頁面管理方式,每頁256b,內部暫存器支援簡單的記憶體分配指令。對於核心來說,傳送資料只是把資料從核心送到晶元的buffer中去,實際向物理媒介上的傳送和相關的控制(csma/cd)是由晶元自主完成的。完成情況通過中斷的方式通知核心。

在資料傳送中用到兩個函式。函式dm9000_wait_to_send_packet()一方面實現和上層協議介面,另一方面檢查buffer分配是否成功,如果成功就呼叫,dm9000_hardware_send_packet()將資料傳送到buffer中去,如果不成功,則開啟相關中斷,在分配成功時由中斷控制程式呼叫dm9000_hardware_send_packet()完成資料傳送。這兩個函式都用到linux網路協議棧中很重要的乙個資料結構sk_buff,關於它在講接收程式時再詳細介紹。下面結合**片段分析這兩個函式的功能實現。

static int dm9000_wait_to_send_packet( struct sk_buff* skb,struct net_device * dev )

以上**從skb中讀出資料長度做一些處理後,換算出所需的頁面數。然後向晶元發出分配buffer的請求,mc_alloc和mmu_cmd_reg都是在標頭檔案中定義的巨集,mc_alloc是分配buffer空間的暫存器指令,而mmu_cmd_reg是mmu命令暫存器的位址。

time_out = memory_wait_time;

do } while ( -- time_out );

這段**是檢查buffer分配是否成功,檢查的方法很特別。須說明一下,在系統初始化時buffer分配中斷是被遮蔽的,所以即使分配成功也不會產生物理中斷訊號,但是中斷狀態暫存器仍然會有相應標誌。這段**正是利用這個特性,在乙個時間範圍內檢查中斷狀態暫存器,檢查分配是否成功,這個是一種忙等待,但因為time_out設得很小所以在有些時候它比中斷方式效率高。

if ( !time_out )

如果超時,證明buffer忙,開啟buffer分配中斷,待分配成功時由中斷程式完成有關操作。

dm9000_hardware_send_packet(dev);

netif_wake_queue(dev);

return 0; }

如果不超時,直接呼叫dm9000_hardware_send_packet()完成傳送。下面來看dm9000_hardware_send_packet()函式,它的主要功能一是把資料從sk_buff結構中傳輸到晶元buffer區,二是進行傳輸後處理。資料傳輸部分涉及一些特殊問題處理,例如按字(16b)傳輸時如何處理奇數位元組的問題,以及構造乙太網幀頭結構問題等,這些問題各種網絡卡處理方式基本一致,相對比較煩瑣,所以在**片段中僅作表示。

static void dm9000_hardware_send_packet( struct net_device * dev )

傳送後處理,具體為開啟傳送相關的異常情況中斷,釋放skb空間,設定傳送時間、喚醒網路裝置等待佇列。

上述文字選自《arm嵌入式linux系統開發技術詳解》一書

ARM嵌入式系統開發之傳送過程的實現

arm嵌入式系統開發之傳送過程的實現 要通過網絡卡傳送資料時,上層協議實體呼叫函式 hard start xmit 在我們的驅動程式中這個函式被對映成 dm9000 wait to send packet 函式,正如它名字中 wait 所表示的那樣,這個函式只完成了等待傳送的工作,實際的傳送是呼叫 ...

ARM嵌入式系統開發 第一章之嵌入式系統的軟硬體

本章的最後,通過描述arm為核心的嵌入式系統,來介紹了嵌入式系統的軟體和硬體構成和結構。這裡根據這部分的介紹以及其他的文章,描述下通用的嵌入式系統的軟體和硬體。首先來說下硬體,書中說,包含有處理器,控制器,外設和匯流排四個部分。這是一種比較籠統的說法,如果要更籠統點來說,應該是包含處理器,匯流排,外...

ARM嵌入式系統開發之接收函式的實現

接收函式的實現 接收函式主要完成幾個方面的工作 一是檢查接收到的資料報是否正確 二是根據資料報長度在核心空間為資料報申請乙個sk buff 三是把資料報複製到sk buff,填寫相關域段和統計資訊並且把sk buff插入相應的輸入佇列 四是釋放資料報占用的晶元bufffer。下面就結合 片段講述其功...