使用的芯片是stm32f407ve,ucos_iii,keil5 我在程序中这样几个赋值的语句 其中 #define Speed 6400
现在遇到了这样一个问题,就是赋值完后 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这个值不行呢?(可能也有别的值不行,但是我没有挨个实验) 想着应该是由于程序空间的问题,被优化的结果,但是不是很明白,有没有哪个前辈给解答一下 非常感谢 |
非常感谢您的回复,我试过了,换成double也不行,是这个数 5.222099016829e-315
我测试了一下:
#define Speed1 6400
float a=Speed1; float a=(float)Speed1;
这两种定义都是可以显示为6400的,在线仿真,内存中的数据是正确的。
看别人说,优化后是会容易造成一些奇怪问题。
这有没有可能是因为由于我的程序某些地方写的不太规范,然后占用内存有比较大了,优化后引起的问题
只有赋值,没有调用;即便被中间转了一级,但是它判断你的下一级也没有实际作用,有可能一起被优化。
#define 只是宏定义,不是变量,只是个替换。
变量要想不被优化,加个volatile修饰。典型应用,比如软件延时函数中,就得用volatile,否则延时差太多,或根本起不到作用。
我也遇到过延时函数被优化的情况,无论如何调整延时参数,延时几乎等于0,毫不起作用。
我试了个工程,无论用哪个优化等级,都可以正常赋值,没有被优化。