0

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

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

所以问题是:

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

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

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


语境

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

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

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

4

3 回答 3

1

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

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

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

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

于 2015-03-17T00:51:52.503 回答
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.

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

于 2015-03-31T20:08:47.147 回答
0

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

此类与 RTEMS 相关的问题在提交到仅订阅用户邮件列表时总是能得到更快、更准确的回答。

于 2015-06-04T18:20:51.637 回答