C#CCS PIC-增强方程式处理

时间:2018-09-30 20:17:25

标签: c# performance casting pic

我正在使用通过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端。

0 个答案:

没有答案