C # CCS PIC - улучшение обработки уравнений - PullRequest
0 голосов
/ 30 сентября 2018

Я использую PIC 18F2550, запрограммированный с CCS, чтобы сделать несколько вещей.Корень моей проблемы в том, что одно из моих прерываний обрабатывает уравнение, которое мне нужно часто обрабатывать, и которое контролирует несколько переменных.Этот процесс уравнения включает в себя приведение типов, он имеет 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;

Я понимаю, что здесь приведение типов занимает много времени, я пытался использовать float или double для calcVar , вместо int16 _fixed (2) , без прогресса.

EDIT: После некоторых дальнейших исследований я обнаружил, что, как указаноСудя по комментариям, большинство из этих операций требуют не менее 50 операций, что означает, что моя проблема не может быть решена путем изменения уравнения.Я прибег к передаче большей части вычислений на компьютерную часть системы.

...