标题: C语言while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))条件未满足还是退出了 [打印本页]

作者: 家星    时间: 2021-5-10 08:31
标题: C语言while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))条件未满足还是退出了
  1. while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))
  2.                         {
  3.                         
  4.                                 Phase_time++;
  5.                                 delay_ms(1);               
  6.                                 if(Phase_time>=15)
  7.                                 {
  8.                                         Phase_A_err++;   //错误累加
  9.                                         Phase_time=0;    //清零
  10.                                 }
  11.                                 if(Phase_A_err>3)
  12.                                 {
  13.                                         Phase_Error_flag=2;//A缺相        
  14.                                         Phase_A_err=0;
  15.                                         break;               
  16.                                 }
  17.                                 Phase_Error_flag=0;
  18.                         }        
复制代码



遇到的问题:
PC4的电平是外部输入的,

我的设想,while循环内,只要PC4的电平还是高电平,就一直在循环内跑,每过1毫秒,Phase_time这个标志位+1,当Phase_A_err>3才会break退出循环,现在我单步调试执行,发现if(Phase_A_err>3)这个条件都不满足,就直接进入到break这行,同时前两行Phase_Error_flag=2;//A缺相        
                                        Phase_A_err=0;也直接跳过


其他发现:
当我在不直接写while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)),而是先           test_temp=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);
            while(test_temp){}

这个程序又能正确执行。
实在想不通是什么原因,请大家帮忙分析分析,谢谢

作者: xstong    时间: 2021-5-10 09:09
粗心大意,while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))  不等价 test_temp=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);   while(test_temp){}
作者: 黄youhui    时间: 2021-5-10 09:35
4 最重要的一点,其实的while()根本就没进去,至于为何会直接跳到break,可能是代码优化的结果,进去后直接break和没进去是一个效果。
4 最重要的一点,其实的while()根本就没进去,至于为何会直接跳到break,可能是代码优化的结果,进去后直接break和没进去是一个效果。
4 最重要的一点,其实的while()根本就没进去,至于为何会直接跳到break,可能是代码优化的结果,进去后直接break和没进去是一个效果。


1 外部输入的信号,共地了吗?
2 while()里面很少会放函数的,因为函数返回值可能是一个整数也可能是一个地址
3 你的全局变量初始化了吗?如果没有初始化,他们可以是任意值。


作者: 家星    时间: 2021-5-10 10:23
黄youhui 发表于 2021-5-10 09:35
4 最重要的一点,其实的while()根本就没进去,至于为何会直接跳到break,可能是代码优化的结果,进去后直 ...

谢谢回复,我已经查到原因了。因为while内的条件不满足了,所以跳到了break内退出了。因为我通过示波器看过,将输入线拔掉后,IO口的电平始终是高的,所以想不通while为什么会退出,后来我发现PC4的电平在1和0之间变化,现在我怀疑是硬件坏了或是别的原因,我自己再查查。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1