wsnfly~ 发表于 2015-3-16 07:36:02

zfz0122 发表于 2015-3-14 08:51
是什么原因啊

原因就是定义变量的时候定义了u32,这种变量应该要加volatile类型。

wsnfly~ 发表于 2015-3-16 07:37:26

安 发表于 2015-3-14 11:07
这不是软件问题,是设计人员程序书写的问题。

软件优化问题,要把tim定义成volatile的类型

wsnfly~ 发表于 2015-3-16 07:39:57

左岸右岸 发表于 2015-3-15 14:07
怎么我也觉得就该无限循环?跟大家的水平差距这么大么

tim【0】会在定时器中断中被过1毫秒被加1,按逻辑是在tim被清零,然后进入循环,然后就等待tim [ 0 ]被加到1000时会跳出循环,结果在循环中tim[ 0 ]并没有被累加。

发表于 2015-3-16 09:50:06

如果被优化,说明该变量没有使用。或者定义成了局部变量。

暗月 发表于 2015-3-16 10:26:48

应该是被优化掉了
tim[ 0 ]=0;
while(tim[ 0 ] < 1000);
可能被优化成while(0 < 1000); (要看实际编译后程序)所以就无限循环
用volatile强制去读tim[ 0 ] 试试应该可以解决

Small利 发表于 2015-3-16 10:47:24

这种问题不该怀疑硬件,是不了解volatile

wsnfly~ 发表于 2015-3-16 16:43:53

volatile确实是解决这个问题的其中一个方法之一,还有一个方法是在循环里面加上一小段代码

moyanming2013 发表于 2015-3-16 18:07:05

wsnfly~ 发表于 2015-3-16 16:43
volatile确实是解决这个问题的其中一个方法之一,还有一个方法是在循环里面加上一小段代码 ...

为什么要加上一小段代码就可以了呢?

wsnfly~ 发表于 2015-3-16 20:14:51

moyanming2013 发表于 2015-3-16 18:07
为什么要加上一小段代码就可以了呢?

可能是编译器优化的吧,我也不是很清楚。
加上volatile是标准的解决方法

zhangdaijin 发表于 2015-3-16 22:10:51

:D:D:D:D:D:D
页: 1 2 [3] 4
查看完整版本: stm32一个比较尴尬的地方,为何会这样