STM32程序while语句奇怪的问题

2020-01-10 19:45发布

ticks[1] = 100;

while(ticks[1] != 0)  trigger = 0;

就是while这么一句,主程序中只要加这句,就卡死在这里,显示while循环并没有执行,ticks[1]的值在中断里面是一直在减少的,直到减少为0,而且通过串口查看确实最终减少为零了,但是并没有跳出while循环。

那么为什么会卡死? 高手帮分析一下!
19条回答
security
1楼 · 2020-01-10 23:51.采纳回答
本帖最后由 security 于 2016-8-2 17:35 编辑
RudeBoy 发表于 2016-8-2 17:24
好像可以了,为毛啊


1、你需要去搜索引擎里面,搜一下 volatile 的用法
2、这里的原因是:编译器优化掉了,认为 (ticks[1]  != 0) 这个条件永远成立,没意识 ticks[1] 会被改变,因为在 C 编译器看来:ISR 并不会显式的被 C 编译器调用(ISR 是隐式的调用,由硬件中断触发 MCU 调用的)
blxy
2楼-- · 2020-01-10 22:20
定义ticks时,加volatile前缀试试
RudeBoy
3楼-- · 2020-01-10 23:50
blxy 发表于 2016-8-2 17:20
定义ticks时,加volatile前缀试试

好像可以了,为毛啊
RudeBoy
4楼-- · 2020-01-11 02:19
security 发表于 2016-8-2 17:32
1、你需要去搜索引擎里面,搜一下 volatile 的用法
2、这里的原因是:编译器优化掉了,认为 (tick[1]  != ...

刚才查了一下,但是没有想明白为什么会被优化掉,多谢指教!
liwey
5楼-- · 2020-01-11 03:15
 精彩回答 2  元偷偷看……
RudeBoy
6楼-- · 2020-01-11 05:02
liwey 发表于 2016-8-2 18:06
很容易理解的, ticks[1] 的值, 在这个循环体内是不是没有被修改过(如果没有中断的话)?那么编译器就 ...

恩恩 明白了,还真是头一次遇到这个问题
liwey
7楼-- · 2020-01-11 09:15
RudeBoy 发表于 2016-8-2 18:39
恩恩 明白了,还真是头一次遇到这个问题

哈哈, 这还不算, 有时候debug版本正常运行, release版本不正常(被优化掉了), 我第一次碰到这个问题,也感觉好不可思议。

一周热门 更多>