首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux内核需要多少指令才能处理arm皮质A9上的中断?

Linux内核需要多少指令才能处理arm皮质A9上的中断?
EN

Stack Overflow用户
提问于 2013-02-03 16:05:43
回答 2查看 1.3K关注 0票数 4

我想估计操作码的数量,它需要一个ARM cortex A9单核来处理IRQ。

假设我使用的是Linux内核3.4,那么调用irq和执行irq_handler需要多少操作码?

EN

回答 2

Stack Overflow用户

发布于 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)。我不知道它是否可用。

有一些变化,例如,

  1. 从用户/SVC模式中断。
  2. 其他中断正在运行。
  3. 被中断的代码(如stm/ldm)可能需要一段时间才能完成。
  4. ISR中的页面错误。至少在某些Linux版本中,一些Alsa驱动程序可能会出现未分配页面的错误。
  5. 条件词在你的ISR里。

在一个范围上测量将显示抖动IRQ服务。检查说明通常会显示IRQ可能永远得不到服务;例如,如果优先级较高的中断不断抢占/阻止IRQ。也许你需要做这两方面的充分优化,为一个艰难的最后期限。

通常,您并不关心整个IRQ需要多长时间,而是从IRQ行到写/读一些外围寄存器之间的时间。例如,FIFO可能具有有限的深度,如果IRQ发生与读取FIFO寄存器之间的延迟大于FIFO_Size x BPS,那么就会出现FIFO溢出问题。

FIQ的底层结构要快得多,但是您可以使用的内核功能却要少得多!

编辑: 皮质A9技术参考在附录B中有指令计数。除了内存加载/存储、倍数和分支之外,大多数ARM指令在大多数体系结构上都是一个周期。按照上面的第3和第4段找到完整的指令路径来处理用于您的配置的Linux中断,只需要将其添加到;对于一个估计(正如最初的问题所问的),您可以只计算指令,因为它们通常是一个周期。

票数 7
EN

Stack Overflow用户

发布于 2013-02-03 19:38:54

虽然您可以通过检查源代码来计算核心周期的理论最小数,但是由于缓存、内存和内存控制器性能的影响,以及其他内核当时正在做什么以及其他各种因素取决于所讨论的ARM处理器的微体系结构,实际占用的数量就不那么确定了。

我怀疑您最好使用数字范围或性能计数器来测量系统的实际中断延迟性能。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14674392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档