我希望在实时操作系统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计数器不会削减它。
答案 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相关问题总是能够更快更准确地得到解答。