1

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

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

#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 三角函数以使它们人为地变慢?

4

3 回答 3

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)
...
于 2013-10-09T17:14:31.977 回答
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 函数规范。

于 2013-10-09T17:37:55.167 回答
0

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

(附注:如果您坚持使用 Windows,那么我个人认为 C 开发最简单的方法是获取 mingw 的 Qt SDK,其中包含 Qt Creator,然后将其用于纯 C 项目,这是完全支持的-盒子。)


或者,获取 C 数学库的来源,例如来自这个答案的那些,编辑它们以包含延迟,并链接到它而不是标准数学库。使用 gcc,您将根本不使用-lm链接器开关,而是像任何其他库一样链接到自定义库。使用 VC 可能很简单,但默认情况下可能会链接数学库,在这种情况下,您需要了解如何禁用此默认链接。

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


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

于 2013-10-13T06:30:52.350 回答