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 调用的)
wqm521216
2楼-- · 2020-01-11 12:35
学习了,活到老学到老
huarana
3楼-- · 2020-01-11 16:10
所以一般不开优化 , 反正资源够用。
Vmao
4楼-- · 2020-01-11 21:34
 精彩回答 2  元偷偷看……
varding
5楼-- · 2020-01-11 22:51
RudeBoy 发表于 2016-8-2 18:39
恩恩 明白了,还真是头一次遇到这个问题

可以看看stm32库里大量使用volatile,这个是嵌入式编程的基础。
比如你要读取UART1的DR寄存器,如果没加volatile那么mcu很可能会直接从cpu的寄存器里取缓存过的DR数据,加volatile强制cpu每次都去读DR
CH_anyin
6楼-- · 2020-01-12 01:40
学习,加深印象!
justdomyself
7楼-- · 2020-01-12 07:33
好(✪▽✪)

一周热门 更多>