usb可見裝置狀態分為連線(attached),上電(powered),預設(default),位址(address),配置(configured)和掛起(suspended)6個狀態。所謂可見,即usb系統和主機可見的狀態,其他狀態屬於usb裝置內部而不可見。其中有關電源的,大致可分下面三類:
1. 連線狀態(attached):裝置連線,但未提供電源。
2. 上電狀態(powered):裝置被復位(reset),或者說處於位址、配置狀態.
3. 掛起狀態(suspended):3 ms未見匯流排活動而處於省電狀態,裝置不可用,但仍然保持原有的usb位址和配置。
裝置的掛起
我們知道,在usb系統中,正常狀態下hub或root hub會一直周期性地傳送sof包(start of frame,全速usb每1ms傳送乙個,高速usb則是125µs傳送乙個)。根據usb協議,如果usb線上一直處於空閒(idle)狀態超過3ms,裝置應該把它當作乙個掛起(suspended)訊號,要求裝置在10ms內進入掛起狀態,並把裝置所需的電流大小降到規定的值(對於low-power裝置,要求是500
µa,而對於high-power或支援遠端喚醒(remote wakeup)功能的裝置是2.5ma)在掛起狀態中,裝置必須繼續向資料項d+/d-的上拉電阻提供電壓以維持idle狀態。而對於usb2.0高速裝置,還有些額外的要求:
1. 高速裝置在收到掛起訊號(3ms空閒)後,應在0.125ms內切換到全速狀態,也就是說要把終端電阻移除,並在d+資料線上重新掛上1.5k上拉電阻。
2. 裝置在隨後的100-875µs內檢測資料線上的狀態。如果該狀態是乙個full speed j,那麼說明host發下來的是乙個掛起訊號;如果此時該狀態是se0,說明是host drive資料線d+到0,這是乙個復位訊號(復位訊號會持續至少10ms時間)。
要注意的是高速裝置在掛起狀態時處於高速模式,只是所用的是全速訊號。一旦從掛起狀態恢復回來,會馬上進入高速工作狀態而無需進行復位操作。
如上圖所示,host在a點停止傳送sof,系統處於se0狀態,b點是3ms時間點,之後的125µs內,裝置移除終端電阻,並掛上1.5k上拉。此時如host傳送的是suspend訊號,那它就不會不drive d+資料線,導致d+被裝置拉高,形成乙個full speed j狀態。在c點之後100-875µs內裝置檢測此時host行為,發現是suspend訊號,裝置內部進入低功耗的掛起(suspend)狀態。(假如hsot傳送的是復位訊號,那麼當裝置在c點掛1.5k電阻之後,由於host對d+線的drive作用,d+線無法被拉高,仍然處於se0狀態,裝置在c點之後的檢測,發現的還是se0狀態,等到10ms後就可判斷這是乙個復位訊號,進行裝置復位操作。)
裝置的喚醒
裝置處於掛起狀態時,任何匯流排上的活動(非空閒訊號)都可以把裝置喚醒/恢復,從而退出低功耗模式。(同樣,裝置也可以換醒host,比如電腦待機時通過usb鍵盤來換醒主機,這種功能稱之為「遠端喚醒」(remote wakeup),不在本文的討論範圍內。)
因為裝置掛起時處於全速訊號,在當host需要把將裝置退出suspend狀態時,需要先傳送乙個持續時間超過20ms的fulll speed k狀態。裝置看到k狀態結束的1.3us內醒過來,而host需要在3ms內傳送usof訊號以維持正常的高速訊號模式,否則裝置又將進入suspend。如下圖所示
Linux 執行緒掛起與喚醒功能 例項
pthread cond wait 多執行緒的條件變數 條件變數是利用執行緒間共享的 全域性變數 進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數 的使用總是和乙個 互斥鎖結合在一起。建立和登出 條件...
執行緒的掛起,喚醒和終止
如果是利用h afxbeginthread 建立執行緒,需要獲取控制代碼,h m hthread 執行緒的掛起 在createthread 等函式建立執行緒時,可以指定執行緒的掛起狀態,在執行過程中也可以掛起執行緒 dword suspendthread handle hthread hthread...
java 執行緒的掛起和喚醒
這三個方法依賴於同乙個鎖物件,也就是說只能採用同乙個鎖的物件的notify喚醒該鎖wait造成的掛起。注意在呼叫notify和wait方法的時候,首先得獲取該鎖的使用許可權。wait 方法將執行緒阻塞。如果有十個執行緒呼叫了某個鎖物件的wait方法,則10個執行緒都掛起。如果將這十個執行緒都喚醒,則...