sakmb 发表于 2012-5-25 20:34:02

不知是不是STC 的一个bug

UINT8 QND_I2C_WRITE(UINT8 Regis_Addr,UINT8 Data)
{
    UINT8 ret=0;
    UINT8 tryCount = I2C_TIMEOUT_COUNT;
    while(--tryCount)
        {
      I2C_Write_1byte(I2C_DEV0_ADDRESS,Regis_Addr,Data);
                qnd_i2c_timeout=0x00;
           if(qnd_i2c_timeout==0x00) break;
                //break;
        }

        if(tryCount)
        {
           ret=0;
    }
        else
        {
                ret=1;
                qnd_i2c = 0;
        }
    return ret;
}


UINT8 QND_I2C_WRITE(UINT8 Regis_Addr,UINT8 Data)
{
    UINT8 ret=0;
    UINT8 tryCount = I2C_TIMEOUT_COUNT;
    while(--tryCount)
        {
      I2C_Write_1byte(I2C_DEV0_ADDRESS,Regis_Addr,Data);
                qnd_i2c_timeout=0x00;
          //if(qnd_i2c_timeout==0x00) break;
             break;
        }

        if(tryCount)
        {
           ret=0;
    }
        else
        {
                ret=1;
                qnd_i2c = 0;
        }
    return ret;
}


为什么以上两个函数运行结果不一样???

philip_0620 发表于 2012-5-25 20:37:33

要看上下文才好分析

sakmb 发表于 2012-5-25 20:44:26

因为这条语句qnd_i2c_timeout=0x00; 所以下面的if(qnd_i2c_timeout==0x00) break;和单独break;意义是一样的,可是运行结果就是不一样Regis_Addr和 Data值在if(qnd_i2c_timeout==0x00) break; 有这个的那段代码被莫名奇妙的修改,不知为何,而单独一个break就没有什么错误,但是我就是需要条件break ,郁闷死了

virginlulu 发表于 2012-5-25 20:48:29

上下文,理顺逻辑啊

BDXing6 发表于 2012-5-25 21:07:34

如果你要找一个芯片的Bug,最基本的前提是你得用最低层的语言。自已做的是什么都搞不清,如何谈Bug。

format 发表于 2012-5-25 21:17:24

兄弟,我没看代码

不过,如果用一个IIC你都说有bug

那不是你奇葩,就是MCU奇葩了

不过,看情形~~~你要奇葩了~~~~

sakmb 发表于 2012-5-25 21:27:40

format 发表于 2012-5-25 21:17 static/image/common/back.gif
兄弟,我没看代码

不过,如果用一个IIC你都说有bug


这话何解?不是iic问题,只不过这两个代码为何就产生不一样的结果?

shamiao 发表于 2012-5-26 00:04:18

看一段代码就轻易怀疑集成电路有BUG,作为开发人员可真不是个好的习惯!哪怕是STC也一样。

这种问题多半是编译器假设了qnd_i2c_timeout的值。在qnd_i2c_timeout定义处加volatile,或者把编译器优化级别调低,不知道结果是不是还一样?

壹佰法拉 发表于 2012-6-2 13:00:34

本帖最后由 壹佰法拉 于 2012-6-2 13:07 编辑

楼主该自己重新检查一下自己的程序;如果你是指红色的代码部分出错误的话就更明显了;
若上面的是个正常的函数的话,你下面一个函数就是错误的;
下面的是将整个判断语句给“屏蔽”了!而且下面一行还露出个尾巴 “break;” 这个尾巴导致无论在任何情况下,你的 while 循环都无条件 跳出;
而上面的你什么都没“屏蔽”;貌似你将 break; 给“屏蔽”了;
可是它上面判断语句的后面还跟着一个 break; 呢!

估计是你自己乌龙了吧!
页: [1]
查看完整版本: 不知是不是STC 的一个bug