本帖最后由 donkey89 于 2011-6-30 10:15 编辑
下面这段代码是用iar编译的,左移4次以后就不会修改了,所以应该不会出现比0x0F大的情况,实际却是一定大于0x0f,本来应该是0x03的,一定会变成0x30,本来应该是0x0a的,一定会变成0xa0,百思不得其解.
更为神奇的是,这段代码不可跟踪,调试到这里iar自动退出.没有二话.即使在函数里面设断点,也一定是停在别的函数里面.
另外,怎么查看对应的汇编?找不到lst文件uint8_t i2c_read(void)
{
uint8_t rd =0;
uint8_t i;
GPIO_Init(SDIO_PORT,SDIO_PIN,GPIO_MODE_IN_FL_NO_IT);//设置端口为输入
//SDIO_HIGH;//外部上拉,所以要先设置成高,才可以读端口
i2c_delay(50);
for ( i=0;i<8 ;i++ )
{
SCLK_LOW;
i2c_delay(50);
if(i<4)//只移动4次
rd<<=1;
SCLK_HIGH;
nop();
nop();
if(i<4)//只会被修改4次
rd|=GPIO_ReadInputPin(SDIO_PORT,SDIO_PIN);
}
GPIO_Init(SDIO_PORT,SDIO_PIN,GPIO_MODE_OUT_OD_HIZ_SLOW);//恢复端口为输出
return rd;
|