我在C中使用VS2012极限进行一些嵌入式开发,我用平台抽象编译了代码,并在我的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 trig函数,使它们人为地慢下来?
发布于 2013-10-09 17:14:31
我不确定你的宏观想法是否会给你带来有用的结果,但这就是你能让它发挥作用的方法:
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-09 17:37:55
定义一个新功能:
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-13 06:30:52
如果可以,切换到其他一些C编译器,基本上是从gcc从mingw32。使用gcc,您可以使用这个巧妙的技巧来用自己的代码替换库函数,就像在this answer中解释的那样。还要看看Visual是否可以做类似的事情!
(附带说明:如果您一直使用Windows,那么我个人认为C开发中最简单的方法就是获取Qt,包括Qt,然后将其用于普通的C项目,该项目支持开箱即用。)
或者,抓取C数学库的源,例如来自this answer的源,编辑它们以包括延迟,并根据它们而不是标准的数学库进行链接。使用gcc时,您可以不使用-lm链接器开关,而是像其他库一样使用定制库进行链接。对于VC来说,它可以很简单,但是默认情况下它是可使用的数学库,在这种情况下,您需要了解如何禁用这个默认链接。
另外,请确保禁用任何优化,这可能会为数学库函数创建自定义内联代码!虽然只是在调试模式下进行编译,但很可能会实现这一点。
请注意,您的分析结果将非常粗糙。您可能应该校准一些东西,为一般的C优化设置,以及测量您需要添加到任何浮点指令的延迟。但是如果在真正的设备上分析真实的代码不是一种选择,而且这不仅仅是一个项目,而且在将来也是有用的,那么我可以看到为本地PC代码设置某种类似环境的好处。
https://stackoverflow.com/questions/19037521
复制相似问题