时间短函数与 CPU 时间使用 RTEMS 操作系统

Time Short Functions with cpu time using RTEMS operating system

本文关键字:RTEMS 操作系统 时间 函数 CPU 时间短      更新时间:2023-10-16

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

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

所以问题是:

如何从 RTEMS 获取实际的 CPU 时钟周期?

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

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


上下文

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

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

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

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

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

在我们的嵌入式系统上,硬件团队非常友善,可以拿出 8 个测试点供我们使用。 我们将引脚初始化为零。 在要分析的代码的开头,我们将 1 写入引脚。 在分析代码的末尾,我们将 0 写入引脚。 这会产生脉冲或方波。

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

因此,解决此问题的是使用以下函数:

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,因为它使用汇编程序例程。

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

像这样的RTEMS相关问题在提交给仅限订阅的用户邮件列表时总是得到更快,更准确的回答。