[STM8] 进来看看这段神奇的代码

[复制链接]
2866|9
 楼主| donkey89 发表于 2011-6-30 10:01 | 显示全部楼层 |阅读模式
本帖最后由 donkey89 于 2011-6-30 10:15 编辑

下面这段代码是用iar编译的,左移4次以后就不会修改了,所以应该不会出现比0x0F大的情况,实际却是一定大于0x0f,本来应该是0x03的,一定会变成0x30,本来应该是0x0a的,一定会变成0xa0,百思不得其解.
更为神奇的是,这段代码不可跟踪,调试到这里iar自动退出.没有二话.即使在函数里面设断点,也一定是停在别的函数里面.
另外,怎么查看对应的汇编?找不到lst文件
  1. uint8_t i2c_read(void)
  2. {
  3.   uint8_t rd =0;
  4.   uint8_t i;
  5.   GPIO_Init(SDIO_PORT,SDIO_PIN,GPIO_MODE_IN_FL_NO_IT);//设置端口为输入
  6.   //SDIO_HIGH;//外部上拉,所以要先设置成高,才可以读端口
  7.   i2c_delay(50);
  8.   for ( i=0;i<8 ;i++ )
  9.   {
  10.     SCLK_LOW;
  11.     i2c_delay(50);
  12.     if(i<4)//只移动4次
  13.       rd<<=1;
  14.     SCLK_HIGH;
  15.     nop();
  16.     nop();
  17.     if(i<4)//只会被修改4次
  18.       rd|=GPIO_ReadInputPin(SDIO_PORT,SDIO_PIN);
  19.    }
  20.   GPIO_Init(SDIO_PORT,SDIO_PIN,GPIO_MODE_OUT_OD_HIZ_SLOW);//恢复端口为输出
  21.   return rd;
香水城 发表于 2011-6-30 10:15 | 显示全部楼层
LZ的描述没有主语:??左移4次以后就不会修改了。
 楼主| donkey89 发表于 2011-6-30 10:37 | 显示全部楼层
当然是rd左移4次以后就不会修改了。
没搞懂,可能iar有bug,断点设在入口自动退出.
现在整个函数重新写了,直接访问寄存器就ok了,不用官方库
CC2530 发表于 2011-6-30 10:39 | 显示全部楼层
看汇编把。或者在汇编代码上调试。

输出汇编:
Image0309.JPG
香水城 发表于 2011-7-1 10:12 | 显示全部楼层
请问函数GPIO_ReadInputPin()返回值的可能范围是多少? 如果不是0或1,你的结果就不奇怪。
helongdm 发表于 2011-7-1 18:15 | 显示全部楼层
看不起菜鸟 5# 香水城   
香水城 发表于 2011-7-1 18:28 | 显示全部楼层
看不起菜鸟 5# 香水城   
helongdm 发表于 2011-7-1 18:15


不明白你的意思。你是说你是菜鸟,我看不起你?还是说我是菜鸟,你看不起我?

估计是后者,:lol
mylovepzq 发表于 2011-7-1 20:35 | 显示全部楼层
本帖最后由 mylovepzq 于 2011-7-1 20:37 编辑

if(i<4)//只移动4次
      rd<<=1;
    SCLK_HIGH;
这个
if(i<4)//只移动4次
   {
   rd<<=1;
    SCLK_HIGH;
}
不用加大括号吗?
呵呵,我才是菜鸟
mohanwei 发表于 2011-7-2 11:10 | 显示全部楼层
这种才是更安全的写法:
if(i<4)//只会被修改4次
{
      if(GPIO_ReadInputPin(SDIO_PORT,SDIO_PIN))//不管返回1/0,还是SDIO_PIN/0都可以兼容
     {
             rd |= 1;
     }//else就不管了,因为该bit在初始化时已经清零了
}
helongdm 发表于 2011-7-2 15:23 | 显示全部楼层
当然我是菜鸟啊  我发的帖子请教   某版主说不会看程序    7# 香水城
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:数显ESR电容等效内阻测量仪 http://cn.digit-esr.com

241

主题

1609

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部