摘要
将中断对象绑定到端口。
声明
#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。
如需取消绑定之前绑定的端口,请在 options 中传递 ZX_INTERRUPT_UNBIND。对于取消绑定,需要提供 port_handle,但会忽略 key。解除端口绑定会移除之前排队等待发送到该端口的数据包。
当中断已绑定到端口,并且中断数据包已传送至端口并被用户读取时,需要确认中断,然后才能传送另一个数据包。通过调用 zx_interrupt_ack() 系统调用来确认端口绑定中断。如需详细了解在使用与端口绑定的中断对象时如何接收和确认中断,请参阅(此处)Interrupts#asynchronous-waiting-and-acknowledgement。
中断数据包通过端口上的专用队列传送,优先级高于非中断数据包。
权限
句柄必须是 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 不是有效的句柄。
ZX_ERR_WRONG_TYPE 句柄不是中断对象,或者 port_handle不是端口对象。
在 handle 上调用了 ZX_ERR_CANCELED 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 选项不是 ZX_INTERRUPT_BIND 或 ZX_INTERRUPT_UNBIND。
ZX_ERR_NOT_FOUND 端口与绑定端口不匹配。