使用 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 用户邮件列表时总是会更快、更准确地得到回答。
我想分析实时操作系统中的一些代码,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 用户邮件列表时总是会更快、更准确地得到回答。