摘要
將中斷物件繫結至埠。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_interrupt_bind(zx_handle_t handle,
zx_handle_t port_handle,
uint64_t key,
uint32_t options);
說明
zx_interrupt_bind()
會將中斷物件繫結或解除繫結至連接埠。
中斷物件只能繫結至單一通訊埠,且只能繫結一次,中斷只能繫結至使用 ZX_PORT_BIND_TO_INTERRUPT
選項建立的連接埠。
當已繫結的中斷物件觸發時,系統會將 ZX_PKT_TYPE_INTERRUPT
封包傳送至繫結的連接埠,並附上 zx_packet_interrupt_t
中斷觸發時的時間戳記 (相對於 ZX_CLOCK_BOOT
)。繫結中斷時使用的鍵會顯示在 zx_port_packet_t
的 key
欄位中。
如果所繫結的中斷處於觸發狀態,系統會將 ZX_PKT_TYPE_INTERRUPT
封包傳送至所繫結中斷的通訊埠,並附上觸發中斷的時間戳記。這個封包需要正常處理。
如要繫結至通訊埠,請在 options 中傳遞 ZX_INTERRUPT_BIND
。
如要取消繫結先前繫結的通訊埠,請傳遞「選項」中的 ZX_INTERRUPT_UNBIND
。對於解綁作業,系統會要求提供 port_handle,但會忽略 key。取消繫結通訊埠會移除先前排入通訊埠的封包。
在傳送另一個封包之前,必須使用 zx_interrupt_ack()
系統呼叫重新啟用已繫結的中斷。在大多數情況下,最好在中斷封包完全處理完畢後再執行這項操作。特別是在多個執行緒從通訊埠讀取封包的情況下,如果處理執行緒重新啟動中斷並觸發中斷,封包就會立即傳送至等候的執行緒。
中斷封包會透過通訊埠的專屬佇列傳送,優先順序高於非中斷封包。
權限
handle 必須是 ZX_OBJ_TYPE_INTERRUPT
類型,且具有 ZX_RIGHT_READ
。
port_handle 必須是 ZX_OBJ_TYPE_PORT
類型,且包含 ZX_RIGHT_WRITE
。
傳回值
zx_interrupt_bind()
會在成功時傳回 ZX_OK
。失敗時,系統會傳回負的錯誤值。
錯誤
ZX_ERR_BAD_HANDLE
handle 或 port_handle 不是有效的 handle。
ZX_ERR_WRONG_TYPE
handle 不是中斷物件,或是 port_handle 不是 port 物件。
ZX_ERR_CANCELED
在 handle 上呼叫 zx_interrupt_destroy()
。
ZX_ERR_BAD_STATE
執行緒正在使用 zx_interrupt_wait()
等待中斷狀態
ZX_ERR_ACCESS_DENIED
handle 缺少 ZX_RIGHT_READ
,或是 port_handle 缺少 ZX_RIGHT_WRITE
ZX_ERR_ALREADY_BOUND
此中斷物件已繫結。
ZX_ERR_INVALID_ARGS
options 不是 ZX_INTERRUPT_BIND
或 ZX_INTERRUPT_UNBIND
。
ZX_ERR_NOT_FOUND
這個通訊埠與繫結通訊埠不符。
另請參閱
zx_handle_close()
zx_interrupt_ack()
zx_interrupt_create()
zx_interrupt_destroy()
zx_interrupt_trigger()
zx_interrupt_wait()
zx_port_wait()