【问题标题】:How many instructions does Linux kernel need in order to handle an interrupt on an arm cortex A9?为了处理 arm cortex A9 上的中断,Linux 内核需要多少条指令?
【发布时间】:2013-02-03 16:05:43
【问题描述】:

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

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

【问题讨论】:

  • 为什么是操作码?你是指指令周期还是时钟周期?
  • 你为什么要问?允许的中断频率或延迟(从中断硬件脉冲到内核中的处理程序或应用程序中的信号处理程序的启动)不是更相关吗?
  • @BillPringlemeir stackoverflow.com/questions/14698229/…请填写免费添加主题到问题并回答它
  • @TurboJ你能指定操作码和指令的区别吗?
  • @0x90 “操作码”,操作码,只是对特定操作进行编码的二进制代码,以便 CPU 知道要执行哪个操作。例如,指令是操作码 + 编码参数的其他位。

标签: linux linux-kernel arm linux-device-driver irq


【解决方案1】:

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

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

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

所以第二种方法是检查代码并直接计算。如果您查看源代码,编译内核,然后在 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 technical reference 在附录 B 中有指令计数。除内存加载/存储、倍数和分支外,大多数 ARM 指令在大多数架构上都是单周期的。按照上面的第 3 和第 4 段,找到为您的配置处理 Linux 中断的完整指令路径,然后将其添加;对于 estimate (如原始问题所问),您可以只计算指令,因为它们通常是一个周期。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 您能否更详细地解释一下,如何从源代码理论上测量最坏的情况?谢谢
    • 如果没有对整个 CPU 和内存子系统(例如 Verilog 或 VHDL 设计)的准确寄存器级仿真以及在其上运行的工作负载,我看不到任何方法这样您就可以对设备中各种缓存的效果进行建模。同样,我认为您必须对其进行衡量并做出一些假设。
    • 你肯定可以大致绑定它。如果您可以限制行星中的粒子数量,我认为您可以限制 ARM cpu 在最坏情况下的工作方式
    • 绝对 - 不同之处在于这里有一个奇怪的缓存未命中,而那里有一些内存延迟。我怀疑我们正在查看十分之一微秒。 Linux 内核本身负责方式更多的延迟。根据您的系统的参考手册和原理图估计这些影响是一项艰巨的工作。
    • 最坏的情况是所有缓存未命中,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多