MDK对浮点支持有bug吗?

2020-01-11 18:09发布

最近调试stm32f103平台上调试pid,发现函数参或者返回值若使用float型,则总会出问题,发现传进去的参数或者返回来的的值并非本来赋的那个值,百思不得其解.但若使用指针传递则完全正常。难道使用浮点有什么特殊操作吗?
举个例子.
float pid_cal(float in)
{
float ret=0.012;
……
printf("in=%f ",in);
return ret;
}

调用函数pid_cal(2.5); 函数打印出in=xxxx.xxxx。是一个很大的值,并非2.5
同理printf("pid_val=%f ",pid_cal(3.0));打印出来也不是期望的0.012

如改成指针形式则正常如
void pid_cal(float *in,float *out)
{
float ret=0.012;
……
printf("in=%f ",*in);
*out=ret;
}

float t=2.5;
float out_val;
pid_cal(&t,&out_val);
这样使用就不会有问题.

我觉得MDK不至于这么弱智吧?有人碰到过吗?
还是我的MDK破解有问题?
之前用的MDK4.6就有这个问题,后来还特地升级到4.73,发现问题依旧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
flamma
1楼-- · 2020-01-11 23:47
我印象当中,mdk的float变量必须是64位地址对齐的。但是mdk本身不会去做这件事情。你用栈来传递float,大概要自己保证传递时的堆栈的地址是64位对齐的。
PZLPDY
2楼-- · 2020-01-12 04:40
flamma 发表于 2015-2-10 16:39
我印象当中,mdk的float变量必须是64位地址对齐的。但是mdk本身不会去做这件事情。你用栈来传递float,大概 ...

看他们写的DSP库里面用浮点数貌似都没有什么特殊的对齐操作呀
flamma
3楼-- · 2020-01-12 05:38
 精彩回答 2  元偷偷看……
PZLPDY
4楼-- · 2020-01-12 07:55
flamma 发表于 2015-2-10 16:49
如果都是自己写,好像没对齐的需要。但是如果你要调用库函数,不对齐就有可能出错。因为编译器有可能自动 ...

这样呀?我都是自己写的。
难道调用printf出问题了?
abl
5楼-- · 2020-01-12 10:58
本帖最后由 abl 于 2015-2-11 12:26 编辑

MDK5.13依然有类似的问题.

假设两个函数:
float func1(void);
void func2(float);

这样调用就有问题:
func2( func1() );

这样就没问题:

float v = func1();
func2(v);

仿真跟踪就会发现,  func2( func1() ) 调用 func2传入的变量为0.
yuyu87
6楼-- · 2020-01-12 16:27
正常,精度问题,用双精度就不会出现了,

一周热门 更多>