代码之家  ›  专栏  ›  技术社区  ›  Fantastic Mr Fox

使用RTEMS操作系统的cpu时间短功能

  •  0
  • Fantastic Mr Fox  · 技术社区  · 10 年前

    我想在实时操作系统中评测一些代码, RTEMS 。本质上,rtems有一系列函数来读取时间,其中最有用的是 rtems_clock_get_ticks_since_boot .

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

    所以问题是:

    如何从RTEMS中获取实际的CPU节拍?

    附言 clock() 来自GNUC(有同样的问题)

    我一直在研究一个指南 here ,但我明白 impossible constraint in asm 这表明我需要使用一些不同的汇编关键字。也许有人能告诉我类似的事情?


    上下文

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

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

    代码运行时间小于0.125ms,因此8khz计数器 时钟() 而其他rtems函数得到的,不会削减它。

    3 回复  |  直到 10 年前
        1
  •  1
  •   Thomas Matthews    10 年前

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

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

    在我们的嵌入式系统上,H/W团队非常出色,为我们提供了8个测试点。我们将pin初始化为零。在要配置文件的代码的开头,我们向引脚写入1。在分析代码的末尾,我们向pin写入一个0。这会产生脉冲或方波。

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

        2
  •  0
  •   Fantastic Mr Fox    9 年前

    因此,解决方法是使用以下函数:

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

        3
  •  0
  •   gedare    9 年前

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

    像这样的RTEMS相关问题在提交给 subscribe-only 用户邮件列表。

    推荐文章