标题: keil c 变量最大值溢出问题 [打印本页]

作者: 天方夜弹    时间: 2020-10-29 22:13
标题: keil c 变量最大值溢出问题
本帖最后由 天方夜弹 于 2020-10-30 20:53 编辑

麻烦各位了,我没说清楚,我贴上原程序,请各位指教,谢谢您们
unsigned int pulse_fr_proces()                 //中断0,1脉冲数*AD系数 再+
{        
         unsigned int  ch1_frl;
        unsigned long ch1_data;       

        ch1_data =  ch1_num  *  GET_ADC_RESULT(0xC0);            // 问题在调用这个函数GET_ADC_RESULT(0xC0)
        ch1_fr   = (unsigned int)(ch1_data * 5 / motor_coef) ;  //          
        if ( ch1_fr   >1800)    ch1_fr   =1800;
               return           ch1_fr;
}
从程序运行看,调用这个函数GET_ADC_RESULT(0xC0)后,最大值限制失效,但GET_ADC_RESULT()函数单独测试正常,被调用后也正常,但就是最大值限制失效,
在这个pulse_fr_proces(),不用这个GET_ADC_RESULT()函数最大值限制就正常,

把GET_ADC_RESULT()换成其它变量也OK,但程序必须要用这个啊

作者: zhb2004xp    时间: 2020-10-29 23:47
程序一直在下面这个语句中循环,这是个死循环啊?
while(1)
  a++;
不知道你这个程序需要达到什么目的,可以参考下面的语句
while(a<=250)  //如果a<=250,则循环执行a++,a>250,则跳出继续向下执行
  a++;
a=200;
作者: f556    时间: 2020-10-29 23:51
程序改成这样
       unsigned char a;
       while(1)
{
       a++;
      if (a>250)  a=200;
}
你原程序的while(1)只对a++;起作用的。不会执行if
作者: 心有浮生    时间: 2020-10-30 08:55
不加花括号,默认是只执行下一句
作者: 菜鸟yc    时间: 2020-10-30 09:27
回头去看下C语言的while循环语句吧
作者: hejianmin    时间: 2020-10-30 09:36
多打几个字符,有那么难吗"{}
作者: 天方夜弹    时间: 2020-10-30 11:02
麻烦各位了,我没说清楚,我贴上原程序,请各位指教,谢谢您们
unsigned int pulse_fr_proces()                 //中断0,1脉冲数*AD系数 再+
{        
    unsigned int  ch1_fr,ch2_fr,ch_fr_all;
        unsigned long ch1_data,ch2_data;       
        ch1_data =  ch1_num  *  GET_ADC_RESULT(0xC0);            //
        ch1_fr   = (unsigned int)(ch1_data * 5 / motor_coef) ;  //
        ch2_data =  ch2_num  *  GET_ADC_RESULT(0xC1);                   //
        ch2_fr   = (unsigned int)(ch2_data * 5 / motor_coef) ;
        ch_fr_all =  ch1_fr + ch2_fr;  //总数                  
        if ( ch_fr_all>1800)    ch_fr_all=1800;
    return           ch_fr_all;
}
从程序运行看,ch_fr_all 数值输入过大会溢出,又从零开始运行
作者: 天方夜弹    时间: 2020-10-30 11:21
zhb2004xp 发表于 2020-10-29 23:47
程序一直在下面这个语句中循环,这是个死循环啊?
while(1)
  a++;

麻烦您再给瞧瞧 变量最大值溢出问题 ,谢谢
作者: 天方夜弹    时间: 2020-10-30 11:22
f556 发表于 2020-10-29 23:51
程序改成这样
       unsigned char a;
       while(1)

蛮烦您再瞧瞧 变量最大值溢出问题  谢谢
作者: T_Trigger    时间: 2020-10-30 12:02
一个int最大256不够,再加一个int做前一个数据的进位呗,,,
作者: 天方夜弹    时间: 2020-10-30 12:11
T_Trigger 发表于 2020-10-30 12:02
一个int最大256不够,再加一个int做前一个数据的进位呗,,,

输入脉冲处理后 测试ch_fr_all只要超过2000,下段程序就会溢出。所以我想把ch_fr_all限制在1800以内。
uint 最大值是65535啊。
作者: qqb    时间: 2020-10-30 14:14
你忘记加大括号了
作者: univers    时间: 2020-10-30 16:47
这样写才对的

unsigned char a;
       while(1)
  {
       a++;
      if (a>250)
           {
        a=0;
           }
    }


作者: 天方夜弹    时间: 2020-10-30 20:48
我没说清楚,贴上简化后的原程序

unsigned int pulse_fr_proces()                 //中断0,1脉冲数*AD系数 再+
{        
                 unsigned int  ch1_frl;
        unsigned long ch1_data;       
        ch1_data =  ch1_num  *  GET_ADC_RESULT(0xC0);            // 问题在调用这个函数GET_ADC_RESULT(0xC0)
        ch1_fr   = (unsigned int)(ch1_data * 5 / motor_coef) ;  //          
        if ( ch1_fr   >1800)    ch1_fr   =1800;
               return           ch1_fr;
}
问题在调用这个函数 GET_ADC_RESULT(0xC0) 后,程序除了最大值限制无效外,其它都正常
这个函数单独测试是正常的,函数的输出结果也正确,就是最大值限制无效




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