hardware-irq
硬件中断处理 API。
详细描述
RP2040 使用标准的 ARM 嵌套向量中断控制器(NVIC)。
中断由 0 到 31 的编号标识。
在 RP2040 上,NVIC 上只连接了低 26 个 IRQ 信号;IRQ 26 到 31 被置零(永不触发)。
每个核心有一个 NVIC,每个核心的 NVIC 连接相同的硬件中断线,但 IO 中断除外——每个 bank、每个核心各有一个 IO 中断。这些中断完全独立,例如,处理器 0 可以被 bank 0 中的 GPIO 0 中断,处理器 1 可以被同一 bank 中的 GPIO 1 中断。
所有 IRQ API 仅影响正在执行的核心(即调用该函数的核心)。
不应在两个核心上同时启用同一(共享)IRQ 编号,因为这会导致竞态条件或其中一个核心饥饿。此外,请记住,在一个核心上禁用中断不会禁用另一个核心上的中断。
有三种不同的方式为 IRQ 设置处理程序:
-
在运行时调用
irq_add_shared_handler()为当前核心上的多路复用中断(例如 GPIO bank)添加处理程序。每个处理程序都应检查并清除相关的硬件中断源 -
在运行时调用
irq_set_exclusive_handler()为当前核心上的中断安装单一处理程序 -
在应用程序中显式定义中断处理程序(例如,定义 void
isr_dma_0将使该函数成为核心 0 上 DMA_IRQ_0 的处理程序,并且无法在运行时使用上述 API 更改)。使用此方法可能在运行时导致链接冲突,且不提供运行时性能优势(即通常不应使用此方法)。
如果启用了 IRQ 但触发时未安装处理程序,将命中断点,且 IRQ 编号将存在于寄存器 r0 中。