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