¿Hay alguna manera de mejorar este ISR - STM32F401RE?

1

Actualmente estoy codificando un controlador de vuelo desde cero y actualmente estoy trabajando en el módulo para decodificar la señal PPM entrante. Teniendo en cuenta que este es un ISR, solo he limitado su funcionalidad para leer los valores del canal de mi receptor. Está funcionando totalmente bien, pero quería algunos comentarios y mejoras en el mismo (si es posible). El ISR es el siguiente:

    void measureChannel(){
   int elapsedTime = t.read_us();
          //if any pulse shorter than 1000us, discard as garbage
   if(elapsedTime < 900){
        t.reset();
        return;
    }

  else{ 
        //if start/stop sequence, then set currentChannel = 1 and begin to read
        if(elapsedTime > 2100) {
                currentChannel = 1;
                t.reset();
                return;
            }
        //read channel value
        else if(elapsedTime >= 1000 && elapsedTime <= 2000){
                if(currentChannel == 1){
                        channelVal[0] = elapsedTime;
                        currentChannel = 2;
                        t.reset();
                        return;
                    }

                else if(currentChannel == 2){
                        channelVal[1] = elapsedTime;
                        currentChannel = 3;
                        t.reset();
                        return;
                    }

                else if(currentChannel == 3){
                        channelVal[2] = elapsedTime;
                        currentChannel = 4;
                        t.reset();
                        return;
                    }

                else if(currentChannel == 4){
                        channelVal[3] = elapsedTime;
                        currentChannel = 5;
                        t.reset();
                        return;
                    }

                else if(currentChannel == 5){
                        channelVal[4] = elapsedTime;
                        currentChannel = 6;
                        t.reset();
                        return;
                    }

                else if(currentChannel == 6){
                        channelVal[5] = elapsedTime;
                        currentChannel = 0;
                        t.reset();
                        return;
                    }
            }
      } 
}

Las variables globales relevantes y varias instancias se inicializan de la siguiente manera:

    Timer t;
    InterruptIn ppmPin(PB_5);
    uint16_t channelVal[6];
    uint8_t currentChannel = 1;
    
pregunta BabaYaga

1 respuesta

0
  • las declaraciones de devolución no son necesarias

  • para mayor claridad, es mejor usar algunas matrices para minimizar el código

La parte del valor del canal de lectura se puede escribir como:

  //read channel value
  else if(elapsedTime >= 1000 && elapsedTime <= 2000)
  {
       if((currentChannel >= 1) && (currentChannel <= 6)) 
       {
             channelVal[currentChannel - 1] = elapsedTime;
             currentChannel = (currentChannel + 1) % 7;
       }
  }
    
respondido por el Michel Keijzers

Lea otras preguntas en las etiquetas