USB2.0 規(guī)范中傳輸速度是 480 Mbps(即 60 MB/s)。但是很多 USB2.0 設(shè)備在實際工作時的數(shù)據(jù)傳輸速度卻與此相差甚遠,比如用 PC 用 U 盤拷個東西,往往比 60MB/s 慢很多,這是為什么呢?
其實想想也能知道一些原因,USB 總線中傳輸數(shù)據(jù)的就一對差分線,單是其要同時支持各種設(shè)備(一個 USB HOST 設(shè)備通過 USB HUB 下面掛多個從設(shè)備是可以同時用的),支持雙向傳輸,必然存在復雜的協(xié)議,協(xié)議上面的開銷肯定不少,另外對于其中的單個設(shè)備來說也只能得到部分傳輸帶寬。
總的來說,主要有以下幾個因素:USB 協(xié)議開銷,USB 帶寬的分配,硬件結(jié)構(gòu),USB 設(shè)備驅(qū)動程序
USB 協(xié)議開銷
在 USB 數(shù)據(jù)通信的過程中,總線上傳輸?shù)牟⒉皇撬卸际怯行畔?,還要包括諸如同步信號、類型標識、校驗碼、握手信號等各種協(xié)議信息。因此實際數(shù)據(jù)傳輸?shù)乃俾矢緵]有可能達到總線傳輸?shù)臉O限速度 480 Mbps。且對不同的傳輸類型,存在不同的協(xié)議開銷。
USB 有 4 中傳輸模式:控制傳輸、批量傳輸、中斷傳輸、同步傳輸。
根據(jù) USB 協(xié)議,USB2.0 的告訴模式,1 秒有 8 個微幀,計算 4 中模式的最大速度傳輸如下:
傳輸類型 | 數(shù)據(jù)包長度 /Byte | 每微幀最大傳輸次數(shù) | 最大速度 /(MB/s) |
控制傳輸 | 64 | 31 | 15.137 |
中斷傳輸 | 1024 | 3 | 23.436 |
批量傳輸 | 512 | 13 | 50.781 |
同步傳輸 | 1024 | 3 | 24.436 |
控制傳輸:控制傳輸是雙向傳輸,數(shù)據(jù)量通常較小,主要用來進行查詢、配置和給?USB?設(shè)備發(fā)送通用的命令。
中斷傳輸:中斷傳輸方式主要用于定時查詢設(shè)備是否有中斷數(shù)據(jù)要傳送,該傳輸方式應用在少量的、分散的、不可預測的數(shù)據(jù)傳輸場合。鍵盤,鼠標等。
批量傳輸:在訪問 USB 總線時,相對其他傳輸類型具有最低的優(yōu)先級,USB HOST 總是優(yōu)先安排其他類型的傳輸,當總線帶寬有富余時才安排批量傳輸,打印機,掃描儀,存儲設(shè)備等。
同步傳輸:同步傳輸適用于以固定速率傳輸,可以容忍偶爾錯誤的數(shù)據(jù)上。實時傳輸一般用于 UVC 攝像頭等設(shè)備。數(shù)據(jù)傳錯時不會重傳。
USB 帶寬的分配
USB 協(xié)議規(guī)定,控制傳輸應確保在低 / 全速時能夠使用 10%的帶寬,高速時能夠使用 20%的帶寬。而批量傳輸并沒有保留任何帶寬。即批量傳輸只有在控制傳輸和其它傳輸不需要使用其帶寬的情況下,方能使用剩下的帶寬。因此,盡管總線閑置時批量傳輸可以在一段時間里盡快地傳輸大量的數(shù)據(jù),但總線忙時批量傳輸就可能工作很慢。
通常主機同時使用鼠標、鍵盤、攝像頭、打印機和掃描儀等多種 USB 設(shè)備,它們分別采用不同的傳輸方式。如果開始只有一個設(shè)備以批量傳輸方式獨占系統(tǒng)的全部帶寬,速度會很快(接近 53 MB/s)。但如果新插入的若干設(shè)備需要使用控制傳輸全部 20%的保留帶寬,那么先前設(shè)備批量傳輸?shù)目捎脦捑蜁陆档皆鹊?80%,傳輸速度可能變?yōu)?42 MB/s 以下。作為一種更極端情況是批量傳輸設(shè)備插入前,已有設(shè)備以控制傳輸方式完全占有了 20%的保留帶寬。其它設(shè)備也以中斷或者同步傳輸方式共同占據(jù)了剩下的 80%帶寬,那么批量傳輸設(shè)備就會因為沒有保留帶寬,只能處于等待的狀態(tài)。
硬件結(jié)構(gòu)
其實常用 USB 接口的硬件結(jié)構(gòu)如下圖,一個 USB HUB 下面掛了多個設(shè)備,即時我們用 PC 時是直接用的電腦的 USB 接口,那也是因為廠家把 USB HUB 做到 PC 里面了,這樣才能有這么多的 USB 接口。
USB HUB 的外設(shè)(Device 端)所有的數(shù)據(jù)之和是和 HOST 端一樣的,而 HOST 端也不能超過 480Mb/s,所以 480Mb/s 的速度是大家共享的,而不是某一個獨享。
USB 設(shè)備驅(qū)動程序
USB 設(shè)備的驅(qū)動可以分為設(shè)備驅(qū)動程序、USB 總線驅(qū)動程序、USB 控制器驅(qū)動程序三個部分。應用程序通過使用 API 函數(shù)與 USB 設(shè)備驅(qū)動程序聯(lián)系。USB 設(shè)備驅(qū)動程序通過調(diào)用驅(qū)動程序完成對設(shè)備的數(shù)據(jù)讀寫。USB 總線驅(qū)動程序和 USB2.0 控制器驅(qū)動程序由操作系統(tǒng)提供。設(shè)備驅(qū)動通過構(gòu)造 URB(USB Request Block),并傳給總線驅(qū)動程序來完成與總線驅(qū)動程序的通信。
通常情況下設(shè)備驅(qū)動程序需要頻繁產(chǎn)生中斷。而設(shè)備驅(qū)動程序系統(tǒng)優(yōu)先級并不高,當計算機負荷較重或者有其它優(yōu)先級較高的中斷發(fā)生時,它的中斷得不到處理而需要等待。如果設(shè)備驅(qū)動程序向 USB 總線傳遞 URB 的時候設(shè)置一個較大的緩沖區(qū) . 便可減少了中斷的頻率而減少等待時間。從而提高數(shù)據(jù)傳輸?shù)乃俣取4送?,調(diào)整驅(qū)動程序中諸如命令排隊策略、改變請求包大小等措施,也能對 USB 的數(shù)據(jù)傳輸速度產(chǎn)生一定的影響。
綜上所述,通常所說的 480 Mbps 是 USB2.0 總線速度的上限 . 考慮通信協(xié)議的開銷后,實際數(shù)據(jù)的傳輸速度存理論上最高也只有 53 MB/s(426Mbps). 實際綜合條件下 15 MB/s 至 25 MB/s 都可以作為合理的高速目標。