我可以人为地减慢用于剖析目的的C trig函数吗?

时间:2013-09-26 19:57:25

标签: c optimization visual-studio-2012 profiling codewarrior

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

代码中有相当多的三角函数。我知道嵌入式芯片上的触发执行很慢。如何夸大我在PC上使用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 trig函数以使它们人为地变慢?

3 个答案:

答案 0 :(得分:3)

我不确定你的宏观想法是否能给你带来有用的结果,但是你可以用它来实现它:

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)
...

答案 1 :(得分:1)

定义一个新函数:

 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函数规范。

答案 2 :(得分:0)

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

(旁注:如果你坚持使用Windows,那么我个人觉得C开发最容易抓住Qt SDK for mingw,包含Qt Creator,然后将其用于普通C项目,这是支持的外的所述盒。)


或者,抓取C数学库的来源,例如来自this answer的数学库,编辑它们以包含延迟,并链接到它而不是标准数学库。使用gcc你不会使用-lm链接器开关,而是像任何其他lib一样链接自定义库。使用VC它可以很简单,但是默认情况下可以将math lib链接起来,在这种情况下,你需要找出如何禁用这个默认链接。

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


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