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。下面就結合 片段講述其功...