打印
[STM32F3]

STM32F302计算错误问题

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

如上两张图所示。
本来只是一个简单的除法求解问题。
原来一直以为是除法计算错误。
但通过这两张图,发现好像不是除法本身的问题,而是这个变量temp的问题。
这个temp是函数内变量,定义为        volatile float temp;为了排除编译问题还特意加了volatile。
但是在用keil里面的go to defined 查找temp的定义时,却弹出了三个不同的定义,其他两个都是别的函数内定义的局部变量。
不知道为何也会一起弹出,而不直接定位到该函数内的定义处。这也可能是别的原因吧。

这个temp在此函数中有多处使用,做为中间变量存放中间值。
但在此计算处,根据仿真结果,可知道,此处temp并没有进行该除法的计算赋值,而是直接读取了相应的变量值做为判断使用。

这个错误,不光是仿真时能发现,而是在实际完全在nucleo板上运行时,这个错误也是存在的。
具体原因就是这个temp的错误,导致该函数的返回值错误,从而整个程序运行出错。

从这两张图看,有点像是函数内存溢出?
但程序数据并不多RW data只有176字节

此是为何

沙发
mmuuss586| | 2017-4-2 20:03 | 只看该作者
换个变量名,或者新建个工程看看;

还有优化级别设置下;

使用特权

评论回复
板凳
51xlf| | 2017-4-2 22:52 | 只看该作者
显示的问题吗?

使用特权

评论回复
地板
51xlf| | 2017-4-2 22:53 | 只看该作者
改变一下变量的类型试试。

使用特权

评论回复
5
zchong| | 2017-4-3 11:09 | 只看该作者
优化调到最低,看到的值不一定真实,最好看一下汇编,看看程序执行流程

使用特权

评论回复
6
jplzl|  楼主 | 2017-4-3 12:28 | 只看该作者
zchong 发表于 2017-4-3 11:09
优化调到最低,看到的值不一定真实,最好看一下汇编,看看程序执行流程

优化都是-O0的,看了汇编也是正常的,都是单次运算的C代码,都没敢写复合运算。
结合程序实际运行的情况看,这个看到的值到像是很真的。
原来以为是计算错误,但现在看,很可能是取值错误了

使用特权

评论回复
7
zyj9490| | 2017-4-3 13:38 | 只看该作者
不优化,试下。

使用特权

评论回复
8
jplzl|  楼主 | 2017-4-3 15:46 | 只看该作者
zyj9490 发表于 2017-4-3 13:38
不优化,试下。

没有使用优化呀
-O0级别

使用特权

评论回复
9
zchong| | 2017-4-3 17:40 | 只看该作者
jplzl 发表于 2017-4-3 12:28
优化都是-O0的,看了汇编也是正常的,都是单次运算的C代码,都没敢写复合运算。
结合程序实际运行的情况 ...

汇编都是正常的,为啥最后是错的?

使用特权

评论回复
10
htmlme| | 2017-4-3 22:47 | 只看该作者
改变变量类型试试

使用特权

评论回复
11
htmlme| | 2017-4-3 22:51 | 只看该作者
把鼠标放在上面查看寄存器数据?

使用特权

评论回复
12
jkl21| | 2017-4-4 21:44 | 只看该作者
使用串口输出试试

使用特权

评论回复
13
jkl21| | 2017-4-4 21:47 | 只看该作者
这个temp变量设置double类型呢。

使用特权

评论回复
14
jplzl|  楼主 | 2017-4-5 15:01 | 只看该作者
jkl21 发表于 2017-4-4 21:44
使用串口输出试试

不用串口输出,这个结果关系到pwm的周期,直接检测pwm周期发现是错误的,和这个看到的错误结果一致

使用特权

评论回复
15
jplzl|  楼主 | 2017-4-5 15:03 | 只看该作者
htmlme 发表于 2017-4-3 22:51
把鼠标放在上面查看寄存器数据?

不是,在watch窗口中看的
和pwm输出结果一致,这个观测到的结果与实际硬件输出结果一致

使用特权

评论回复
16
UHARC| | 2017-4-5 16:49 | 只看该作者
改一下变量类型呢?

使用特权

评论回复
17
jplzl|  楼主 | 2017-4-5 17:58 | 只看该作者
UHARC 发表于 2017-4-5 16:49
改一下变量类型呢?

一样的,改成double类型也是错误的

使用特权

评论回复
18
sheepdog79| | 2017-4-5 23:32 | 只看该作者
后来呢?   关闭优化后有变化吗

用 live watch可以观察吗?

使用特权

评论回复
19
sheepdog79| | 2017-4-5 23:35 | 只看该作者
后来呢?   关闭优化后有变化吗

用 live watch可以观察吗?

使用特权

评论回复
20
jplzl|  楼主 | 2017-4-7 13:52 | 只看该作者
sheepdog79 发表于 2017-4-5 23:35
后来呢?   关闭优化后有变化吗

用 live watch可以观察吗?

一直是没用优化的。
可能是编译的时候,把哪里整的溢出了吧
不是计算错误,应该是中途取值错误,类似地址重叠共用了,应该是

使用特权

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

本版积分规则

40

主题

229

帖子

2

粉丝