找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1808|回复: 13
收起左侧

keil c 变量最大值溢出问题

[复制链接]
ID:830698 发表于 2020-10-29 22:13 | 显示全部楼层 |阅读模式
本帖最后由 天方夜弹 于 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,但程序必须要用这个啊
回复

使用道具 举报

ID:234075 发表于 2020-10-29 23:47 | 显示全部楼层
程序一直在下面这个语句中循环,这是个死循环啊?
while(1)
  a++;
不知道你这个程序需要达到什么目的,可以参考下面的语句
while(a<=250)  //如果a<=250,则循环执行a++,a>250,则跳出继续向下执行
  a++;
a=200;
回复

使用道具 举报

ID:282850 发表于 2020-10-29 23:51 | 显示全部楼层
程序改成这样
       unsigned char a;
       while(1)
{
       a++;
      if (a>250)  a=200;
}
你原程序的while(1)只对a++;起作用的。不会执行if
回复

使用道具 举报

ID:654028 发表于 2020-10-30 08:55 | 显示全部楼层
不加花括号,默认是只执行下一句
回复

使用道具 举报

ID:711539 发表于 2020-10-30 09:27 | 显示全部楼层
回头去看下C语言的while循环语句吧
回复

使用道具 举报

ID:342954 发表于 2020-10-30 09:36 | 显示全部楼层
多打几个字符,有那么难吗"{}
回复

使用道具 举报

ID:830698 发表于 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 数值输入过大会溢出,又从零开始运行
回复

使用道具 举报

ID:830698 发表于 2020-10-30 11:21 | 显示全部楼层
zhb2004xp 发表于 2020-10-29 23:47
程序一直在下面这个语句中循环,这是个死循环啊?
while(1)
  a++;

麻烦您再给瞧瞧 变量最大值溢出问题 ,谢谢
回复

使用道具 举报

ID:830698 发表于 2020-10-30 11:22 | 显示全部楼层
f556 发表于 2020-10-29 23:51
程序改成这样
       unsigned char a;
       while(1)

蛮烦您再瞧瞧 变量最大值溢出问题  谢谢
回复

使用道具 举报

ID:626055 发表于 2020-10-30 12:02 | 显示全部楼层
一个int最大256不够,再加一个int做前一个数据的进位呗,,,
回复

使用道具 举报

ID:830698 发表于 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啊。
回复

使用道具 举报

ID:166768 发表于 2020-10-30 14:14 | 显示全部楼层
你忘记加大括号了
回复

使用道具 举报

ID:382454 发表于 2020-10-30 16:47 | 显示全部楼层
这样写才对的

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

回复

使用道具 举报

ID:830698 发表于 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) 后,程序除了最大值限制无效外,其它都正常
这个函数单独测试是正常的,函数的输出结果也正确,就是最大值限制无效
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表