打印

同一个函数,为什么多次调用,堆栈越用越大?

[复制链接]
790|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单片机是MSP430,开发环境是IAR。
一个函数,函数里面没有使用静态变量,多次调用,堆栈一直在增加?
不是应该每次调用后堆栈就释放了么?为什么还会在前一次的基础上增加呢?
求解惑。。
代码见二楼,
我单独把这个函数提出来多次调用运行,结果如下图,(其中unsigned char GUI_Buffer[12]) :



相关帖子

沙发
motoedy|  楼主 | 2014-8-2 08:29 | 只看该作者
/*******************************************
函数名称:Numtostr
功    能:任意数转字符串
参    数:fNum:要显示的数字
         pBuf:保存的字符串数组
         nSize:最大显示长度
        Point_bit:小数点位数
返回值  :无
********************************************/
void Numtostr(unsigned char *pBuf, unsigned char nSize, float fNum,unsigned char Point_bit )
{
  unsigned char i=0;
  unsigned char cursor = 0 ;
  long fNum_temp = 0 ;
  unsigned char Start_Addr=0;                       //起始地址
  
  if(Point_bit!=0)
  {  
    float temp=5;                                //四舍五入补偿
    for(i=(Point_bit+1);i>0;i--)
    {
      temp/=10;
    }
    if(fNum > 0)                                  //正数
    {
      fNum+=temp;
    }
    else if(fNum < 0)                             //负数
    {
      fNum-=temp;
    }
  }
  
  if (fNum < 0)                                 //如果是负数先转换为正数,添加负号
  {
    fNum = 0 - fNum ;
    pBuf[cursor++]= '-';
    Start_Addr=1;
  }
  
  fNum_temp = (long)fNum ;                      //获取整数
  
  if(fNum_temp>=1)                              //1以上的
  {
    while (fNum_temp)                           //取整数各位
    {
      pBuf[cursor++] = (fNum_temp%10)+'0';
      fNum_temp /= 10 ;
    }
   
    char c ;
   
    for(i=Start_Addr; i<((cursor+Start_Addr)/2);i++)//转换高低位
    {
      c = pBuf[i];
      pBuf[i] = pBuf[cursor-1-(i-Start_Addr)];
      pBuf[cursor-1-(i-Start_Addr)] = c ;
    }
  }
  else                                          //0.xxxxx的
  {
    pBuf[cursor++]='0';                         //第一位为0
  }
  if((cursor+1)>=nSize)                      //如果超过显示位数或整数位+1等于最大显示位
  {
    pBuf[cursor] = '\0'  ;                   //小数点不显示,即整数
  }
  else
  {
    if(Point_bit!=0)
    {
      pBuf[cursor++] = '.' ;                      //显示小数点
      
      fNum =fNum-(long)fNum;                      //得到小数部分
      
      i = nSize-cursor ;
      
     Point_bit =((char)Point_bit - (char)i) > 0 ? i : Point_bit;

      while (Point_bit)                         //获取小数,
      {
        fNum *= 10 ;
        pBuf[cursor++] = (unsigned char)fNum+'0';//得到小数各位
        
        Point_bit-- ;
        
        fNum -=(float)((unsigned char)fNum);
      }
    }
    pBuf[cursor] = '\0' ;                      //结束标识符 ;
  }
  pBuf[nSize] = '\0' ;                           //结束标识符
}


使用特权

评论回复
板凳
茫茫大士| | 2014-8-2 14:59 | 只看该作者
局部变量和函数返回信息保存在堆栈里,调用次数越多堆栈肯定在增长

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

74

帖子

4

粉丝