打印
[STM32F3]

stm32f302r8浮点运算结果出错

[复制链接]
3059|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jplzl|  楼主 | 2017-3-21 17:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

如图,只是一个简单的除法计算,但是计算结果却是错的。
程序跑在STM32F302R8 NUCLEO开发板上。
也不是一直是错的,就是跑了一段时间,会在某一个时刻出错。
如果直接单步在这一行的话,由于运算次数太多,也不好发现具体是哪一次开始出错的。

这会是什么原因造成的呢?
沙发
戈卫东| | 2017-3-21 18:20 | 只看该作者
有没有用中断?中断里面有没有用浮点运算?

使用特权

评论回复
板凳
jplzl|  楼主 | 2017-3-21 20:04 | 只看该作者
戈卫东 发表于 2017-3-21 18:20
有没有用中断?中断里面有没有用浮点运算?

有啊,TIM2中断,有浮点的累加
有影响?

使用特权

评论回复
地板
戈卫东| | 2017-3-21 22:05 | 只看该作者
jplzl 发表于 2017-3-21 20:04
有啊,TIM2中断,有浮点的累加
有影响?

有可能中断服务程序没有保存浮点寄存器。

使用特权

评论回复
5
jplzl|  楼主 | 2017-3-21 22:32 | 只看该作者
戈卫东 发表于 2017-3-21 22:05
有可能中断服务程序没有保存浮点寄存器。

啥意思啊。。。
还要手动保存寄存器?

使用特权

评论回复
6
whtwhtw| | 2017-3-22 09:33 | 只看该作者
float范围太小,用double定义试试

使用特权

评论回复
7
jplzl|  楼主 | 2017-3-22 10:17 | 只看该作者
whtwhtw 发表于 2017-3-22 09:33
float范围太小,用double定义试试

应该不是的,我试过把算式改造成放大1000倍,也是一样的,会出错

使用特权

评论回复
8
whtwhtw| | 2017-3-22 10:59 | 只看该作者
jplzl 发表于 2017-3-22 10:17
应该不是的,我试过把算式改造成放大1000倍,也是一样的,会出错

如果出错,放大多少倍都是错,不试试怎么知道

使用特权

评论回复
9
jplzl|  楼主 | 2017-3-22 11:17 | 只看该作者
whtwhtw 发表于 2017-3-22 10:59
如果出错,放大多少倍都是错,不试试怎么知道

不太懂你这个说法是啥意思
放大1000倍的话,是不是计算结果的有效位可以提高3位呢?
这个plus_off = 0.0065,我先乘以1000,不就成6.5了么,那再除以vi的话,也会在float的有效会内吧
如果是float转double的问题,那估计是不存在计算对的可能吧

使用特权

评论回复
10
jplzl|  楼主 | 2017-3-22 11:50 | 只看该作者
yyy71cj 发表于 2017-3-22 11:42
监控有时候不准,因为里头有代码优化,你看到的值并不是当时的运算值。
你这里最好在前头做几个没有意义的 ...

并没有开代码优化,看寄存器的值准不准还真不好说,毕竟是仿真调试,但运行结果是错误的却是肯定的。。。
有时候就是加了几条无关的凑数代码,就又好了的

使用特权

评论回复
11
大道至简| | 2017-3-22 13:03 | 只看该作者
arm里面我一般都用double,float是省一点内存,但是我不去省这个

使用特权

评论回复
12
TXQDM| | 2017-3-22 13:08 | 只看该作者
听起来的确是个比较棘手的问题

使用特权

评论回复
13
lboy| | 2017-3-22 14:28 | 只看该作者
本帖最后由 lboy 于 2017-3-22 14:29 编辑

先赋值,再运算。要么改为静态变量。

使用特权

评论回复
14
戈卫东| | 2017-3-22 18:14 | 只看该作者
jplzl 发表于 2017-3-21 22:32
啥意思啊。。。
还要手动保存寄存器?

编译器应该做这个事情。
不过,也许你用的工具目前还没有做到----猜的。

使用特权

评论回复
15
jplzl|  楼主 | 2017-3-23 09:25 | 只看该作者
yyy71cj 发表于 2017-3-22 16:59
你贴出来的是跟踪的结果,跟踪的结果有时候是不准确的

可是实际运行结果也是错误的哦,
目前只发现了这里有问题,不敢说100%吧,大概率就是由于这里的计算错误

使用特权

评论回复
16
jplzl|  楼主 | 2017-3-23 09:26 | 只看该作者
戈卫东 发表于 2017-3-22 18:14
编译器应该做这个事情。
不过,也许你用的工具目前还没有做到----猜的。 ...

KEIL5啊。。。怎么会没做到。。

使用特权

评论回复
17
xmshao| | 2017-3-23 11:16 | 只看该作者
除了优化导致的原因外,是否会有溢出的可能呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

229

帖子

2

粉丝