-->

多少也说明Linux内核,以处理上的ARM Cortex A9中断需要什么?(How many in

2019-07-19 05:04发布

我想估计操作码的花费金额ARM cortex A9单核处理一个IRQ。

假设我与Linux内核工作3.4 ,需要多少操作码调用irq和执行irq_handler

Answer 1:

你的问题是有关如何计算中断延迟的Linux。 至少你可能会感兴趣的需要多长时间你的中断甚至开始之前。 我们会忽略这方面irqs这里。

一个简单的方法是将切换一个GPIO和使用范围来衡量中断。 你甚至可以切换GPIO多次时候看到的不同阶段采取。 此窗口CE链路示出了示例测量等待时间。 一些中断控制器(如IMX)具有I / O复用模式,其中的中断数目将升高/降低特定的I / O线。 或者,您可以添加代码来切换线(见下面的程序)。

用于主中断处理来源是入门armv.S 。 有您所使用的中断控制器定义的宏和这些取决于.config文件。 例如,有先发制人中断,多中断控制器,SMP等的主要载体在入门armv.S的底部限定。 一般要点是,当前的操作模式被检查,然后或者__irq_usr__irq_svc取。 这些程序有不同的预充足的存储状态,但他们都最终调用了irq_handler宏。 该_irq_usr大约有东西cmpxchg ,但如果指定,并在您的ARM Cortex .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。 有些ALSA驱动可以至少在一些Linux版本分配页故障。
  5. 条件语句在你的ISR。

测量在示波器上会显示在抖动 IRQ服务。 检查指令通常将显示该IRQ可能永远不会被服务; 例如,如果更高优先级的中断经常抢先/防止IRQ 。 也许你需要做两件事为硬限期全面优化。

通常,你不关心整个多久IRQ发生,但之间的时间IRQ升起线和读/写一些外设寄存器。 例如, FIFO可能深度有限,如果出现和读取的IRQ之间的等待时间FIFO寄存器大于FIFO_SIZE X BPS,那么你有问题FIFO溢出。

FIQ基础结构是快了很多,但你可以使用内核设施远不如!

编辑: 的Cortex A9技术参考具有指令计数附录B.大多数ARM指令是在大多数架构一个周期内,除了内存加载/存储,倍数和分支机构。 按照上述第3和第4段找到处理一个Linux中断对您的配置和只是将它加入了完整的指令路径; 为估计 (如原来的问题问)你可以算说明,它们一般都是单周期。



Answer 2:

虽然你可以通过源代码的检查计算内核周期的理论最小数,实际发生的数量远不如某些由于缓存,内存和存储控制器的性能,作用是什么等核心是在时间和各种做其他因素依赖于所讨论的ARM处理器的微架构。

我怀疑你会关闭测量你的系统的实际中断延迟性能,无论是使用数字“范围或性能计数器更好。

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



文章来源: How many instructions does Linux kernel need in order to handle an interrupt on an arm cortex A9?