我想估计ARM
cortex A9
单个内核处理 IRQ 所需的操作码数量。
假设我使用 Linux 内核,调用和执行3.4
需要多少操作码?irq
irq_handler
我想估计ARM
cortex A9
单个内核处理 IRQ 所需的操作码数量。
假设我使用 Linux 内核,调用和执行3.4
需要多少操作码?irq
irq_handler
您的问题与如何计算Linux的中断延迟有关。至少您可能对中断开始之前需要多长时间感兴趣。我们将忽略这里的这方面irqs
。
一种简单的方法是切换 aGPIO
并使用示波器来测量中断。您甚至可以切换GPIO
多次以查看不同阶段所需的时间。此Window CE 链接显示了一个测量延迟的示例。一些中断控制器(例如 IMX)具有 I/O 多路复用模式,其中一个中断号将提高/降低特定的 I/O 线。或者,您可以添加代码来切换线路(请参阅下面的例程)。
主要中断处理的来源在entry-armv.S中。为您使用的中断控制器定义了宏,这些宏取决于.config
文件。例如,有抢占式中断、多中断控制器、SMP 等。主向量定义在entry-armv.S的底部。总的要点是检查当前的操作模式,然后采用__irq_usr
或__irq_svc
。这些例程具有不同的预置来存储状态,但它们最终都调用了irq_handler
宏。有关于的_irq_usr
东西cmpxchg
,但如果你在你的.config
,这将不适用。主要区别在于用户模式下发生 IRQ 后可能的上下文切换。您的机器定义了mach/entry-macro.S
哪些是汇编器宏来访问中断控制器并获取中断号。然后它跳转到顶级内核目录中的通用irq
处理代码。
所以第二种方法是检查代码并直接计算。如果您查看源代码、编译内核然后objdump --disassemble
在vmlinux映像上执行操作并查找这些符号,这可能会更容易。您将看到irq_handler
宏扩展,它最终应该跳转到您的 IRQ 代码。
从源码可以看出,还有TRACE_IRQFLAGS
. 您可以检查这在您使用的 Cortex A9 上是否可用make menuconfig
(并键入/TRACE_IRQFLAGS
)。我不知道它是否可用。
有一些变化,例如,
在示波器上进行测量将显示维修中的抖动。IRQ
检查说明通常会表明IRQ
可能永远不会得到服务;例如,如果更高优先级的中断不断抢占/阻止IRQ
. 可能您需要同时执行这两项操作才能完全优化硬期限。
通常,您并不关心整个IRQ
过程需要多长时间,而是在IRQ
提升线路和写入/读取某些外围寄存器之间的时间。例如,a 的FIFO
深度可能有限,如果 IRQ 发生和读取FIFO
寄存器之间的延迟大于FIFO_Size x BPS,那么您就会遇到FIFO
溢出问题。
基础结构要快得多,但您可以使用的FIQ
内核设施要少得多!
编辑: Cortex A9 技术参考在附录 B 中有指令计数。大多数 ARM 指令在大多数架构上都是一个周期,除了内存加载/存储、倍数和分支。按照上面的第 3 和第 4 段找到为您的配置处理 Linux 中断的完整指令路径,然后将其添加;对于估计(如原始问题所要求的那样),您可以只计算指令,因为它们通常是一个周期。
虽然您可以通过检查源代码来计算理论上的最小核心周期数,但由于缓存、内存和内存控制器性能、其他核心当时正在做什么以及各种因素的影响,实际采用的数量要不确定得多。其他因素取决于相关 ARM 处理器的微架构。
我怀疑您最好测量系统的实际中断延迟性能,无论是使用数字范围还是性能计数器。
当然,对于硬实时应用程序,您需要知道最坏情况下的中断延迟——包括所有这些因素的最坏情况。