IAR 同一个函数在不同的地方调用,其返回值不一样

lailzhihou 2014-03-04 11:48:51
开发工具:IAR;芯片:CC2530;代码:
uint8 SpiReadEth(uint8 addr)
{
uint8 value;
SCL_L;
SCL_DELAY;
CS_L;
SCL_DELAY;
SpiWriteByte(addr);
value = SpiReadByte();
SCL_L;
SCL_DELAY;
CS_H;
SCL_DELAY;
return value;
}
这是一段读取enc28j60网络芯片的代码,在不同的.C文件中调用这个函数,有的地方会返回正确的值,有的地方就不行。
请问这个是什么问题,是不是什么配置不对,或者是代码写得不够规范,在优化的时候,出问题了?
...全文
239 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mangoalx 2014-03-04
  • 打赏
  • 举报
回复
似乎看不出问题来,你SDO_READ宏是怎么定义的? 第二种写法更好,就用他好了
zhxianbin 2014-03-04
  • 打赏
  • 举报
回复
value = value | ((SDO_READ)<<i); value = value << 1; value = value | (SDO_READ); 明显不一样啊,应该下面正确吧
lailzhihou 2014-03-04
  • 打赏
  • 举报
回复
发现跟这里的 uint8 SpiReadByte(void) { int8 i; uint8 value = 0; //¸ßλÏÈÊÕ for(i=7; i>=0; i--) { SCL_L; //À­µÍ½ÓÊÕÊý¾Ý SCL_DELAY; //µÈ´ýÊý¾ÝÏßÎȶ¨ SCL_DELAY; //µÈ´ýÊý¾ÝÏßÎȶ¨ value = value | ((SDO_READ)<<i); SCL_H; SCL_DELAY; SCL_DELAY; //µÈ´ýÊý¾ÝÏßÎȶ¨ } // SCL_L; // SCLĬÈÏʱºò±£³ÖÔÚ L // SCL_DELAY; return value; } 有关系,当使用优化为Low的时候,这个函数在某些地方可以正常运行,但是设定优化等级为其它(None、Medium、High)这个函数就不能正常运行,读取回来的值的最低位始终为1,例如真确的值为0x02,但是读回来的是0x03,正确值为0x03的,读回来也是3。把这个函数改成下面这样后: uint8 SpiReadByte(void) { int8 i; uint8 value = 0; //¸ßλÏÈÊÕ for(i=0; i<8; i++) { SCL_L; //À­µÍ½ÓÊÕÊý¾Ý SCL_DELAY; //µÈ´ýÊý¾ÝÏßÎȶ¨ SCL_DELAY; //µÈ´ýÊý¾ÝÏßÎȶ¨ value = value << 1; value = value | (SDO_READ); SCL_H; SCL_DELAY; SCL_DELAY; //µÈ´ýÊý¾ÝÏßÎȶ¨ } // SCL_L; // SCLĬÈÏʱºò±£³ÖÔÚ L // SCL_DELAY; return value; } 这样读取回来就正常了。而且,不管使用任何的优化方式,都没有问题。 那,这两种写法,有什么区别呢?为什么第一种写法,编译器,似乎认为代码有问题呢?

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧