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

stm32一个比较尴尬的地方,为何会这样

[复制链接]
wsnfly~ 提问时间:2015-3-13 14:50 /
阅读主题, 点击返回1楼
收藏 评论33 发布时间:2015-3-13 14:50
33个回答
wyxy163@126.com 回答时间:2015-3-14 13:37:01
提示: 作者被禁止或删除 内容自动屏蔽
左岸右岸 回答时间:2015-3-15 14:07:15
怎么我也觉得就该无限循环?跟大家的水平差距这么大么
zhangdaijin 回答时间:2015-3-15 16:21:35
doctorsoft 回答时间:2015-3-15 17:24:52
仿真一下就能解决了嘛,看能否进入中断,变量能否一直往上加
slotg 回答时间:2015-3-15 19:39:33
看法跟7楼相同,应该是被优化了。
wsnfly~ 回答时间:2015-3-16 07:36:02

原因就是定义变量的时候定义了u32,这种变量应该要加volatile类型。
wsnfly~ 回答时间:2015-3-16 07:37:26
安 发表于 2015-3-14 11:07
这不是软件问题,是设计人员程序书写的问题。

软件优化问题,要把tim[0]定义成volatile的类型
wsnfly~ 回答时间:2015-3-16 07:39:57
左岸右岸 发表于 2015-3-15 14:07
怎么我也觉得就该无限循环?跟大家的水平差距这么大么

tim【0】会在定时器中断中被过1毫秒被加1,按逻辑是在tim[0]被清零,然后进入循环,然后就等待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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版