【问题标题】:Time Short Functions with cpu time using RTEMS operating system使用 RTEMS 操作系统的 CPU 时间短函数
【发布时间】:2015-06-05 02:20:51
【问题描述】:

我希望在实时操作系统RTEMS 中分析一些代码。本质上,rtems 有一堆函数可以读取时间,其中最有用的是rtems_clock_get_ticks_since_boot

这里的问题是,无论出于何种原因,报告的时钟滴答都与我们的状态机循环速率同步,5kHz,而处理器运行在大约200MHz(嵌入式系统)。我知道这一点,因为我记录了时钟时间,等了 1 秒,只有 5000 个滴答声过去了。

所以问题是:

如何从 RTEMS 获取实际的 CPU 滴答数?

PS。 clock() 来自 GNU C(有同样的问题)

有一个我一直在研究here 的指南,但我得到了impossible constraint in asm,这表明我需要使用一些不同的汇编器关键字。也许有人可以指点我类似的东西?


上下文

我想分析一些代码,所以本质上是:

start = cpu_clock_ticks()
    //Some code
time = cpu_clock_ticks() - start;

代码运行时间少于 0.125 毫秒,因此 clock() 和其他 rtems 函数获得的 8khz 计数器不会削减它。

【问题讨论】:

  • 在您推荐分析软件之前,该应用程序对时间敏感并且不能与分析器一起使用:(
  • 您有备用的 GPIO 引脚吗?我们将示波器探头连接到 GPIO 引脚。将引脚初始化为无效。在函数开始时置位引脚,在函数结束时置低。在 o'scope 上测量脉冲宽度。
  • @ThomasMatthews 不会有任何我可以轻松访问的 GPIO。但也许我可以找到类似的解决方案。您应该将此添加为答案,包括更多细节,我会赞成。

标签: c++ profiling rtems


【解决方案1】:

如果有软件可以写入的 GPIO、测试点或引脚(并且示波器探头可以连接到),则可以使用示波器进行准确的性能测量。

这里的方法是向引脚发送一个脉冲。 o'scope 可以设置为触发脉冲。一些更智能的示波器可以对脉冲宽度进行统计,例如平均时间和最大时间。

在我们的嵌入式系统上,硬件团队非常好,提供了 8 个测试点供我们使用。我们将引脚初始化为零。在要分析的代码开始时,我们将 1 写入引脚。在分析代码结束时,我们将 0 写入引脚。这会产生脉冲或方波。

示波器设置为在上升沿触发。探针连接到引脚并运行程序。调整 o'scope,使整个脉冲在屏幕上可见。重新运行程序。当示波器触发时,测量脉冲宽度。这将是执行的实际时间。

【讨论】:

    【解决方案2】:

    所以解决这个问题的方法是使用以下函数:

    inline unsigned long timer_now()  {
        unsigned int time; 
    
        // The internal timer is accessed as special purpose register #268
        // (@24.576 MHz => 1tick=4.069010416E-8 sec,~.04µs 
        asm volatile ("mfspr %0,268; sync" : "=r" (time));
        return time;
    }
    

    timer_now 将返回仍然没有达到处理器速度但比 8kHz 快得多的抽动,然后可以将所用时间计算为 tics * 0.04µs

    注意 这可能只适用于 rtem 的 powerPC MPC5200 BSP,因为它使用汇编程序。

    【讨论】:

      【解决方案3】:

      在 RTEMS 4.11 或更高版本中,您可以使用rtems_counter_read 来获取抽象 CPU 特定汇编代码的高精度计数器。请看:https://docs.rtems.org/doxygen/cpukit/html/group__ClassicCounter.html

      当提交到subscribe-only 用户邮件列表时,此类与 RTEMS 相关的问题总是得到更快、更准确的回答。

      【讨论】:

      • 酷,不幸的是我们仍然使用 rtems 4.9.2。我还订阅了用户邮件列表,并在那里询问了任务。我只是喜欢把它们贴在这里,因为它们可能会吸引更多的注意力,并且会建立一个稍大的 rtems 问题数据库。
      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多