我的内存力有些问题。是否可以在这个函数中减少编译程序的内存?
它使用时间变量 {hh,mm,ss.0}
进行一些计算,并根据当前进度 (_SHOOT_COUNT) 返回时间(以
)millis
为单位)
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;
}
}
}
最佳答案
您提到您要优化的是代码大小,并且您正在 Arduino 克隆(基于 ATmega32U4)上执行此操作。
那些 Controller 没有对 float 的硬件支持,所以都将在占用大量代码的软件中模拟。
尝试重写它来做定点运算,这样你会节省很多代码空间。
通过优化其他数据类型,您可能会看到一些小的 yield ,即 uint16_t
而不是 long
可能足以满足某些值,并将函数标记为 inline
可以保存跳转所需要的指令。当然,编译器可能已经内联了。
关于c - 我怎样才能最小化这个程序的代码大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23108950/