时间短使用RTEMS操作系统的cpu时间功能

时间:2015-03-17 00:29:02

标签: c++ profiling rtems

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

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

所以问题是:

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

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

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


上下文

我想描述一些代码,基本上是:

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

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

3 个答案:

答案 0 :(得分:1)

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

此处的方法是向引脚发送脉冲。 oscope可以设置为触发脉冲。一些更智能的显微镜可以对脉冲宽度进行统计,例如平均时间和最大时间。

在我们的嵌入式系统上,H / W团队足够好,可以为我们提供8个测试点供我们使用。我们将引脚初始化为零。在要分析的代码的开头,我们向引脚写入1。在分析代码的末尾,我们向引脚写入0。这产生脉冲或方波。

oscope设置为在上升沿触发。探头连接到引脚并运行程序。调整ocope,以便在屏幕上看到整个脉冲。重新运行该程序。当ocope触发时,测量脉冲的宽度。这将是执行的实际时间。

答案 1 :(得分:0)

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

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

注意这可能仅适用于powerPC MPC5200 BSP for rtems,因为它使用汇编程序。

答案 2 :(得分:0)

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

当提交给subscribe-only用户邮件列表时,这样的RTEMS相关问题总是能够更快更准确地得到解答。