代码之家  ›  专栏  ›  技术社区  ›  Brannon

我可以人为地降低C触发器函数的速度以进行评测吗?

  •  1
  • Brannon  · 技术社区  · 11 年前

    我使用VS2012 Ultimate在C中进行一些嵌入式开发。我使用平台抽象编译代码,并在我的PC上进行模拟。公司中的另一个人使用带有PPC抽象层的CodeWarrior,并在MPC565芯片上运行它。嵌入式芯片上的任务偶尔会超出CPU或时间界限。

    代码中有相当多的三角函数。我知道嵌入式芯片上的trig执行速度很慢。我如何夸大在电脑上花在trig代码上的时间?我在想这样的事情:

    #define cos(x) ({ while(asiTimeMsec64() % 10 != 0); cos(x);})
    #define sin(x) ({ while(asiTimeMsec64() % 10 != 0); sin(x);})
    #define tan(x) ({ while(asiTimeMsec64() % 10 != 0); tan(x);})
    

    然而,该代码并不完全起作用。我收到关于我的 cos 未返回号码的呼叫。我想要某种旋转锁,它不允许其他线程运行。

    如何覆盖math.h触发器函数,使其人为变慢?

    3 回复  |  直到 11 年前
        1
  •  3
  •   Ingo Leonhardt    11 年前

    我不确定你的宏观想法是否会给你带来有用的结果,但这就是你可以让它发挥作用的方法:

    void slowup( )
    {
         while(asiTimeMsec64() % 10 != 0);
    }
    
    #define cos(x) (slowup(),cos(x))
    ...
    

    或者,使用函数指针:

    double slowup( double (*trig)( double ), double val )
    {
         while(asiTimeMsec64() % 10 != 0);
         return (*trig)( val );
    }
    
    #define cos(x) slowup(cos, x)
    ...
    
        2
  •  1
  •   Sebastien    11 年前

    定义一个新功能:

     double slowed_cos(double x)
     {
        SLOW_TRIG;
    
        return cos(x);
     }
    

    使用宏

     #define cos(Var) slowed_cos(Var)
     #define SLOW_TRIG while(asiTimeMSec64() % 10 !=0)
    

    冲洗并重复其他步骤。然而,您必须确保函数原型在默认函数与正确的include语句一起使用的任何地方都可用。

    此外,请验证参数的math.h函数规范。

        3
  •  0
  •   Community Dai    7 年前

    如果可以的话,切换到其他一些C编译器,基本上 gcc 来自mingw32。使用gcc,您可以使用这个巧妙的技巧将库函数替换为自己的代码,如中所述 this answer 。还要看看Visual C是否可以做类似的事情!

    (附带说明:如果你一直使用Windows,那么我个人认为,对于C开发来说,最简单的方法就是为mingw获取Qt SDK,包括Qt Creator,然后将其用于开箱即用的普通C项目。)


    或者,获取C数学库的来源,例如来自 this answer ,编辑它们以包括延迟,并根据延迟而不是标准数学库进行链接。有了gcc,你根本不会使用 -lm 链接器开关,而不是像任何其他库一样针对自定义库进行链接。使用VC,它可能很简单,但很可能默认情况下会链接数学库,在这种情况下,您需要了解如何禁用这种默认链接。

    此外,请确保禁用任何优化,这些优化可能会为数学库函数创建自定义内联代码!尽管仅仅在调试模式下编译就可能实现这一点。


    请注意,您的分析结果将非常粗略。您可能应该稍微校准一下,既要针对一般的C优化设置,也要测量需要添加到任何浮点指令的延迟量。但是,如果在真实设备上分析真实代码不是一种选择,而且这不仅适用于一个项目,而且在未来也会很有用,那么我可以看到为原生PC代码设置某种类似的环境会带来一些好处。