tomsu
驱动牛犊
驱动牛犊
  • 注册日期2005-07-27
  • 最后登录2006-02-17
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2356回复:1

我的程序单步运行正常,全速运行跳过了很多函数,直接向下运行了?

楼主#
更多 发布于:2005-08-05 11:47
  这些被跳过的函数是51读写24c64的函数,以写函数为例,原型为
bit I2C_WriteByte(uchar addr1,uchar addr0,uchar savedata);

用if把第一个写函数包含起来如:
if(I2C_WriteByte(0x00,0x01,OffTime))DisplayError();
它能被全速运行,注意必须是首次调用就被包含,之后可不用被if包含,
否则如果第一个被直接调用如:
I2C_WriteByte(0x00,0x01,OffTime);
全速运行时就被跳过了向下执行(所谓的跑飞?),但是单步运行正常
可以说明函数体没有错误,是被编译器优化了吗?我的UV2优化程度
是2 data overlaying ,参数offtime是用volatile声明的全局变量。

暂时我的解决办法是用if()把首次被调用的函数括起来,但是我很想知道
为什么会这样,
请教老虾给予我们虾米们指点,谢谢
tomsu
驱动牛犊
驱动牛犊
  • 注册日期2005-07-27
  • 最后登录2006-02-17
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-08-05 16:16
我自己发现问题所在了
原来是因为每次读或写24c64,要等一个ack才能进行下次读写。
我没有等待,所以读写不进去。
以前的main()中读写I2C的部分如下:
main()
{
                I2C_WB(0x00,0x00,OnTime);      
       I2C_WB(0x00,0x01,OffTime);              
       I2C_WB(0x00,0x02,I2C_Counter[0]);
       I2C_WB(0x00,0x03,I2C_Counter[1]);      
       I2C_RB(0x00,0x00,&OnTime);
       I2C_RB(0x00,0x01,&OffTime);
       I2C_RB(0x00,0x02,&I2C_Counter[0]);
       I2C_RB(0x00,0x03,&I2C_Counter[1]);
}
改成
main()
{
                while(!I2C_WB(0x00,0x00,OnTime));      
       while(!I2C_WB(0x00,0x01,OffTime));              
       while(!I2C_WB(0x00,0x02,I2C_Counter[0]));
       while(!I2C_WB(0x00,0x03,I2C_Counter[1]));      
       while(!I2C_RB(0x00,0x00,&OnTime));
       while(!I2C_RB(0x00,0x01,&OffTime));
       while(!I2C_RB(0x00,0x02,&I2C_Counter[0]));
       while(!I2C_RB(0x00,0x03,&I2C_Counter[1]));
}
就万事大吉了。
唉!像我这么菜的虾米们,可以以此为鉴。
游客

返回顶部