2015-10-11 56 views
0

我有兩個通過串行接口相互連接的處理器。一個處理器運行裸機循環,另一個運行linux。爲了簡化接口協議,我創建了一個類似以太網的框架,用於創建不同的消息類型。一些消息很小,小於200字節,而另一些則大得多,接近100兆字節。較大的消息被分解成一堆類似於TCP/IP棧的數據包。用於點對點通信的Linux驅動程序類型

我開始用在用戶空間中運行的輪詢循環。這需要專門的流程來處理數據包的接收和發送。發送給裸機的消息可以從幾個不同的程序啓動。其中一些程序旨在在系統供電期間運行,而另一些程序則是一個由用戶觸發的程序,在操作完成後不久終止。裸機設備期望接收整個消息作爲連續的數據包。因此,在發送消息時,過程必須完全控制變送器。

我試圖簡化接口,並可能加速它,因爲我們有一箇中斷信號可用通過嘗試創建一個內核驅動程序。目前我已經想出了與共享庫一起創建角色驅動程序的設計。共享庫將處理將數據分解成數據包並將數據形成幀。它也將與驅動程序接口並處理信號量。當進程調用共享庫打開函數時,它還會在驅動程序中創建郵箱結構來存儲給定PID的任何接收到的消息。裸機設備沒有真正的內存管理,我不參加添加任何消息,因此不會交織消息。

我的第一個問題是我相信我需要這個庫,不能在驅動程序中做所有事情,因爲我必須處理來自用戶空間的100 MByte數據緩衝區。庫函數將能夠獲取描述符並使用更合理的緩衝區大小將數據傳輸到驅動程序。這是一個正確的假設嗎?

我的第二個問題是我應該嘗試使用網絡設備嗎?我對字符設備有更多的經驗,所以這是我開始的。

+0

請張貼的代碼。我們怎樣如果我們無法訪問代碼,可以幫助您解決運行時問題嗎 – user3629249

+0

沒有代碼它是一個設計問題,旨在推動代碼的方向唯一存在的代碼是舊的用戶空間代碼,與被問到的問題無關 – rawbus

回答

0

我建議每一個新的進程得到一個線程在「開放式」處理

串行設備驅動程序獲取每一通電話的長度來寫,並且可以使用長度的malloc足夠的內存來保存消息。

推薦的設備驅動程序被寫入層,

1layer to handle the actual serial hardware 
1layer to handle the user interface (open, close, write entry points at a minimum) 
1layer to handle packet formation. 
1layer to handle sequencing of the messages 

串行設備驅動程序將是最簡單的,如果它造成了用戶進程然而塊上的寫,可能會對整體系統性能產生嚴重的影響,所以寫入操作可以在合適的存儲器段上運行,當串行設備驅動器'打開'時保持唯一信息,以使得排序層不混合實際發送的消息。

串行設備驅動程序也許應該通過中斷執行實際的I/O(大多數串口設備有一個內部緩衝區,以儘量減少處理中斷事件的總數。

+0

這個設計如何處理大寫操作,例如大小爲100MB?我喜歡避免擁有兩個大緩衝區,一個用於用戶空間,一個用於內核。 – rawbus