为了简便说明问题,提取代码如下。
#include<msp430x14x.h>
#define uchar unsigned char
uchar b=1;
uchar a=5;
uchar c=10;
void main()
{
while(b)
{
a--;
}
c--;
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
b=0;
}
当上面while循环中语句为while(b)
{
;
}只有一个分号时,可以跳出while循环,但是当while(b)
{
a--;//或其他语句时
}跳不出while循环。
这是为什么,测试时两次都进入了中断。
求指教
------解决方案--------------------
如果非要解释,从语法上解释不通
只能说是编译器的优化。。。
------解决方案--------------------
把优化级别调低一些
如果不愿意调低优化级别,试试在变量前面加上 volatile
------解决方案--------------------
同意上面的,应该是优化导致的
uchar b=1;
改成
volatile uchar b=1;
应该就可以了
------解决方案--------------------
你的中断ISR中没有clear掉PxIFG,这会导致你刚退出ISR到主程序,又会重新进入ISR。而编译器又会把你的主函数按分析后的逻辑来执行,虽然主程序的执行逻辑是正确的,但是和你的源代码的代码行不对应。所以你在ISR中clear掉PxIFG试一下。这应该不会是IAR的优化问题。如果这么一点程序IAR都优化出错,那IAR在2.0的时候就该被扔进垃圾桶了,不会出到5.X了。而事实上IAR出了这么多版本,编译器的版本变动不多的。