我正在使用通过CCS编程的PIC 18F2550做几件事。问题的根源在于,我的一个中断处理了一个我经常需要处理的方程,并且控制了多个变量。该方程式过程涉及类型转换,它以 int16 作为输入变量,其结果是一个 int8 变量。这个过程花费的时间太长,并且减慢了我的其他打扰,导致了一些问题。
如何在不影响其准确性的情况下尽可能地加快此功能?
void dynamicControl(){
refDelta = phRef - procSignal[0]; //all 3 are int16 variables.
int16 prOffset = procSignal[1] - 500; //Their values will change on every iteration
int16 _fixed(2) calcVar; //Tried using float and double here but with no success.
if (refDelta < 0) {
risePr = TRUE; dropPr = FALSE;
calcVar = ((int16 _fixed(2))prOffset / 65.00) * (int16 _fixed(2))(4 - refDelta) + 1;
nValPuls = (int8)calcVar;
} else if(refDelta > 0){
risePr = FALSE; dropPr = TRUE;
nValPuls = (refDelta - 1);
} else {
risePr = dropPr = FALSE;
nValPuls = 0x00;
}
if (refDelta < 10){
calcVar = ((int16 _fixed(2))prOffset / 100.00) * (int16 _fixed(2))(5 - refDelta) * 0.70 + 18.00;
pumpDutyLock = (int8)calcVar;
if(pumpDutyLock > 30) pumpDutyLock = 30;
} else { pumpDutyLock = 0x00; }
}
下面是使我的代码变慢的4行代码。如果我全部评论,该功能将以良好的速度运行。
calcVar = ((int16 _fixed(2))prOffset / 65.00) * (int16 _fixed(2))(4 - refDelta) + 1;
nValPuls = (int8)calcVar;
calcVar = ((int16 _fixed(2))prOffset / 100.00) * (int16 _fixed(2))(5 - refDelta) * 0.70 + 18.00;
pumpDutyLock = (int8)calcVar;
我意识到类型转换在这里花费了很长时间,我尝试为 calcVar 使用 float 或 double 而不是 int16 _fixed(2),没有进度。
编辑:经过进一步的研究,我发现,如评论所述,这些操作大多数都需要至少50 us来完成,这意味着我的问题无法通过修改方程式来解决。我已将大多数计算转移到系统的PC端。