wuyage

一个编译器优化引起的问题

0
阅读(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.jpg

这个default等级是Level 2

221.jpg

当改为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 优化指令

IAR youhua.jpg


2) 关于Keil-MDK 优化的文档

Getting the Best Optimized Code for your Embedded Application.pdf

ARM® Compiler Software Development Guide.pdf


Baidu
map