Я использую 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 операций, что означает, что моя проблема не может быть решена путем изменения уравнения.Я прибег к передаче большей части вычислений на компьютерную часть системы.