答案 0 :(得分:8)
中断请求(irq)延迟是中断请求从中断源传输到服务中断的时间。
由于不同来源通过不同的路径有不同的中断,显然它们的延迟取决于中断的类型。您可以找到关于特定中断的延迟(值和原因)的非常好的解释表on ARM site
您可以在ARM9E-S Core Technical Reference Manual中找到有关它的更多信息:
4.3最大中断延迟
如果采样信号在多周期指令启动的同时被置位 它的第二个或后一个执行周期,中断异常条目直到开始 说明已经完成。
最长的LDM指令是加载所有寄存器的指令,包括PC。
将第一个执行周期计为1,LDM需要16个周期。
•LDM要传输的最后一个字在周期17中传输,然后中止 在此周期中返回转移状态。
•如果发生数据中止,处理器会在第18周期检测到此情况并做好准备 第19周期中的数据中止例外条目。
•循环20和21是数据中止条目的获取和解码阶段 分别
•在周期22期间,处理器准备FIQ输入,发出提取和解码 循环周期23和24。
•因此,FIQ例程中的第一条指令进入的执行阶段 第25阶段的管道,给出24个周期的最坏情况延迟。
和
最短中断延迟
FIQ或IRQ的最小延迟是请求采样的最短时间 通过输入寄存器(一个周期),加上异常进入时间(三个周期)。首先 中断指令在中断后四个周期进入Execute管道阶段 断言
答案 1 :(得分:4)
中断延迟有三个部分:
通常,操作系统不会对1产生任何影响。 操作系统肯定会影响2.例如,操作系统有时会禁用中断[以避免中断干扰某些关键操作,例如修改与中断处理有关的事情,或者在安排新任务时,或者甚至在在中断处理程序中执行。某些操作系统可能会在几毫秒内禁用中断,其中良好的实时操作系统最多只能禁用超过微秒的中断。
当然,从中断处理程序运行的第一条指令开始,直到实际的驱动程序代码或类似程序运行所需的时间可以是相当多的指令,并且操作系统负责所有这些指令。
对于实时行为,通常情况下“最坏情况”很重要,在非实时操作系统中,整体执行时间要重要得多,因此如果不能为几百条指令启用中断,则更快它保存了几个“启用中断,然后禁用中断”的指令,Linux或Windows类型的OS可能会选择这样做。
答案 2 :(得分:3)
Mats和Nemanja在interrupt latency上提供了一些很好的信息。 是两个是我要添加的另一个问题,由Mats给出的三个。
如果单个内核正在处理中断,那么当多个中断同时发生时,通常会有一些分辨率优先级。但是,除非启用优先级中断处理,否则通常会在中断处理程序中禁用中断。因此,例如,发出慢速NAND闪存IRQ信号并运行,然后发生以太网中断,它可能会延迟,直到NAND闪存IRQ完成。当然,如果您有 priorty 中断并且您担心NAND闪存中断,那么如果以太网被优先考虑,情况实际上会更糟。
第二个问题是主线代码清除/设置中断标志。通常,这可以通过类似的方式完成,
mrs r9, cpsr
biceq r9, r9, #PSR_I_BIT
检查Linux源代码中的arch/arm/include/asm/irqflags.h以查找主线代码使用的许多宏。 typical sequence是这样的,
lock interrupts;
manipulate some flag in struct;
unlock interrupts;
如果struct
导致页面错误,则可能会引入非常大的中断延迟。中断将在页面错误处理程序的持续时间内被屏蔽。
Cortex-A9有很多lock free条指令可以通过never masking interrupts阻止这种情况发生。因为比swp/swpb
更好的汇编指令。第二个问题非常类似于 ldm / stm 类型指令导致的IRQ延迟(这些只是运行时间最长的指令)。
最后,很多技术讨论将假设零等待状态 RAM。可能需要填充缓存,如果您知道内存数据速率(可能是2-4个机器周期),那么最坏情况的代码路径会乘以此。
是否有SMP中断处理,优先级中断和无锁主线取决于您的内核配置和版本;这些是操作系统的问题。其他问题是CPU / SOC中断控制器和interrupt code itself。
所固有的