2017-09-22 134 views
0

這是我第一個使用WinUsb驅動程序和庫的項目。WinUsb:寫OUT管道導致IN管道中的數據損壞

我的主機運行WINDOWS 10,安裝了所有更新。 我的高速設備運行三個數據端點: -OUT命令端點:主機使用它發送命令 -IN回覆端點:主機收到每個命令的回覆 -IN Stream端點:設備發送流數據, 1600字節與 週期10毫秒。

在主機應用程序中,有兩個相關的主題: - 命令線程發送命令來命令管和 回覆管收到回覆 - 流線收集來自流管 非等待功能的數據被用於所有管道。

如果另一個線程被掛起,每個線程都可以完美工作。 但是,如果兩個線程同時工作,則流數據在任意點出現損壞。

更多分析揭示了以下事實: - 損壞顯示爲連續的錯誤字節序列。 錯誤序列的長度大致對應於 命令和答覆的長度。 - 錯誤的序列從與數據包邊界無關的任意點開始。 - 錯誤的字節可能不同;有時候,他們都是零,有時他們看起來像垃圾。 - 時間分析表明,一旦命令發送到命令管道,就會發生損壞 。

效果消失如果我在線程之間實現同步,以便讀/寫操作及時分開。然而,這是不可接受的解決方案,我想要兩個線程異步工作。 有人遇到過這種情況嗎?

+0

沒有什麼理由懷疑這個圖書館,特別是考慮到它經常被敲打的頻率以及它的功能有多少。設備固件出錯的可能性更大。做什麼都行。 –

+0

設備固件是我第一次猜測,特別是因爲它也是我的項目的一部分。因此,我在傳輸之前和之後實施了對流緩衝區完整性的檢查。沒有發現問題。 –

+0

如果不是庫或固件 - 那麼只有硬件保留? –

回答

0

回答我的問題...

漢斯的意見是正確的,問題的根源在於固件。

有關設備固件開發人員的更多細節可能會很有趣,特別是如果他們像我一樣使用Atmel Cortex M7系列。

在這個系列中,USB控制器包含用於端點緩衝的雙端口RAM。 DPRAM僅由硬件分配和管理。固件通過設置端點控制寄存器中的ALLOC位來初始化分配。用戶手冊要求固件應按升序設置ALLOC位。在項目歷史記錄之後,我更改了端點描述符中的端點地址,但沒有意識到此更改違反了DPRAM分配的升序。結果,端點緩衝區出現重疊,導致問題中描述的數據干擾。

修復了這個bug後,一切正常。