我想估计操作码的花费金额ARM
cortex A9
单核处理一个IRQ。
假设我与Linux内核工作3.4
,需要多少操作码调用irq
和执行irq_handler
?
我想估计操作码的花费金额ARM
cortex A9
单核处理一个IRQ。
假设我与Linux内核工作3.4
,需要多少操作码调用irq
和执行irq_handler
?
你的问题是有关如何计算中断延迟的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 --disassemble
的vmlinux的图像上并寻找这些符号。 您将看到irq_handler
宏观扩展,它应该跳到你的IRQ的代码最终会。
正如你可以从源头看,也有TRACE_IRQFLAGS
。 您可以检查,看看是否可以用在Cortex A9使用的是带make menuconfig
(并键入/TRACE_IRQFLAGS
)。 我不知道这是否是可用。
有变化,例如,
测量在示波器上会显示在抖动 IRQ
服务。 检查指令通常将显示该IRQ
可能永远不会被服务; 例如,如果更高优先级的中断经常抢先/防止IRQ
。 也许你需要做两件事为硬限期全面优化。
通常,你不关心整个多久IRQ
发生,但之间的时间IRQ
升起线和读/写一些外设寄存器。 例如, FIFO
可能深度有限,如果出现和读取的IRQ之间的等待时间FIFO
寄存器大于FIFO_SIZE X BPS,那么你有问题FIFO
溢出。
该FIQ
基础结构是快了很多,但你可以使用内核设施远不如!
编辑: 的Cortex A9技术参考具有指令计数附录B.大多数ARM指令是在大多数架构一个周期内,除了内存加载/存储,倍数和分支机构。 按照上述第3和第4段找到处理一个Linux中断对您的配置和只是将它加入了完整的指令路径; 为估计 (如原来的问题问)你可以算说明,它们一般都是单周期。
虽然你可以通过源代码的检查计算内核周期的理论最小数,实际发生的数量远不如某些由于缓存,内存和存储控制器的性能,作用是什么等核心是在时间和各种做其他因素依赖于所讨论的ARM处理器的微架构。
我怀疑你会关闭测量你的系统的实际中断延迟性能,无论是使用数字“范围或性能计数器更好。
当然,对于硬实时的应用程序,你需要知道最坏的情况下中断延迟-这包括所有的这些因素的最坏情况。