Linux内核需要多less条指令才能处理arm arm cortex A9上的中断?

我想估计一下ARM cortex A9单核处理IRQ所需的操作码数量。

假设我使用Linux内核3.4 ,需要多less操作码才能调用irq并执行irq_handler

Solutions Collecting From Web of "Linux内核需要多less条指令才能处理arm arm cortex A9上的中断?"

你的问题是关于如何计算Linux的中断延迟 。 至少你可能会感兴趣的是在你的中断开始之前需要多长时间。 这里我们会忽略这个irqs这个方面。

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

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

所以第二种方法是检查代码并直接计算。 如果你看源代码,编译你的内核,然后在vmlinux镜像上执行一个objdump --disassemble并寻找这些符号,这可能会更容易一些。 你会看到扩展的irq_handler宏,它应该最终跳转到你的IRQ代码。

从源代码可以看到,还有TRACE_IRQFLAGS 。 你可以通过make menuconfig (和/TRACE_IRQFLAGS )来检查你正在使用的Cortex A9是否可用。 我不知道它是否可用。

有变化,例如,

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

测量范围将显示IRQ服务中的抖动 。 检查说明通常会显示IRQ可能永远不会被服务; 例如,如果更高优先级的中断不断抢占/阻止IRQ 。 可能你需要同时做两个完全优化一个艰难的最后期限。

通常你不关心整个IRQ需要多长时间,而是IRQ线被提出和写/读一些外设寄存器之间的时间。 例如, FIFO深度可能有限,如果发生的IRQ和读取FIFO寄存器之间的等待时间大于FIFO_Size x BPS ,那么FIFO溢出就会出现问题。

FIQ基础架构要快得多,但是您可以使用的内核设备要少得多!

编辑: Cortex A9技术参考在附录B中有指令计数。大多数ARM指令在大多数架构上都是单周期,除了内存加载/存储,倍数和分支。 按照上面的第3段和第4段,找到完整的指令路径来处理你的配置的Linux中断, 并将其加起来 ; 对于一个估计 (正如原来的问题所要求的那样),你可以把这些指令算作一个单一的周期。

虽然您可以通过检查源代码来计算核心周期的理论最小数量,但由于缓存,内存和内存控制器性能的影响,实际采用的数量远没有那么确定,另一个核心在当时正在做什么,其他因素取决于所讨论的ARM处理器的微架构。

我怀疑用数字示波器或性能计数器测量系统的实际中断延迟性能会更好。

当然,对于硬实时应用,您需要知道最糟糕的中断延迟 – 其中包括所有这些因素中最糟糕的情况。