一个编译器优化引起的问题
0赞
发表于 2015/12/28 23:02:52
阅读(2411)
今天别人分析一个问题,觉得挺有意思,拿出来分享一下。
他使用KE的驱动库,开发环境Keil,写了这么一段代码:
unsigned int count; void main() { count=5; while(count>0); ...... } void PIT_ISR(void) { ...... if(count>0) count--; }
本意是想做一个延时,在PIT中断里count每次减1,当减到0时,main函数继续向下执行。
结果发现当count减到0时,并没有跳出while循环。
后来找到了解决办法:
1) KE驱动库中Keil设置的优化等级如下:
这个default等级是Level 2
当改为Level 0 等级之后程序就可以正常运行了。
1)将unsigned int count; 定义前加上 volatile 也可以
关于这个问题的讨论可以参考阿莫论坛上的一个帖子:http://www.amobbs.com/thread-4214047-1-1.html?_dsign=70e4c681
另外关于编译器优化问题,可参考同事Jicheng的两篇博客:
http://blog.chinaaet.com/jihceng0622/p/42068
http://blog.chinaaet.com/jihceng0622/p/34933
P.S
1) IAR 优化指令
2) 关于Keil-MDK 优化的文档
Getting the Best Optimized Code for your Embedded Application.pdf
ARM® Compiler Software Development Guide.pdf