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

2019-08-03 14:51发布

单片机是MSP430,开发环境是IAR。
一个函数,函数里面没有使用静态变量,多次调用,堆栈一直在增加?
不是应该每次调用后堆栈就释放了么?为什么还会在前一次的基础上增加呢?
求解惑。。
代码见二楼,
我单独把这个函数提出来多次调用运行,结果如下图,(其中unsigned char GUI_Buffer[12]) :
bug3.gif


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
motoedy
1楼-- · 2019-08-03 15:56
  1. /*******************************************
  2. 函数名称:Numtostr
  3. 功    能:任意数转字符串
  4. 参    数:fNum:要显示的数字
  5.          pBuf:保存的字符串数组
  6.          nSize:最大显示长度
  7.         Point_bit:小数点位数
  8. 返回值  :无
  9. ********************************************/
  10. void Numtostr(unsigned char *pBuf, unsigned char nSize, float fNum,unsigned char Point_bit )
  11. {
  12.   unsigned char i=0;
  13.   unsigned char cursor = 0 ;
  14.   long fNum_temp = 0 ;
  15.   unsigned char Start_Addr=0;                       //起始地址
  16.   
  17.   if(Point_bit!=0)
  18.   {  
  19.     float temp=5;                                //四舍五入补偿
  20.     for(i=(Point_bit+1);i>0;i--)
  21.     {
  22.       temp/=10;
  23.     }
  24.     if(fNum > 0)                                  //正数
  25.     {
  26.       fNum+=temp;
  27.     }
  28.     else if(fNum < 0)                             //负数
  29.     {
  30.       fNum-=temp;
  31.     }
  32.   }
  33.   
  34.   if (fNum < 0)                                 //如果是负数先转换为正数,添加负号
  35.   {
  36.     fNum = 0 - fNum ;
  37.     pBuf[cursor++]= '-';
  38.     Start_Addr=1;
  39.   }
  40.   
  41.   fNum_temp = (long)fNum ;                      //获取整数
  42.   
  43.   if(fNum_temp>=1)                              //1以上的
  44.   {
  45.     while (fNum_temp)                           //取整数各位
  46.     {
  47.       pBuf[cursor++] = (fNum_temp%10)+'0';
  48.       fNum_temp /= 10 ;
  49.     }
  50.    
  51.     char c ;
  52.    
  53.     for(i=Start_Addr; i<((cursor+Start_Addr)/2);i++)//转换高低位
  54.     {
  55.       c = pBuf[i];
  56.       pBuf[i] = pBuf[cursor-1-(i-Start_Addr)];
  57.       pBuf[cursor-1-(i-Start_Addr)] = c ;
  58.     }
  59.   }
  60.   else                                          //0.xxxxx的
  61.   {
  62.     pBuf[cursor++]='0';                         //第一位为0
  63.   }
  64.   if((cursor+1)>=nSize)                      //如果超过显示位数或整数位+1等于最大显示位
  65.   {
  66.     pBuf[cursor] = ''  ;                   //小数点不显示,即整数
  67.   }
  68.   else
  69.   {
  70.     if(Point_bit!=0)
  71.     {
  72.       pBuf[cursor++] = '.' ;                      //显示小数点
  73.       
  74.       fNum =fNum-(long)fNum;                      //得到小数部分
  75.       
  76.       i = nSize-cursor ;
  77.       
  78.      Point_bit =((char)Point_bit - (char)i) > 0 ? i : Point_bit;

  79.       while (Point_bit)                         //获取小数,
  80.       {
  81.         fNum *= 10 ;
  82.         pBuf[cursor++] = (unsigned char)fNum+'0';//得到小数各位
  83.         
  84.         Point_bit-- ;
  85.         
  86.         fNum -=(float)((unsigned char)fNum);
  87.       }
  88.     }
  89.     pBuf[cursor] = '' ;                      //结束标识符 ;
  90.   }
  91.   pBuf[nSize] = '' ;                           //结束标识符
  92. }
复制代码

茫茫大士
2楼-- · 2019-08-03 18:45
 精彩回答 2  元偷偷看……

一周热门 更多>