我希望估计一个ARM cortex A9单核处理器处理IRQ所需的操作码数量。
假设我使用Linux内核3.4,调用irq并执行irq_handler需要多少操作码?
假设我使用Linux内核3.4,调用irq并执行irq_handler需要多少操作码?
GPIO
并使用示波器测量中断。您甚至可以多次切换GPIO
,以查看不同阶段所需的时间。此Window CE链接显示了测量延迟的示例。某些中断控制器(例如IMX)具有I/O多路复用模式,其中中断号将提高/降低特定的I/O线。或者,您可以添加代码以切换该行(有关例程,请参见下文)。.config
文件。例如,有抢占中断、多中断控制器、SMP等。 主要向量在entry-armv.S底部定义。一般来说,当前操作模式会被检查,然后选择__irq_usr
或__irq_svc
。这些例程有不同的前导内容用于存储状态,但它们最终都会调用irq_handler
宏。_irq_usr有关于cmpxchg
的内容,但如果您在.config
中指定了ARM cortex,则不适用。主要区别将是在用户模式下发生IRQ后可能进行的上下文切换。您的机器定义了mach/entry-macro.S
,这是用于访问中断控制器并获取中断号的汇编宏。然后跳转到顶级内核目录中的通用irq
handling code。objdump --disassemble
,并查找这些符号,这可能更容易,并且查看irq_handler
宏扩展,最终应该跳转到您的IRQ代码。TRACE_IRQFLAGS
。您可以使用make menuconfig
(并键入/TRACE_IRQFLAGS
)检查您正在使用的Cortex A9是否可用。我不知道它是否可用。使用示波器测量将显示IRQ
服务中的抖动。检查指令通常会显示IRQ
可能永远不会得到服务;例如,如果更高优先级的中断不断地抢占/防止IRQ
。可能您需要同时执行这两个操作以完全针对硬截止日期进行优化。
通常,您不关心整个IRQ
需要多长时间,而是关心IRQ
线被引发和写入/读取某些外围寄存器之间的时间。例如,一个FIFO
可能具有有限的深度,如果发生IRQ并且读取FIFO
寄存器之间的延迟大于FIFO_Size x BPS,则FIFO
就会溢出。
FIQ
基础设施速度更快,但可用的内核设施要少得多!
编辑:Cortex A9 技术参考手册在附录B中列出了指令计数。在大多数体系结构上,大多数ARM指令只需一个周期,除了内存读/写、乘法和分支指令。按照上面第3和第4段的步骤找到处理Linux中断的完整指令路径,并将它们相加;对于一个估计值(因为原问题要求),您可以直接计算指令数,因为它们通常只需要一个周期。
虽然您可以通过检查源代码计算核心周期的理论最小值,但由于缓存、内存和内存控制器性能、另一个核心正在执行的任务以及取决于ARM处理器的微体系结构等各种因素的影响,实际的核心周期数量则不确定得多。
我怀疑您最好使用数字“范围表”或性能计数器来测量系统的实际中断延迟性能。
当然,对于硬实时应用程序,您需要知道最坏情况下的中断延迟-这包括所有这些因素的最坏情况。