進階用法

盡量減少喚醒租約取得次數,且不設逾時時間

假設您有 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:

    • 接收喚醒租約和序號
    • 保留喚醒權杖,直到上次看到的序號與權杖的序號相符為止