zx_break_create

摘要

建立中斷物件。

宣告

#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 物件控制代碼,會大幅限制在 Driver Framework 內部建立中斷。驅動程式通常會透過各種 Driver Framework 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_WRITE (zx_interrupt_ack() 必須使用)、ZX_RIGHT_WAIT (zx_interrupt_wait() 必須使用) 和 ZX_RIGHT_SIGNAL (zx_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_HANDLE src_obj 控制代碼無效 (如果這不是虛擬中斷)

ZX_ERR_WRONG_TYPE src_obj 控制代碼的類型不適合建立中斷。

ZX_ERR_ACCESS_DENIED src_obj 控制代碼不允許這項作業。

ZX_ERR_INVALID_ARGS options 含有無效的旗標,或 out_handle 參數是無效指標。

ZX_ERR_NO_MEMORY 記憶體不足,導致失敗。 使用者空間無法妥善處理這項 (不太可能發生的) 錯誤。日後的版本將不會再發生這個錯誤。

另請參閱