4

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

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

4

2 回答 2

7

您的问题与如何计算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 --disassemblevmlinux映像上执行操作并查找这些符号,这可能会更容易。您将看到irq_handler宏扩展,它最终应该跳转到您的 IRQ 代码。

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

有一些变化,例如,

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

在示波器上进行测量将显示维修中的抖动。IRQ检查说明通常会表明IRQ可能永远不会得到服务;例如,如果更高优先级的中断不断抢占/阻止IRQ. 可能您需要同时执行这两项操作才能完全优化硬期限。

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

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

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

于 2013-02-03T18:41:32.660 回答
6

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

我怀疑您最好测量系统的实际中断延迟性能,无论是使用数字范围还是性能计数器。

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

于 2013-02-03T19:38:54.103 回答