c语言while()循环的奇怪问题

[复制链接]
4183|22
 楼主| 7120223 发表于 2013-7-17 19:15 | 显示全部楼层 |阅读模式
uint16_t DS1620TempCount  = 0;
DS1620TempCount = 0;
while(DS1620TempCount < 40);
1ms中断函数里面DS1620TempCount ++;  仿真看到DS1620TempCount 已经加到上千了上万了
但是while就是跳不出来,好奇怪啊,换了几种条件的判断不同写法,在里面加了break也跳不出来,啥毛病
ygrssm 发表于 2013-7-17 19:22 | 显示全部楼层
我很好奇你所说的仿真已经加上千了上万了是怎么做到的,一次一次加的吗?另外“while(DS1620TempCount < 40);”这一句,你直接在这里打封号,这个判断有什么用?
 楼主| 7120223 发表于 2013-7-17 19:29 | 显示全部楼层
jlink swd调试可以看出来的,延时作用
aozima 发表于 2013-7-17 20:49 | 显示全部楼层
  1. volatile uint16_t DS1620TempCount  = 0;
kartik 发表于 2013-7-17 21:10 | 显示全部楼层
lt19870405 发表于 2013-7-17 21:47 | 显示全部楼层
这种变量不会在优化的时候改变的,volatile可不加,while那句后面的分号去掉试试。
 楼主| 7120223 发表于 2013-7-18 09:26 | 显示全部楼层
加了volatile 问题解决
去分号,问题依旧。
什么时候该用volatile呢,其他变量没用过,也没问题,就这个必须用,不然while死了了。
老鱼探戈 发表于 2013-7-18 09:56 | 显示全部楼层
本帖最后由 老鱼探戈 于 2013-7-18 09:58 编辑
  1. uint16_t DS1620TempCount  = 0;
  2. DS1620TempCount = 0;      //此句就在while前面,这是要闹哪样?
  3. while(DS1620TempCount < 40);  
江枫渔火 发表于 2013-7-18 10:07 | 显示全部楼层
volatile 强制程序每次取值的时候,都认真的去重新读取。

特别对于    变量的值在中断中被更改的时候,强烈建议volatile修饰该变量,

主要因为编译器发现顺序执行代码,没有修改变量的地方,会想当然的以为变量不会变化,而优化了认为多余的代码。

评分

参与人数 1威望 +1 收起 理由
rambler + 1 赞一个!

查看全部评分

zh_sl 发表于 2013-7-18 10:34 | 显示全部楼层
单步看while(DS1620TempCount < 40);时汇编做了什么
tergy2012 发表于 2013-7-18 11:56 | 显示全部楼层
好久没用c语言了,都有点忘记了啊
现在努力吧 发表于 2013-7-18 12:15 | 显示全部楼层
这应该跟变量的作用域有关吧,在DS1620TempCount加个static试试
goldsunking 发表于 2013-7-18 13:08 | 显示全部楼层
这个是编译优化的问题。
while循环前,编译器把DS1620TempCount变量读入到某个寄存器后,
while循环一直判断这个寄存器的值,而不是DS1620TempCount的真正值。
所以在其他程序(比如中断)中改变DS1620TempCount的值时,while循环一直在判断寄存器的数据,所以while就出不来了。
volatile 修饰符告诉编译器,这个变量是变化的,不要优化。

评分

参与人数 2威望 +2 收起 理由
rambler + 1 赞一个!
buaaszb + 1 很给力!

查看全部评分

zfazhan 发表于 2013-7-18 22:15 | 显示全部楼层
楼主用的是什么芯片,什么编译器呢?
 楼主| 7120223 发表于 2013-7-19 08:39 | 显示全部楼层
keil 4   stm32f103
8l楼:这是个延时语句 ,1ms定时器里面会累加的。
哦,对。有可能是我的软件开的优化到最大程度了,因为用的是官方的库,不开优化编译出来的太大了。
SOUTHGARD 发表于 2013-7-21 17:09 | 显示全部楼层
1. 若要优化,就应该加volatile,否则DS1620TempCount变量编译器会认为之前的=0之后,没有变化,while()语句里的条件永远为真,不需要跳出来的。
2. 单从这几行语句来看,加了volatile后就没什么缺陷了。若还不行,建议看看你的定时中断开启方面有没问题。
   因为我看你定义完变量后,没有开启定时中断的语句,会不会?嗯?
HORSE7812 发表于 2013-8-3 15:33 | 显示全部楼层
无名无姓 发表于 2013-8-3 17:27 | 显示全部楼层
优先,你确认你能进中断,如果可以进的话,可能是你编译器优化的问题。在变量定义前面加上关键字volatile。
肯定行。测试OK了记得给我分。
slwq1314 发表于 2013-8-4 13:21 | 显示全部楼层
应该在DS1620TempCount加个static,在函数里 不加static对变量赋初值,每次进入中断都会对该变量进行初始化,每次中断后变量值仅仅加了1,然后下一次中断又回到了0,永远加不到40,while(DS1620TempCount < 40);这句话就一直成立,当然跳不出来了
菜鸟集中营营长 发表于 2013-8-4 16:19 | 显示全部楼层
学习了,哈哈!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

389

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部