我的记忆存在问题。是否可以减少此函数中已编译程序的内存?
使用时间变量{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;
}
}
}
答案 0 :(得分:4)
您提到要优化的代码大小,以及您在Arduino克隆上执行此操作(基于ATmega32U4)。
那些控制器不具备浮点硬件支持,因此所有控制器都将在软件中模拟,这会占用大量代码。
尝试重新编写它来进行定点运算,这样就可以节省大量的代码空间。
您可能会通过优化其他数据类型看到微小的收益,即uint16_t
而不是long
可能足以满足某些值,将标记函数标记为inline
可以保存所需的指令做跳。当然,编译器可能已经在内联。
答案 1 :(得分:0)
大多数编译器都有优化大小的选项,请先尝试一下。如果结果仍然不符合您的需要,请尝试重写程序。我不知道你的程序是否大量使用浮点数学,但你可以像@unwind那样使用定点。如果您的编译器有一个24位浮点类型的选项,如某些8051或PIC编译器,你可以牺牲一些精度,你可以试试。它可能有助于减少代码大小。
另外,在函数Func1
中,您应该将x*x
和1-x
存储到变量中,而不是像(x*x)/(x*x+(1-x)*(1-x))