硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5246|回复: 6
收起左侧

[有问必答] F407中断函数中计算简单浮点就死机

[复制链接]

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2018-5-7 16:04:17 | 显示全部楼层 |阅读模式
一个定时器中断函数, 2us进一次,函数内计算比较简单。芯片F407, keil中打开了fpu
有个uint16变量abc, 如果计算abc*0.8就死机。如果计算abc*8/10,就很好。。。。
怎么回事?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-5-7 16:08:35 | 显示全部楼层
看下反汇编,浮点乘法对应的指令是否是以字母v开头的,如果是的话,才真正开启了,如果没有正确开启,而MDK生成的代码带浮点指令,执行的时候会死掉。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
 楼主| 发表于 2018-5-7 16:17:36 | 显示全部楼层
eric2013 发表于 2018-5-7 16:08
看下反汇编,浮点乘法对应的指令是否是以字母v开头的,如果是的话,才真正开启了,如果没有正确开启,而MDK ...

看汇编,使用的是VMOV和VMOV.F32指令,那应该就是开启了浮点了。
Snipaste_2018-05-07_16-14-15.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-5-7 16:25:35 | 显示全部楼层
caicaptain2 发表于 2018-5-7 16:17
看汇编,使用的是VMOV和VMOV.F32指令,那应该就是开启了浮点了。

然后在看下这里,单步调试,看看你的程序进入这里了没有
QQ截图20180507162408.png
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
 楼主| 发表于 2018-5-7 16:33:14 | 显示全部楼层
eric2013 发表于 2018-5-7 16:25
然后在看下这里,单步调试,看看你的程序进入这里了没有

看了下执行的时间。发现了问题所在。乘以0.8的浮点计算耗时太长,超越了中断间隔时间。
abc*0.8的耗时比abc*80/100多了3us。。。。
浮点指令虽然只有几行,耗时居然高达几个微秒。。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-5-7 16:36:20 | 显示全部楼层
caicaptain2 发表于 2018-5-7 16:33
看了下执行的时间。发现了问题所在。乘以0.8的浮点计算耗时太长,超越了中断间隔时间。
abc*0.8的耗时比 ...

不要是0.8,要是0.8f,务必加上后缀。这样表示单精度浮点操作,如果你没有加就是双精度,F4搞双精度比较吃力。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
 楼主| 发表于 2018-5-7 16:40:29 | 显示全部楼层
eric2013 发表于 2018-5-7 16:36
不要是0.8,要是0.8f,务必加上后缀。这样表示单精度浮点操作,如果你没有加就是双精度,F4搞双精度比较 ...

你说的非常正确! 我同时在百度搜索答案,发现就是这个语法问题。 浮点数末尾加上f就是单精度。
经过测试 abc*0.8f 比 abc*80/100 耗时,多了0.14us,可以正常运行了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 06:47 , Processed in 0.043027 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表