首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

keil c 程序乱跳不能设置断点,该怎么解决

2013-01-27 
keilc程序乱跳不能设置断点以下为C语言程序,IIC中断处理当I2C0-I2CSTATUS 的值为0x20时不能跳到0x20处并

keil c 程序乱跳不能设置断点
以下为C语言程序,IIC中断处理   
当I2C0->I2CSTATUS 的值为0x20时不能跳到0x20处
并且在0x20处不能设置断点   好悲剧,求指导
看图片, 值为0x8但是他执行完0x8后 有去执行别的!!!! 

keil  c  程序乱跳不能设置断点,该怎么解决


void I2C0_IRQHandler(void)
{
switch(I2C0->I2CSTATUS)
{
case 0x00: 
  {
  I2C0-> I2CON |= 0x1<<4;  // 发送停止
  break;
  }
case 0x08: //发送了起始,应该发送地址+W
  {
  I2C0-> I2CDAT = address ;
  }
  break;  
    case 0x10: //主机发送了重起,应该发送地址+R/W
    {
  if(R_W)
  I2C0-> I2CDAT = address|0x1 ;
else
I2C0-> I2CDAT = address ;
    }
     break;
case 0x18: //主机发送了地址和W,应该写数
    {
  if(data_count==0 )
I2C0-> I2CON |= 0x1<<4;  // 发送停止
else
{
  I2C0-> I2CDAT = *data;
data_count--;
data++;
}
    }
     break;
   case 0x20: //主机发送了地址+R/W,接收到NAK, 可以重启,或者停止
    {
  I2C0-> I2CON |= 0x3<<4;  // 发送停止和重启
data=data_backup;
data_count= data_count_backup;
    }
     break;
case 0x28: //主机发送了数据,接收到了ACK, 接着传输数据,或者发送停止
    {
  
  if(data_count==0 )
I2C0-> I2CON |= 0x1<<4;  // 发送停止
else
{
  I2C0-> I2CDAT = *data;
data_count--;
data++;
}
    }
     break;
case 0x30: //主机传送了数据,接收到了NAK, 可以重启,或者停止
    {
  I2C0-> I2CON |= 0x3<<4;  // 发送停止和重启
data=data_backup;
data_count= data_count_backup;
    }
     break;
case 0x40: //主机发送了 地址+R,接收到了ACK, 准备接收数据
    {
  if(data_count==0 )
I2C0-> I2CON |= 0x1<<4;  // 发送停止
else
{
I2C0-> I2CON |= 0x1<<2;  // 准备ACK
  *data = I2C0-> I2CDAT;
data_count--;
data++;
}
    }
     break;
case 0x48: //主机发送了 地址+R,接收到了NAK, 可以重启,或者停止
    {
  I2C0-> I2CON |= 0x3<<4;  // 发送停止和重启
data=data_backup;
data_count= data_count_backup;
    }
     break;
case 0x50: //主机接收到了数据,发送了ACK, 准备接收数据,发送ACK或NAK
    {
  if(data_count==1 )
{
I2C0-> I2CON &= ~(0x1<<2);  // 准备NAK
*data = I2C0-> I2CDAT;


}
else
{
I2C0-> I2CON |= 0x1<<2;    // 准备ACK
  *data = I2C0-> I2CDAT;
data_count--;
data++;
}
    }
     break;
case 0x58: //主机接收了数据,发送了NAK, 可以重启,或者停止
    {
  I2C0-> I2CON |= 0x1<<4;  // 发送停止
    }
     break;

}
//清除中断标志位
I2C0-> I2CON |=  0x1<<3;
}


[解决办法]
引用:
引用:出现这种情况一般是优化导致的,你把优化关掉就正常了.
以前也碰到过,后来自己研究了下,发现逻辑上优化后的确和仿真走的步骤是一样

我怎么样查看逻辑优化,或我怎么样进行逻辑优化,我想看看

菜单/项目Project/Options for xxx/"C/C++"/Optimization项
你改成Level0(O-0)就是不优化
[解决办法]
学习一下,然来优化确实会导致这样的问题,虽然早也知道,但还从来没遇到过。

看描述还以为遇到了和我之前一样的问题。现象很像,发现运行时的流程和代码逻辑不一致,都觉得C语言不可靠了,起先也认为是优化导致的,后来关了全部的优化也还是一样。最后发现那是ADS1.2的一个bug,用另外的方式解决了。

热点排行