打印

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

[复制链接]
3839|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
7120223|  楼主 | 2013-7-17 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ygrssm| | 2013-7-17 19:22 | 只看该作者
我很好奇你所说的仿真已经加上千了上万了是怎么做到的,一次一次加的吗?另外“while(DS1620TempCount < 40);”这一句,你直接在这里打封号,这个判断有什么用?

使用特权

评论回复
板凳
7120223|  楼主 | 2013-7-17 19:29 | 只看该作者
jlink swd调试可以看出来的,延时作用

使用特权

评论回复
地板
aozima| | 2013-7-17 20:49 | 只看该作者
volatile uint16_t DS1620TempCount  = 0;

使用特权

评论回复
5
kartik| | 2013-7-17 21:10 | 只看该作者

使用特权

评论回复
6
lt19870405| | 2013-7-17 21:47 | 只看该作者
这种变量不会在优化的时候改变的,volatile可不加,while那句后面的分号去掉试试。

使用特权

评论回复
7
7120223|  楼主 | 2013-7-18 09:26 | 只看该作者
加了volatile 问题解决
去分号,问题依旧。
什么时候该用volatile呢,其他变量没用过,也没问题,就这个必须用,不然while死了了。

使用特权

评论回复
8
老鱼探戈| | 2013-7-18 09:56 | 只看该作者
本帖最后由 老鱼探戈 于 2013-7-18 09:58 编辑
uint16_t DS1620TempCount  = 0;
DS1620TempCount = 0;      //此句就在while前面,这是要闹哪样?
while(DS1620TempCount < 40);  

使用特权

评论回复
9
江枫渔火| | 2013-7-18 10:07 | 只看该作者
volatile 强制程序每次取值的时候,都认真的去重新读取。

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

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
rambler + 1 赞一个!
10
zh_sl| | 2013-7-18 10:34 | 只看该作者
单步看while(DS1620TempCount < 40);时汇编做了什么

使用特权

评论回复
11
tergy2012| | 2013-7-18 11:56 | 只看该作者
好久没用c语言了,都有点忘记了啊

使用特权

评论回复
12
现在努力吧| | 2013-7-18 12:15 | 只看该作者
这应该跟变量的作用域有关吧,在DS1620TempCount加个static试试

使用特权

评论回复
13
goldsunking| | 2013-7-18 13:08 | 只看该作者
这个是编译优化的问题。
while循环前,编译器把DS1620TempCount变量读入到某个寄存器后,
while循环一直判断这个寄存器的值,而不是DS1620TempCount的真正值。
所以在其他程序(比如中断)中改变DS1620TempCount的值时,while循环一直在判断寄存器的数据,所以while就出不来了。
volatile 修饰符告诉编译器,这个变量是变化的,不要优化。

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
rambler + 1 赞一个!
buaaszb + 1 很给力!
14
zfazhan| | 2013-7-18 22:15 | 只看该作者
楼主用的是什么芯片,什么编译器呢?

使用特权

评论回复
15
7120223|  楼主 | 2013-7-19 08:39 | 只看该作者
keil 4   stm32f103
8l楼:这是个延时语句 ,1ms定时器里面会累加的。
哦,对。有可能是我的软件开的优化到最大程度了,因为用的是官方的库,不开优化编译出来的太大了。

使用特权

评论回复
16
SOUTHGARD| | 2013-7-21 17:09 | 只看该作者
1. 若要优化,就应该加volatile,否则DS1620TempCount变量编译器会认为之前的=0之后,没有变化,while()语句里的条件永远为真,不需要跳出来的。
2. 单从这几行语句来看,加了volatile后就没什么缺陷了。若还不行,建议看看你的定时中断开启方面有没问题。
   因为我看你定义完变量后,没有开启定时中断的语句,会不会?嗯?

使用特权

评论回复
17
HORSE7812| | 2013-8-3 15:33 | 只看该作者
学习

使用特权

评论回复
18
无名无姓| | 2013-8-3 17:27 | 只看该作者
优先,你确认你能进中断,如果可以进的话,可能是你编译器优化的问题。在变量定义前面加上关键字volatile。
肯定行。测试OK了记得给我分。

使用特权

评论回复
19
slwq1314| | 2013-8-4 13:21 | 只看该作者
应该在DS1620TempCount加个static,在函数里 不加static对变量赋初值,每次进入中断都会对该变量进行初始化,每次中断后变量值仅仅加了1,然后下一次中断又回到了0,永远加不到40,while(DS1620TempCount < 40);这句话就一直成立,当然跳不出来了

使用特权

评论回复
20
学习了,哈哈!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

389

帖子

0

粉丝