你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于keil的优化等级

[复制链接]
我的慢慢小宝贝 提问时间:2020-12-12 11:10 /
使用的芯片是stm32f407ve,ucos_iii,keil5

我在程序中这样几个赋值的语句
其中 #define Speed 6400  


  1. Speed1 = Speed;                        
  2. vx1 = Speed1;
复制代码
程序中 Speed1 的数据类型是 uint32_t,vx1的数据类型是float。
现在遇到了这样一个问题,就是赋值完后 vx1的值为0.5;
出现这个现象是因为,我把程序中几个全局变量的类型由 uint16_t 改成了 uint32_t。
后来我尝试强制类型转换 vx1 = (float)Speed1;  没有效果
尝试直接赋值 vx1 = 6400;   vx1 = 6400.0f;       都没有效果


但是下面的几个尝试可以得到正确的值
1、vx1的数据类型改为 uint32_t
2、keil中的优化等级改为不优化
3、赋一个其他的值,6399  ,  800等其他的值都没有问题。

其中上面第三个尝试最让我迷惑,为什么只有6400这个值不行呢?(可能也有别的值不行,但是我没有挨个实验)
想着应该是由于程序空间的问题,被优化的结果,但是不是很明白,有没有哪个前辈给解答一下

非常感谢

收藏 1 评论11 发布时间:2020-12-12 11:10

举报

11个回答
废鱼 回答时间:2020-12-12 11:38:21
楼主可以看看float的存储方法,建议换成double类型试试。
我的慢慢小宝贝 回答时间:2020-12-12 12:04:28
安 发表于 2020-12-12 11:38
楼主可以看看float的存储方法,建议换成double类型试试。

非常感谢您的回复,我试过了,换成double也不行,是这个数 5.222099016829e-315
废鱼 回答时间:2020-12-12 14:00:49
之前的回答由误,已删除。
我测试了一下:
#define Speed1 6400  
        float a=Speed1; float a=(float)Speed1;
这两种定义都是可以显示为6400的,在线仿真,内存中的数据是正确的。
我的慢慢小宝贝 回答时间:2020-12-12 14:19:47
安 发表于 2020-12-12 14:00
之前的回答由误,已删除。
我测试了一下:
#define Speed1 6400  

看别人说,优化后是会容易造成一些奇怪问题。
这有没有可能是因为由于我的程序某些地方写的不太规范,然后占用内存有比较大了,优化后引起的问题
废鱼 回答时间:2020-12-12 14:29:14
应该不会,优化会删除一些代码,比如空的for循环。你不用ucos试试,我测试的时候没有使用ucos。
七哥 回答时间:2020-12-14 09:07:08
被优化,是因为编译器发现,你这条代码没有实际作用。
只有赋值,没有调用;即便被中间转了一级,但是它判断你的下一级也没有实际作用,有可能一起被优化。
#define 只是宏定义,不是变量,只是个替换。
变量要想不被优化,加个volatile修饰。典型应用,比如软件延时函数中,就得用volatile,否则延时差太多,或根本起不到作用。
二哲科技 回答时间:2020-12-18 09:17:32
所以每次都会把优化关闭,就算代码量大一点,也不会因为编译器的问题导致程序出问题。
kylixyao 回答时间:2020-12-18 18:21:16
欢迎讨论
老牛洋车 回答时间:2020-12-22 09:40:19
toofree 发表于 2020-12-14 09:07
被优化,是因为编译器发现,你这条代码没有实际作用。
只有赋值,没有调用;即便被中间转了一级,但是它判 ...

我也遇到过延时函数被优化的情况,无论如何调整延时参数,延时几乎等于0,毫不起作用。
七哥 回答时间:2020-12-22 14:12:36
具体情况,具体分析吧
我试了个工程,无论用哪个优化等级,都可以正常赋值,没有被优化。
天臆弄人 回答时间:2020-12-22 15:40:16
我不想说,要区别开你是什么情况下,是任务栈内,还是栈内操作了这句,区别很大

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版