盡量減少喚醒租約取得次數,且不設逾時時間
假設您有 Driver X,可接收可喚醒系統的中斷。驅動程式 X 接著會對中斷進行一些處理,並將事件傳遞至驅動程式 Y。理想情況下,Driver X 只會在實際喚醒系統的中斷到達時,或 Driver X 觀察到系統開始暫停且不知道 Driver Y 是否已處理先前的事件時,才取得喚醒租約。
對於下列兩種方法,我們需要觀察系統何時暫停和恢復。如要瞭解如何觀察這些系統轉換,請參閱「對暫停或繼續執行採取行動」。
頻帶內租用
首先,假設 Driver X 和 Driver Y 使用相同的通訊協定,其中訊息可包含事件資料、喚醒租約,或事件資料和喚醒租約。在 FIDL 中,我們會將此項目表示為含有喚醒租約和事件資料的資料表。
當 Driver X 在系統暫停時收到中斷時,會發生以下情況:
- 建立喚醒租約
- 確認中斷
- 針對收到的最後一個事件遞增序號
- 在建立喚醒租約時,為上次事件增加序號
- 將事件和喚醒租約傳送至 Driver Y
當 Driver X 在系統復原 (即未暫停) 時收到事件時,會執行以下動作:
- 確認中斷
- 針對收到的最後一個事件遞增序號
- 傳送事件給 Driver Y
當 Driver X 觀察到系統開始暫停時:
比較收到的最後一個事件序號,與上次建立喚醒授權的序號,如果不相符,則:
- 建立喚醒租約
- 傳送喚醒租約給 Driver Y
Driver Y 會接收訊息,如果訊息含有喚醒租約,Driver Y 會保留該訊息,直到處理 Driver X 的最新事件為止。
頻帶外租用
首先假設 Driver X 和 Driver Y 使用的是只談論其網域事件的通訊協定,並使用不同的通訊協定 (或單一通訊協定的不同方法) 傳遞喚醒權杖。
當 Driver X 在系統暫停時收到中斷時:
驅動程式 X:
- 建立喚醒租約
- 確認中斷
- 針對收到的最後一個事件遞增序號
- 在建立喚醒租約時,為上次事件增加序號
- 傳送 Driver Y 事件
- 傳送喚醒租約和序號給 Driver Y
駕駛員 Y (請注意,駕駛員 Y 可以以任一順序接收這兩則訊息):
接收事件:
- 處理
- 增加上次收到的序號
接收喚醒租約和序號:
- 保留喚醒權杖,直到上次看到的序號與權杖的序號相符為止
當 Driver X 在系統恢復 (即未暫停) 時收到事件時:
驅動程式 X:
- 確認中斷
- 針對收到的最後一個事件遞增序號
- 傳送 Driver Y 事件
駕駛 Y:
- 接收事件並加以處理
- 增加上次收到的序號
當 Driver X 觀察到系統開始暫停時:
驅動程式 X:
比較收到的最後一個事件序號,與上次建立的喚醒權杖租約序號,如果不相符,則:
- 建立喚醒租約
- 更新上次建立喚醒權杖的事件序號,以便與收到的最後一個事件序號相符
- 傳送喚醒租約和序號給 Driver Y
駕駛 Y:
- 接收喚醒租約和序號
- 保留喚醒權杖,直到上次看到的序號與權杖的序號相符為止