操作系统导致的irq延迟是多少?

0x9*_*x90 5 c linux arm irq linux-kernel

  • 如何估计ARM处理器的irq延迟?
  • irq延迟的定义是什么?

Nem*_*ric 8

  1. 中断请求(irq)延迟是中断请求从中断源传输到服务中断点所需的时间.

  2. 由于来自不同源的不同中断通过不同的路径,显然它们的延迟取决于中断的类型.您可以找到关于ARM站点上特定中断的延迟(值和原因)的非常好的解释的表

您可以在ARM9E-S核心技术参考手册中找到有关它的更多信息:

4.3最大中断延迟

如果在多周期指令开始其第二个或更后的执行周期的同时断言采样信号,则在指令完成之前不会启动中断异常条目.

最长的LDM指令是加载所有寄存器的指令,包括PC.

将第一个执行周期计为1,LDM需要16个周期.

•LDM要传输的最后一个字在周期17中传输,并在此周期中返回传输的中止状态.

•如果发生数据中止,处理器将在周期18中检测到此情况,并准备第19周期中的数据中止例外条目.

•循环20和21分别是数据中止条目的获取和解码阶段.

•在周期22期间,处理器准备FIQ输入,在周期23和24中发出读取和解码周期.

•因此,FIQ例程中的第一条指令进入阶段25的流水线的执行阶段,给出24个周期的最坏情况延迟.

和

最小中断延迟

FIQ或IRQ的最小延迟是输入寄存器(一个周期)对请求进行采样的最短时间,加上异常进入时间(三个周期).中断发出后,第一个中断指令进入Execute流水线阶段四个周期


art*_*ise 4

Mats 和 Nemanja 提供了一些有关中断延迟的有用信息。除了Mats 给出的三个问题之外,我还想补充两个问题。

  1. 其他同时/接近同时的中断。
  2. 由于屏蔽中断而增加了操作系统延迟。编辑:这是在 Mats 的回答中,只是没有解释太多。

如果单个核心正在处理中断,那么当多个中断同时发生时,通常会有一些解决优先级。然而,除非启用优先中断处理,否则中断处理程序通常会禁用中断。例如,一个慢速 NAND 闪存 IRQ 发出信号并运行,然后发生以太网中断,它可能会被延迟,直到 NAND 闪存 IRQ 完成。当然,如果您有优先中断并且您担心 NAND 闪存中断,那么如果以太网优先的话,情况实际上可能会更糟。

第二个问题是主线代码何时清除/设置中断标志。通常这是通过类似的事情来完成的,

mrs   r9, cpsr
biceq r9, r9, #PSR_I_BIT
Run Code Online (Sandbox Code Playgroud)

检查Linux 源代码中的arch/arm/include/asm/irqflags.h以了解主线代码使用的许多宏。典型的序列是这样的,

lock interrupts;
manipulate some flag in struct;
unlock interrupts;
Run Code Online (Sandbox Code Playgroud)

如果struct导致页面错误,则可能会引入非常大的中断延迟。在页面错误处理程序期间,中断将被屏蔽。

Cortex-A9 有许多无锁指令,可以通过从不屏蔽中断来防止这种情况;因为比 . 更好的汇编指令swp/swpb。第二个问题很像ldm/stm类型指令导致的 IRQ 延迟(这些只是运行的最长指令)。

最后,许多技术讨论将假设零等待状态RAM。很可能需要填充缓存,并且如果您知道内存数据速率(可能是 2-4 个机器周期),那么最坏情况的代码路径将乘以该值。

是否有SMP中断处理、优先级中断和无锁主线取决于您的内核配置和版本;这些是操作系统的问题。其他问题是 CPU/SOC 中断控制器和中断代码本身固有的。