如何最小化代码大小?

时间:2014-04-16 12:04:28

标签: c memory optimization arduino

我的记忆存在问题。是否可以减少此函数中已编译程序的内存?

使用时间变量{hh,mm,ss.0}进行一些计算,并返回取决于当前进度的时间(millis)(_SHOOT_COUNT)

https://www.dropbox.com/s/vigtrot4exqnws1/easing.jpg

(说明结果的图片)

感谢您的任何建议!

unsigned long hour_koef=3600000L;
unsigned long min_koef=60000;

unsigned long timeToMillis(int* time)
{
  return (hour_koef*time[0]+min_koef*time[1]+1000*time[2]+100*time[3]);
}

float Func1(float x)
{
  return (x*x)/(x*x+(1-x)*(1-x));
}

float EaseFunction(byte percent,byte type)
{
  if(type==0)
    return Func1(float(percent)/100); 
}


unsigned long DelayEasyControl()
{

  long dd=timeToMillis(D1); 
  long dINfrom=timeToMillis(Din);
  long dOUTto=timeToMillis(Dout);
  if(easyINmode==0 && easyOUTmode==0) return dd;
  if(easyINmode==1 && easyOUTmode==0)
  {
    if(_SHOOT_COUNT<duration) return (dINfrom+(dd-dINfrom)*EaseFunction(_SHOOT_COUNT*100/duration,0));
    else return dd;
  } 
  if(easyOUTmode==1)
  {
    if(_SHOOT_COUNT>=_SHOOT_activation && _SHOOT_activation!=-1)
    {   
      if((_SHOOT_COUNT-_SHOOT_activation)<current_settings.delay_easyOUT_duration) return (dOUTto-(dOUTto-dd)*(1-EaseFunction((_SHOOT_COUNT-_SHOOT_activation)*100/duration,0)));
      else return dOUTto;
    } 
    else 
    {
      if(easyINmode==0) return dd;
      else if(_SHOOT_COUNT<duration) return (dINfrom+(dd-dINfrom)*EaseFunction(_SHOOT_COUNT*90/duration,0));
      else return dd;
    }
  }
}

2 个答案:

答案 0 :(得分:4)

您提到要优化的代码大小,以及您在Arduino克隆上执行此操作(基于ATmega32U4)。

那些控制器不具备浮点硬件支持,因此所有控制器都将在软件中模拟,这会占用大量代码。

尝试重新编写它来进行定点运算,这样就可以节省大量的代码空间。

您可能会通过优化其他数据类型看到微小的收益,即uint16_t而不是long可能足以满足某些值,将标记函数标记为inline可以保存所需的指令做跳。当然,编译器可能已经在内联。

答案 1 :(得分:0)

大多数编译器都有优化大小的选项,请先尝试一下。如果结果仍然不符合您的需要,请尝试重写程序。我不知道你的程序是否大量使用浮点数学,但你可以像@unwind那样使用定点。如果您的编译器有一个24位浮点类型的选项,如某些8051或PIC编译器,你可以牺牲一些精度,你可以试试。它可能有助于减少代码大小。

另外,在函数Func1中,您应该将x*x1-x存储到变量中,而不是像(x*x)/(x*x+(1-x)*(1-x))

那样计算两次