这个循环为什么会死掉,原来是因为“Plain Char is Signed”没选中

2019-07-21 02:48发布

u32 SPI_ATT_Read(u8 address)   //返回值的低24位有效
 {
 char i;
  u32 temp_data;
  temp_data = 0;
  SPI_CLK = 0; //CLK 初始状态是 0
  SPI_CS = 0;
  SPI_CLK = 1; //启动数据传输
  SPI_DIN = 0; //0 表示主机向从机读数据
  SPI_CLK = 0; //从机需要在下降沿取数据
  for(i=6; i>=0; i--)
  {
  SPI_CLK = 1; //启动数据传输
  SPI_DIN = (address & (0x01<<i))>>(i);//地址从 0x00 到 0x7F
  SPI_CLK = 0; //从机需要在下降沿取数据
  }
  //无关语句省略
}
    昨天调SPI的读函数,因为硬件老搞不定,就试试用软件摸拟,上面的官方手册的例程,结果调试时总死机,跟踪发现一直在for(i=6; i>=0; i--){}循环里出不来,发现i的值减到0后会变成0XFF,于是条件满足,一直循环,按一般理解,i是有符号的,减到0后再减1应是-1,应会结束循环,当时没时间深究,但感觉应该是编译器的问题,工程是用原子的例程直接改的,编译器选项都没动,今天仔细研究了一下,编译器的C/C++选项里有一条“Plain Char is Signed" 没有选中,这个选项字面意思应该是“默认的字符是有符号的”,把这个选项选中,再调试就可以正常退出循环了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
阿法尔大胡子
1楼-- · 2019-07-21 05:52
 精彩回答 2  元偷偷看……
mthgh0818
2楼-- · 2019-07-21 09:07
0xff就是-1,你把变量改成无符号型的试试
正点原子
3楼-- · 2019-07-21 11:19
谢谢分享..

一周热门 更多>