您的问题与如何计算有关中断延迟Linux 的。至少您可能会对中断开始之前需要多长时间感兴趣。我们会忽略这个方面irqs
here.
一个简单的方法是切换GPIO
并使用示波器来测量中断。您甚至可以切换GPIO
多次查看不同阶段所花费的时间。这窗口CE链接显示了测量延迟的示例。某些中断控制器(例如 IMX)具有 I/O 复用模式,其中中断号将升高/降低特定 I/O 线。或者,您可以添加代码来切换线路(请参阅下面的例程)。
主要中断处理的来源位于入口臂v.S。为您使用的中断控制器定义了宏,这些宏取决于.config
文件。例如,有抢占式中断、多中断控制器、SMP等。primary向量定义在底部入口臂v.S。一般要点是检查当前的操作模式,然后__irq_usr
or __irq_svc
被采取。这些例程有不同的前置放大器来存储状态,但它们最终都会调用irq_handler
宏。这_irq_usr
有关于cmpxchg
,但是如果您在您的.config
,这将不适用。主要区别在于用户模式下发生 IRQ 后可能进行上下文切换。您的机器定义mach/entry-macro.S
它们是用于访问中断控制器并获取中断号的汇编器宏。然后跳转到通用irq
处理代码在顶层kernel目录。
所以第二种方法是检查代码并直接计算。如果您查看源代码,编译内核,然后执行以下操作,这可能会更容易objdump --disassemble
on the vmlinux图像并寻找这些符号。你会看到irq_handler
宏已扩展,它最终应该跳转到您的 IRQ 代码。
从源码中可以看出,还有TRACE_IRQFLAGS。您可以检查一下您正在使用的 Cortex A9 是否可用make menuconfig
(并输入/TRACE_IRQFLAGS
)。我不知道它是否可用。
有一些变化,例如,
- 来自用户/SVC 模式的中断。
- 当前正在运行的其他中断。
- 被中断的代码(例如 stm/ldm)可能需要一些时间才能完成。
- ISR 中的页面错误。至少在某些 Linux 版本中,某些 Alsa 驱动程序可能会因未分配的页面而出现故障。
- ISR 中的条件。
在示波器上测量将显示jitter in IRQ
服务。检查说明通常会表明IRQ
可能永远不会得到服务;例如,如果较高优先级的中断不断抢占/阻止IRQ
。也许您需要同时执行这两件事才能在严格的截止日期前进行全面优化。
通常你并不关心整个过程有多长IRQ
只需要之间的时间IRQ
线被提升并写入/读取一些外围寄存器。例如,一个FIFO
可能有有限的深度,如果 IRQ 发生和读取之间的延迟FIFO
寄存器大于FIFO_大小 x BPS,那么你有问题FIFO
溢出来。
The FIQ
基础结构要快得多,但您可以使用的内核设施却少得多!
Edit: The Cortex A9 技术参考附录 B 中有指令计数。大多数 ARM 指令在大多数架构上都是单周期,内存加载/存储、倍数和分支除外。按照上面的第 3 和第 4 段,找到为您的配置处理 Linux 中断的完整指令路径,然后加起来;为estimate(正如最初的问题所问)您可以只计算指令,因为它们通常是单个周期。