我想估计操作码的数量,它需要一个ARM
cortex A9
单核来处理IRQ。
假设我使用的是Linux内核3.4
,那么调用irq
和执行irq_handler
需要多少操作码?
发布于 2013-02-03 18:41:32
您的问题与如何计算Linux的中断延迟有关。至少你可能对中断需要多长时间才能开始感兴趣。我们将在这里忽略irqs
的这一方面。
一个简单的方法是切换一个GPIO
并使用一个作用域来测量中断。您甚至可以多次切换GPIO
以查看不同阶段的时间。这个窗口CE链接展示了一个测量延迟的例子。一些中断控制器(如IMX)具有I/O多路复用模式,其中一个中断号将提高/降低一条特定的I/O线。或者,您可以添加代码来切换行(请参阅下面的例程)。
主中断处理的源在entry-armv.S中。有为您使用的中断控制器定义的宏,这些宏依赖于.config
文件。例如,存在先发制人中断、多中断控制器、SMP等,主向量定义在entry-armv.S的底部。一般的原则是对当前的工作模式进行检查,然后采用__irq_usr
或__irq_svc
。这些例程有不同的预示例来存储状态,但它们最终都调用了irq_handler
宏。_irq_usr
有关于cmpxchg
的东西,但是如果你在.config
中指定和手臂皮层,这就不适用了。主要的区别将是在用户模式下IRQ发生后可能发生的上下文切换。您的机器定义了mach/entry-macro.S
,它们是汇编程序宏,用于访问中断控制器并获取中断号。然后跳转到顶层内核目录中的通用irq
处理代码。
所以第二种方法是检查代码并直接计算。如果您查看源代码,编译内核,然后在vmlinux映像上执行一个并查找这些符号,这可能会更容易。您将看到irq_handler
宏展开,它最终应该跳转到您的IRQ代码。
正如您从源代码中看到的那样,也有TRACE_IRQFLAGS
。您可以检查是否在与A9一起使用的Cortex A9上可用(并键入/TRACE_IRQFLAGS
)。我不知道它是否可用。
有一些变化,例如,
在一个范围上测量将显示抖动在IRQ
服务。检查说明通常会显示IRQ
可能永远得不到服务;例如,如果优先级较高的中断不断抢占/阻止IRQ
。也许你需要做这两方面的充分优化,为一个艰难的最后期限。
通常,您并不关心整个IRQ
需要多长时间,而是从IRQ
行到写/读一些外围寄存器之间的时间。例如,FIFO
可能具有有限的深度,如果IRQ发生与读取FIFO
寄存器之间的延迟大于FIFO_Size x BPS,那么就会出现FIFO
溢出问题。
FIQ
的底层结构要快得多,但是您可以使用的内核功能却要少得多!
编辑: 皮质A9技术参考在附录B中有指令计数。除了内存加载/存储、倍数和分支之外,大多数ARM指令在大多数体系结构上都是一个周期。按照上面的第3和第4段找到完整的指令路径来处理用于您的配置的Linux中断,只需要将其添加到;对于一个估计(正如最初的问题所问的),您可以只计算指令,因为它们通常是一个周期。
发布于 2013-02-03 19:38:54
虽然您可以通过检查源代码来计算核心周期的理论最小数,但是由于缓存、内存和内存控制器性能的影响,以及其他内核当时正在做什么以及其他各种因素取决于所讨论的ARM处理器的微体系结构,实际占用的数量就不那么确定了。
我怀疑您最好使用数字范围或性能计数器来测量系统的实际中断延迟性能。
当然,对于硬实时应用程序,您需要知道最坏的中断延迟--包括所有这些因素中最坏的情况。
https://stackoverflow.com/questions/14674392
复制相似问题