我想估计一个ARM
cortex A9
单核处理IRQ所需的操作码数量。
假设我使用Linux内核3.4
,那么调用irq
和执行irq_handler
需要多少操作码?
您的问题与如何计算Linux的中断延迟有关。至少你可能会对你的中断需要多长时间感兴趣。这里我们将忽略irqs
的这一方面。
一个简单的方法是切换GPIO
并使用范围来测量中断。您甚至可以多次切换GPIO
,以查看不同阶段所花费的时间。此Window CE链接显示了一个测量延迟的示例。一些中断控制器(如IMX(具有I/O多路复用模式,其中中断号将升高/降低特定的I/O线。或者,您可以添加代码来切换行(请参阅下面的例程(。
主要中断处理的来源在条目armv.S中。有为您使用的中断控制器定义的宏,这些宏取决于.config
文件。例如,有先发制人的中断、多中断控制器、SMP等。主向量定义在条目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上是否有此功能。我不知道它是否可用。
存在诸如之类的变体
- 来自用户/SVC模式的中断
- 当前正在运行的其他中断
- 被中断的代码(如stm/ldm(可能需要一些时间才能完成
- ISR中的页面错误。至少在某些Linux版本中,一些Alsa驱动程序可能会对未分配的页面出错
- ISR中的条件
在示波器上测量将显示IRQ
服务中的抖动。检查指令通常将表明CCD_ 24可能永远不会得到服务;例如,如果较高优先级的中断不断地抢占/阻止CCD_ 25。也许你需要同时做这两件事来为一个艰难的最后期限进行充分优化。
通常,您不关心整个IRQ
需要多长时间,而是关心IRQ
行被提升到写入/读取某个外围寄存器之间的时间。例如,FIFO
的深度可能有限,如果发生IRQ和读取FIFO
寄存器之间的延迟大于FIFO_Size x BPS,则FIFO
溢出有问题。
FIQ
的基础结构要快得多,但您可以使用的内核设施要少得多!
编辑:Cortex A9技术参考在附录B中有指令计数。除内存加载/存储、倍数和分支外,大多数ARM指令在大多数架构上都是单周期的。按照上面的第3和第4段找到完整的指令路径来处理您配置的Linux中断,然后将其相加;对于估计(正如原始问题所问(,您可以只计算指令,因为它们通常是一个循环。
虽然您可以通过检查源代码来计算内核循环的理论最小数量,但由于缓存、内存和内存控制器性能、其他内核当时在做什么以及取决于所讨论的ARM处理器的微架构的各种其他因素的影响,实际占用的数量远不确定。
我怀疑您最好使用数字示波器或性能计数器来测量系统的实际中断延迟性能。
当然,对于硬实时应用程序,您需要了解最坏情况中断延迟,其中包括所有因素的最坏情况。