SERIAL_TIMEOUTS
structure
ReadIntervalTimeout
一個讀取操作,允許兩個連續字元(bytes)間讀取的最大時間量,以毫秒(milliseconds)為單位。超出最大時間量表示讀取操作超時。這個最大時間量不適用於該第一字節的讀取之前的時間間隔(意思為第一字元讀取的時候才開始計時)。這個值為零表示不使用間隔逾時。欲了解更多信息,請參見備註。
ReadTotalTimeoutMultiplier
ReadTotalTimeoutMultiplier
一個讀取操作,允許每一個字元(bytes)讀取的最大時間量,以毫秒(milliseconds)為單位。超出最大時間量表示一個讀取操作逾時。欲了解更多信息,請參見備註。
ReadTotalTimeoutConstant
ReadTotalTimeoutConstant
一個讀取操作,允許每一個讀取操作增加額外的時間最大量,以毫秒(milliseconds)為單位。超出最大時間量表示一個讀取操作逾時。欲了解更多信息,請參見備註。
WriteTotalTimeoutMultiplier
一個寫入操作,允許每一個字元(bytes)寫入的最大時間量,以毫秒(milliseconds)為單位。超出最大時間量表示一個寫入操作逾時。欲了解更多信息,請參見備註。
WriteTotalTimeoutConstant
一個寫入操作,允許每一個寫入操作增加額外的時間最大量,以毫秒(milliseconds)為單位。超出最大時間量表示一個寫入操作逾時。欲了解更多信息,請參見備註。一個寫入操作,允許每一個字元(bytes)寫入的最大時間量,以毫秒(milliseconds)為單位。超出最大時間量表示一個寫入操作逾時。欲了解更多信息,請參見備註。
WriteTotalTimeoutConstant
Remarks
IOCTL_SERIAL_SET_TIMEOUTS控制請求使用此結構來設定串列阜的讀寫逾時參數。
IOCTL_SERIAL_GET_TIMEOUTS I/O控制請求則使用此結構來重新取得先前透過IOCTL_SERIAL_SET_TIMEOUTS所設定的逾時參數。
當指定的bytes數量傳輸完或是讀寫請求逾時,在驅動實作上都表示讀寫請求成功完成。當指定的bytes數量傳輸完成,則回覆請求的狀態碼(status code)為STATUS_SUCCESS,如果讀寫操作逾時則回覆系統核心STATUS_TIMEOUT。
Tₘₐₓ =Nₜₒₜₐₗ * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant
當逾時發生,表示一個讀取請求的完成超出了最大時間量,並且驅動會回覆此請求STATUS_TIMEOUT。在I/O status block中的Information欄位會填寫逾時發生前所成功讀取到的位元長度。
如果一個 IRP_MJ_WRITE請求指定一個寫入操作要寫入Nₜₒₜₐₗ位元的長度,則串列阜所能允許寫入操作完成的最大的時間量Tₘₐₓ,其時間量計算如下:
當逾時發生,表示一個讀取請求的完成超出了最大時間量,並且驅動會回覆此請求STATUS_TIMEOUT。在I/O status block中的Information欄位會填寫逾時發生前所成功讀取到的位元長度。
如果一個 IRP_MJ_WRITE請求指定一個寫入操作要寫入Nₜₒₜₐₗ位元的長度,則串列阜所能允許寫入操作完成的最大的時間量Tₘₐₓ,其時間量計算如下:
Tₘₐₓ =Nₜₒₜₐₗ * WriteTotalTimeoutMultiplier + WriteTotalTimeoutConstant
當逾時發生,表示一個寫入請求的完成超出了最大時間量,並且驅動會回覆此請求STATUS_TIMEOUT。在I/O status block中的Information欄位會填寫逾時發生前已經成功寫入的位元長度。
當逾時發生,表示一個寫入請求的完成超出了最大時間量,並且驅動會回覆此請求STATUS_TIMEOUT。在I/O status block中的Information欄位會填寫逾時發生前已經成功寫入的位元長度。
允許讀寫完成的最大時間, Tₘₐₓ, 其計時總是起於串列阜開始操作此請求,而不是當客戶端遞交此請求時就開始計時。(LW: 客戶端的讀寫命令可能會在驅動中的佇列排隊,一直等到驅動要操作此讀寫請求的時候,才開始執行此讀寫請求的計時)。
ReadIntervalTimeout, ReadTotalTimeoutMultiplier,
ReadTotalTimeoutConstant 若皆為零,則讀取操作絕不會逾時。
WriteTotalTimeoutMultiplier , WriteTotalTimeoutConstant 若皆為零,則寫入操作絕不會逾時。
如果ReadIntervalTimeout 為零,則在讀取操作中連續位元之間不存在最大的時間間隔,逾時時間間隔僅僅基於ReadTotalTimeoutMultiplier ,ReadTotalTimeoutConstant 。
ReadTotalTimeoutMultiplier ,ReadTotalTimeoutConstant 若皆為零,且ReadIntervalTimeout 的值小於MAXULONG並且大於零,則當連續接收位元發生一對位元之間讀取時間超出了ReadIntervalTimeout,則表示一個讀取操作逾時。如果這三個逾時參數都有使用,且串列阜內部緩衝區為空,則當讀取請求發送至此阜時,在此阜接收最少一個byte的新數據前,此請求都不會逾時。
如果ReadIntervalTimeout 參數設定的值為MAXULONG,而且另外兩個參數 ReadTotalTimeoutConstant 以及 ReadTotalTimeoutMultiplier 皆為零,則讀取請求會立即完成,即便沒有接收到新的數據。讀取請求也會回覆STATUS_SUCCESS。
ReadIntervalTimeout , ReadTotalTimeoutMultiplier 若皆設定為MAXULONG,且ReadTotalTimeoutConstant 設定大於零且小於MAXULONG,則讀取請求的行為如下:
- 如果串列阜內的輸入緩衝區有任何數據,則讀取請求立即完成輸入緩衝區內的位元數並且返回STATUS_SUCCESS。
- 如果輸入緩衝區內沒有任何的數據,則串列阜會一直等待。直到一個byte到達,並在同時立即完成一個byte的讀取完成以及回傳STATUS_SUCCESS的狀態碼。
- 如果在指定的ReadTotalTimeoutConstant時限內都沒有數據到達,則讀取請求逾時。設定I/O status block 中的Information 欄位值為零,並且回傳STATUS_TIMEOUT的狀態碼。
若客戶端提交一個IOCTL_SERIAL_SET_TIMEOUTS ,並且設定ReadIntervalTimeout ,ReadTotalTimeoutConstant參數為MAXULONG,則這個要求示為失敗並且回覆系統INVALID_PARAMETER的錯誤狀態碼。
如果事先不知道數據流的長度,一個讀取間隔逾時可以用作偵測輸入數據流的結尾。如果讀取請求使用這個技術,則STATUS_TIMEOUT的完成狀態通常表示這個請求已經成功的完成。
當輸入的數據間其時間間隔超出了ReadIntervalTimeout 的值,則發生一個讀取間隔逾時。逾時間隔由系統時鐘計算,而系統時鐘粒度(granularity)限制了逾時精準度的測量。其結果是,一個延時可能發生在一個系統時鐘tick的前後,更精確地說這取決於時間間隔的起始終止時間坐落於系統時鐘tick之間。逾時可能會有延遲的情況發生,當系統中斷處理其他裝置可能會造成系統時鐘中斷延遲。如果一個指定的逾時間隔接近或是小於系統時鐘ticks間的週期,則逾時可能無延遲並且立即發生。 <#1>
要更精準地測量較少的超時時間間隔,一種可能的方式是減少系統時鐘週期,但這樣做很可能會增加耗電量。此外,就算降低了系統時鐘週期也可能無法可靠地實現更精細的系統時鐘粒度,除非在平台上的各種驅動程序的中斷相關的處理可以保證不會耽誤系統時鐘中斷處理。
SERIAL_TIMEOUTS 結構類似COMMTIMEOUTS結構,COMMTIMEOUTS 結構用於使用者模式的SetCommTimeouts 以及 GetCommTimeouts。
#1 T1計時器坐落於系統clock tick前,所以幾乎是不會延遲的。而T2計時器位於tick之間,有可能因為系統clock中斷,系統跑去處理其他裝置的事情,導致T2有些微的延遲。
SERIAL_TIMEOUTS 結構類似COMMTIMEOUTS結構,COMMTIMEOUTS 結構用於使用者模式的SetCommTimeouts 以及 GetCommTimeouts。
#1 T1計時器坐落於系統clock tick前,所以幾乎是不會延遲的。而T2計時器位於tick之間,有可能因為系統clock中斷,系統跑去處理其他裝置的事情,導致T2有些微的延遲。
沒有留言:
張貼留言