使用 RTEMS 操作系统的 cpu 时间短函数

Time Short Functions with cpu time using RTEMS operating system

我想分析实时操作系统中的一些代码,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() 和其他 rtem 函数获得的 8khz 计数器不会削减它。

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

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

在我们的嵌入式系统上,H/W团队很nice,拿出8个测试点给我们使用。我们将引脚初始化为零。在要分析的代码的开头,我们将 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 将 return 仍未达到处理器速度但比 8kHz 快得多的抽动,则所花费的时间可以计算为 tics * 0.04µs.

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

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

像这样的 RTEMS 相关问题在提交到 subscribe-only 用户邮件列表时总是会更快、更准确地得到回答。