中断时间创建

摘要

创建中断对象。

声明

#include <zircon/syscalls.h>

zx_status_t zx_interrupt_create(zx_handle_t src_obj,
                                uint32_t src_num,
                                uint32_t options,
                                zx_handle_t* out_handle);

说明

zx_interrupt_create() 会创建一个中断对象,该对象表示 (物理)中断#physical-interrupts 或(虚拟)中断#virtual-interrupts 中断。我们强烈建议 Zircon 中断对象的用户阅读 (中断对象)中断概览文档,以便在代码中使用中断对象之前熟悉中断对象的操作模型。

如需创建物理中断,用户必须:

  • 通过 src_obj 参数传递用于创建平台中断的合适资源的句柄,或 PCI 对象的句柄。
  • 通过 src_num 参数传递关联的中断编号。

需要平台资源或 PCI 对象句柄在很大程度上将中断的创建限制在 驱动程序框架的内部。驱动程序通常通过各种 驱动程序框架 API 获取物理中断。

物理中断遵循以下选项:ZX_INTERRUPT_MODE_EDGE_LOWZX_INTERRUPT_MODE_EDGE_HIGHZX_INTERRUPT_MODE_LEVEL_LOWZX_INTERRUPT_MODE_LEVEL_HIGHZX_INTERRUPT_REMAP_IRQ

如需创建虚拟中断,用户可以通过 options 参数传递 ZX_INTERRUPT_VIRTUAL 标志。 虚拟中断始终表现为边沿触发的中断,其 极性无需指定,因为它们是由软件通过调用 zx_interrupt_trigger()而不是硬件信号触发的。

物理中断和虚拟中断都遵循 ZX_INTERRUPT_TIMESTAMP_MONO 选项。 使用此选项创建的中断将从 zx_interrupt_wait()返回单调时间戳,并且假定传递给zx_interrupt_trigger() 的时间戳位于单调时间轴上。默认情况下,这些时间戳在启动时间轴上运行。

这些句柄将具有 ZX_RIGHT_INSPECTZX_RIGHT_DUPLICATEZX_RIGHT_TRANSFER (允许通过 zx_channel_write() 将其发送到另一个进程)、ZX_RIGHT_READZX_RIGHT_WRITEzx_interrupt_ack() 需要此权限)、ZX_RIGHT_WAITzx_interrupt_wait() 需要此权限)和 ZX_RIGHT_SIGNALzx_interrupt_trigger() 需要此权限)。

当发生底层物理中断或对虚拟中断调用 zx_interrupt_trigger()时,中断会被 "触发"。当触发的中断通过zx_interrupt_bind()绑定到端口时,会导致数据包传递到该端口。 或者,如果中断未绑定到端口,用户可以使用对 zx_interrupt_wait() 的调用来阻止线程,直到中断被触发。

接收到中断发生的通知(来自端口数据包或从 对 zx_interrupt_wait() 的调用),然后在处理完成后确认中断是一个相当复杂的过程,具体取决于许多 因素。如需了解详情,请参阅(此处)Interrupts#waiting-for-and-acknowledging-interrupts,了解 详情。

权限

src_obj 必须具有资源类型 ZX_RSRC_KIND_IRQ

返回值

zx_interrupt_create() 在成功时返回 ZX_OK。如果失败,则返回负错误值。

错误

ZX_ERR_BAD_HANDLEsrc_obj 句柄无效(如果这不是虚拟中断)

ZX_ERR_WRONG_TYPEsrc_obj 句柄的类型不适合创建中断。

ZX_ERR_ACCESS_DENIEDsrc_obj 句柄不允许此操作。

ZX_ERR_INVALID_ARGS options 包含无效标志,或者 out_handle 参数是无效指针。

ZX_ERR_NO_MEMORY :因内存不足而失败。 用户空间没有好的方法来处理此(不太可能发生的)错误。 在未来的 build 中,此错误将不再发生。

另请参阅