IAR环境编译发生的诡异现象

方丈的寺院
Java领域优质创作者
博客专家认证
2012-07-31 08:54:26
为了简便说明问题,提取代码如下。
#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循环。
这是为什么,测试时两次都进入了中断。
求指教
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
方丈的寺院 2012-08-12
  • 打赏
  • 举报
回复
解决了,编译器优化。我把变量定义为volatile 类型,或者将release 版本改为debug也行
shinerise 2012-08-07
  • 打赏
  • 举报
回复
另外多嘴说一句,如果真的感觉逻辑运行有问题,那就激活disassemble窗口,然后F11单步逐条语句来执行,看执行逻辑。那个一目了然。
shinerise 2012-08-07
  • 打赏
  • 举报
回复
你的中断ISR中没有clear掉PxIFG,这会导致你刚退出ISR到主程序,又会重新进入ISR。而编译器又会把你的主函数按分析后的逻辑来执行,虽然主程序的执行逻辑是正确的,但是和你的源代码的代码行不对应。所以你在ISR中clear掉PxIFG试一下。这应该不会是IAR的优化问题。如果这么一点程序IAR都优化出错,那IAR在2.0的时候就该被扔进垃圾桶了,不会出到5.X了。而事实上IAR出了这么多版本,编译器的版本变动不多的。
xgbing 2012-08-07
  • 打赏
  • 举报
回复
跟踪看看汇编代码,可能是优化了。
seedundersnow 2012-08-07
  • 打赏
  • 举报
回复
这样访问的变量最好定义成"volatile"
dceacho 2012-08-06
  • 打赏
  • 举报
回复

同意上面的,应该是优化导致的

uchar b=1;
改成
volatile uchar b=1;
应该就可以了
billowtust 2012-08-06
  • 打赏
  • 举报
回复
把优化级别调低一些

如果不愿意调低优化级别,试试在变量前面加上 volatile
lbing7 2012-07-31
  • 打赏
  • 举报
回复
如果非要解释,从语法上解释不通

只能说是编译器的优化。。。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧