打印
[STM8]

进来看看这段神奇的代码

[复制链接]
2161|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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;
沙发
香水城| | 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 (26.09 KB )

Image0309.JPG

使用特权

评论回复
5
香水城| | 2011-7-1 10:12 | 只看该作者
请问函数GPIO_ReadInputPin()返回值的可能范围是多少? 如果不是0或1,你的结果就不奇怪。

使用特权

评论回复
6
helongdm| | 2011-7-1 18:15 | 只看该作者
看不起菜鸟 5# 香水城   

使用特权

评论回复
7
香水城| | 2011-7-1 18:28 | 只看该作者
看不起菜鸟 5# 香水城   
helongdm 发表于 2011-7-1 18:15


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

估计是后者,:lol

使用特权

评论回复
8
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;
}
不用加大括号吗?
呵呵,我才是菜鸟

使用特权

评论回复
9
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在初始化时已经清零了
}

使用特权

评论回复
10
helongdm| | 2011-7-2 15:23 | 只看该作者
当然我是菜鸟啊  我发的帖子请教   某版主说不会看程序    7# 香水城

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

241

主题

1609

帖子

1

粉丝