基於MFC的USB上位機開發(5)下環路模組
延伸閱讀:
目錄
本模組用於FPGA下環路程式碼的測試,與環路測試不同,下環路中FPGA負責資料的先寫後讀,上位機僅負責資料的搬運,先向USB接收512位元組資料,再將資料原樣傳送至USB。本模組分手動下環路測試和自動下環路測試,手動模式下需要點選按鈕使上位機先接收512位元組資料,再手動傳送給USB,接收的資料會同步顯示在資料顯示框內。自動模式下上位機的先接收後傳送的操作會迴圈進行,直到點選停止按鈕為止。自動模式下設有測速開關,當下環路傳輸了20MByte資料時,上位機會統計傳輸總耗時以及計算平均速度,並結束自動下環路的執行緒。
1. 設計思路
1.1 手動下環路
手動下環路模組包括接收512位元組和傳送512位元組兩個功能。USB裝置連線時,點選接收512位元組按鈕,會使該按鈕和下環路測試按鈕被禁用,並建立接收512位元組資料的執行緒,接著在資料接收完成時,資料內容和任務耗時會被顯示在上位機上,最後結束該執行緒。點擊發送512位元組按鈕,如果之前沒有接收512位元組資料,上位機會提示“請先接收512位元組資料”,之前已接收就建立傳送執行緒,再將接收到的512位元組資料傳送給USB,接著將任務耗時顯示在上位機上,最後結束該執行緒。接收和傳送512位元組的程式流程圖如下所示:
1.2 自動下環路
自動下環路模組由一個速度測試開關按鈕和下環路測試按鈕組成,速度測試開關預設關閉。在測速關閉的情況下,點選下環路測試,下環路測試的狀態會一直進行,直到點選stop按鈕才結束。在測速開關開啟的情況下,點選下環路測試,上位機進行10240次下環路傳輸後,會統計任務耗時和計算資料傳輸的平均速度,並將它們顯示在上位機上,最後自動結束下環路執行緒。下環路的程式流程圖如下所示:
2. 功能測試
2.1 手動下環路測試
(1)上位機向USB接收512位元組資料,任務耗時85.12 us。
(2)上位機向USB傳送512位元組資料,任務耗時106.55 us。
2.2 自動下環路測試
(1)速度開關關閉時,進行下環路測試。
(2)速度開關開啟時,進行下環路測試,任務傳輸資料為5MByte,總耗時7.74s,平均速度達1.29MB/s。
3. USB傳輸速度分析
3.1 手動下環路傳輸耗時
在接收512位元組、傳送512位元組和下環路的執行緒函式中均有一個控制傳輸位元組數的變數Xfer,現在測試一下在不同Xfer的情況下,資料在裝置間的傳輸耗時的變化,下圖中t1為USB到上位機之間的接收耗時,t2為上位機到USB之間的傳送耗時,t3和t4分別為FPGA的讀耗時和寫耗時。t1和t2可以通過上位機之間統計出來,t3和t4需要根據傳輸資料的位元組數N和資料讀寫時鐘頻率f來計算,計算公式為t=N/(2*f)。
在上位機手動下環路測試時,傳輸耗時不是固定的,存在一定的波動,以下t1和t2均為5次測試後的平均值。
下環路資料長度(Byte) |
t1平均耗時(us) |
t2平均耗時(us) |
t3平均耗時(us) |
t4平均耗時(us) |
512Byte |
81.6 |
89.2 |
5.3 |
5.3 |
1024Byte |
99.2 |
105.8 |
10.6 |
10.6 |
1536Byte |
113.6 |
114.8 |
15.9 |
15.9 |
2048Byte |
110.4 |
121.0 |
21.2 |
21.2 |
以上資料可以看出:
(1)下環路資料長度增加512位元組,上位機與USB之間的傳輸耗時可能會增加10us左右;
(2)資料長度加倍,USB與上位機之間的傳輸耗時並不會加倍;
(3)下環路的主要耗時集中在上位機的資料接收和傳送環節。
3.2 自動下環路速度測試
平均速度的計算公式rate=(Xfer*2*10240)/t,其中t為任務耗時。同樣的,修改下環路的執行緒函式中Xfer大小,在不同的Xfer情況下,下環路的平均速度如下:
環路資料長度(Byte) |
環路次數 |
傳輸位元組數(MB) |
任務耗時(s) |
平均速度(MB/s) |
512 |
10240 |
5 |
7.35 |
1.36 |
1024 |
10240 |
10 |
7.37 |
2.71 |
1536 |
10240 |
15 |
7.27 |
4.12 |
2048 |
10240 |
20 |
7.34 |
5.45 |
以上資料可以看出:
(1)資料傳輸長度Xfer對下環路傳輸的總耗時影響不大;
(2)在環路次數不變的情況下,Xfer成倍增加時,平均速度也成倍增加。
(3)要想提高USB的傳輸速度,單次傳輸的資料量越大越好。