Linux内核需要多少指令来处理手臂皮层A9上的中断?

0x9*_*x90 4 linux arm irq linux-device-driver linux-kernel

我想估计一个ARM cortex A9核心处理IRQ 所需的操作码数量.

假设我使用Linux内核3.4,调用irq和执行它需要多少操作码irq_handler

art*_*ise 7

您的问题与如何计算Linux 的中断延迟有关.至少你可能对中断开始前需要多长时间感兴趣.我们将忽略irqs这里的这一方面.

一种简单的方法是切换a GPIO并使用范围来测量中断.您甚至可以GPIO多次切换以查看不同阶段所需的时间.此窗口CE链接显示了测量延迟的示例.某些中断控制器(例如IMX)具有I/O复用模式,其中中断号将升高/降低特定I/O线.或者,您可以添加代码来切换该行(请参阅下面的例程).

主要中断处理的源代码在entry-armv.S中.为您使用的中断控制器定义了宏,这些宏取决于.config文件.例如,有先占中断,多中断控制器,SMP等.主要向量在入口armv.S的底部定义.一般要点是检查当前的操作模式,然后检查__irq_usr__irq_svc采取.这些例程具有不同的存储状态,但最终都会调用irq_handler宏.有关的_irq_usr东西cmpxchg,但如果你指定和你的ARM皮质.config,这将不适用.主要区别在于IRQ在用户模式下发生后可能的上下文切换.您的机器定义了mach/entry-macro.S哪些汇编程序宏可以访问中断控制器并获取中断号.然后它跳转到顶级内核目录中的泛型irq 处理代码.

所以第二种方法是检查代码并直接计算.如果您查看源代码,编译内核然后objdump --disassemblevmlinux映像上执行操作并查找这些符号,这可能会更容易.您将看到irq_handler扩展的宏,它应该最终跳转到您的IRQ代码.

从源头上可以看出,也有TRACE_IRQFLAGS.您可以检查您使用的Cortex A9上是否可以使用make menuconfig(并键入/TRACE_IRQFLAGS).我不知道它是否可用.

有变化,如,

  1. 用户/ SVC模式中断.
  2. 其他正在运行的中断.
  3. 被中断的代码(例如stm/ldm)可能需要一些时间才能完成.
  4. ISR中的页面错误.某些Alsa驱动程序可能会在至少某些Linux版本中使用未分配的页面出错.
  5. 您的ISR中的条件.

测量在示波器上会显示出抖动IRQ服务.检查说明通常表明IRQ可能永远不会得到服务; 例如,如果更高优先级的中断不断预先/阻止IRQ.可能你需要同时做两个方面来完全优化硬截止日期.

通常你不关心整个IRQ过程需要多长时间,而是IRQ提升行和写入/读取某些外设寄存器之间的时间.例如,a FIFO可能具有有限的深度,如果IRQ发生和读取FIFO寄存器之间的延迟大于FIFO_Size x BPS,那么您就会遇到FIFO溢出问题.

FIQ基础结构是快了很多,但你可以使用内核设施远不如!

编辑:皮质A9技术参考具有指令计数附录B.大多数ARM指令是在大多数架构一个周期内,除了内存加载/存储,倍数和分支机构.按照上面的第3和第4段找到处理配置的Linux中断的完整指令路径,然后将其添加起来 ; 对于估计(如原始问题所示),您可以只计算指令,因为它们通常是一个循环.


mar*_*rko 6

虽然您可以通过检查源代码来计算理论最小核心周期数,但由于缓存,内存和内存控制器性能的影响,实际采用的数量远不那么确定,其他核心在当时正在做什么以及各种其他因素依赖于ARM处理器的微架构.

我怀疑你最好不要使用数字'范围或性能计数器来衡量系统的实际中断延迟性能.

当然,对于硬实时应用程序,您需要知道最坏情况下的中断延迟 - 其中包括所有这些因素的最坏情况.