【问题标题】:Count the clock periods of code block in Embedded C计算Embedded C中代码块的时钟周期
【发布时间】:2012-02-19 09:52:38
【问题描述】:

我正在 Keil Board 中编程,并试图计算 C 函数内的代码块执行所需的时钟周期数。

有没有办法在代码块之前和之后获得精确到微秒的时间,以便我可以得到差异并将其除以每微秒的时钟周期数来计算块消耗的时钟周期?

time.h 中的 clock() 函数以秒为单位给出时间,这将使 diff 为 0,因为它是一个小代码块,我正在尝试获取时钟周期。

如果这不是解决此问题的好方法,是否有替代方法?

【问题讨论】:

  • 您是否尝试过使用各种时钟选项的clock_gettime()? CLOCK_MONOTONIC_RAW 或 CLOCK_PROCESS_CPUTIME_ID。但是为了准确起见,您需要在内核中启用高分辨率计时器(在常规发行版中,默认情况下已启用它,但它们并未完全嵌入)
  • clock_gettime() 仅在 linux 中可用。 Keil MicroVision IDE 附带的库 (time.h) 中没有它...
  • @EdwardH:rutxkl 未能准确说明他使用的是什么板/芯片,但大多数 Keil 板是低端 ARM 微控制器,不太可能运行 Linux,或者实际上除了一个简单的实时内核。我想你可能假设太多了!
  • @Clifford:确实有,帖子上的 Embedded-linux 标签让我很困惑。
  • @Edward:我没注意到!您的假设可能是有效的,但 rutxkl 响应表明它被错误标记。删除它。

标签: c++ c assembly embedded


【解决方案1】:

阅读芯片中的定时器,找到一个你正在使用的操作系统/环境没有消耗并直接使用它。这需要一些练习,您需要使用 volatiles 来不让编译器重新排列您的代码或不重新读取计时器。并且您需要调整计时器上的预分频器,使其获得最实用的分辨率而不会翻转。所以从一个大的预分频除数开始,说服自己它不会翻转,然后使这个预分频除数更短,直到你达到一个除数或达到所需的精度。如果除以一还不够,那么您必须在一个循环中多次调用该函数并在该循环周围调用该函数。请记住,每当您更改代码以添加这些测量值时,您都可以并且将会改变代码的性能,有时小到无法注意到,有时 10% - 20% 或更多。如果您使用的是缓存,那么您添加或删除的任何代码行都可能以两位数的百分比改变性能,您必须了解更多关于此时代码计时的信息。

【讨论】:

    【解决方案2】:

    在嵌入式世界中计算时钟周期数的最佳方法是使用示波器。在代码块之前和之后切换一个 GPIO 引脚,并用示波器测量时间。测量的时间乘以 CPU 频率就是所用的 CPU 时钟周期数。

    【讨论】:

    • ..有没有办法在不使用任何外部设备的情况下做到这一点,只需使用电路板..
    • @rutxkl 您可以使用 CPU 工具。例如在 x86 上,rdtsc 指令产生时钟周期,因此只需计算代码前后的差异。在 ARM 上,您可以通过使用 ARM 协处理器 15 并读取时钟计数器来执行类似的操作。
    【解决方案3】:

    您没有说明板上是什么处理器(比板子的品牌重要得多!),如果处理器包含 ETM,并且您有 ULINK-Pro 或其他具有跟踪能力的调试器,那么 uVision 可以非侵入式地分析直接在指令周期级别执行代码。

    同样,如果您在 uVision 模拟器而不是真实硬件中运行代码,您可以获得周期精确的分析和计时,而无需硬件跟踪支持。

    即使没有跟踪功能,uVision 的“秒表”功能也可以直接在两个断点之间执行计时。秒表位于 IDE 底部的状态栏中。您确实需要在调试器跟踪配置中设置时钟频率,以便从秒表中获得“实时”。

    一种不需要特殊调试或模拟器功能的简单方法是使用可用的定时器外设(或者在 Cortex-M 设备的情况下使用 sysclk)来为代码段执行的开始和结束添加时间戳,或者如果您没有可用的时序资源,您可以切换 GPIO 引脚并在示波器上对其进行监控。这些方法具有一定程度的软件开销,而硬件或模拟器跟踪中不存在这些开销,这可能使它们不适合非常短的代码段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多