¿Dónde poner cálculos?¿Dentro de la interrupción del controlador o el bucle principal?(aplicación en tiempo real incorporada)

StackOverflow https://stackoverflow.com//questions/9609882

Pregunta

Estoy desarrollando una aplicación integrada para el control del motor y tengo dudas sobre qué con algunos cálculos que transforman los valores numéricos ADC en valores físicos firmados (AMPS).

¿Debo hacer los cálculos en el manejador de interrupciones o debería usar el manejador para establecer una bandera global y hacer los cálculos en el bucle principal cuando se ha establecido la bandera?

Gracias de antemano.

¿Fue útil?

Solución

No hay una respuesta de un solo tamaño para esto.Depende de sus requisitos de tiempo, la carga de interrupción existente, etc.

Si es bastante simple multiplicar o algo así, entonces lo haría en la interrupción y seguir adelante.

Solo asegúrese de saber qué está haciendo y no gaste más tiempo en su interrupción de lo que debe.

Otros consejos

El trabajo menos que puede hacer en su controlador de interrupciones, mejor.En este momento, es posible que no sea un gran problema para su solicitud, pero pasará un momento en que la carga de su sistema sea mayor y no querrá contener otras tareas de mayor prioridad para manejar las interrupciones.Es posible que desee mirar a los semáforos y el multithreading adecuado en lugar de simplemente establecer banderas globales.

Depende de lo que quiera hacer con los valores de ADC, y qué tan rápido debe hacerlo. Si necesita tomar alguna acción crítica en el tiempo basada en los valores de ADC, debe lidiar con eso en la interrupción. Sin embargo, si este es el caso, para ahorrar el gasto de calcular primero el valor analógico "real" de los conteos de ADC, debe expresar sus umbrales críticos en términos de los conteos de ADC.

Por ejemplo, si su ADC sale 8 cuentas por voltio, y necesita disparar una parada de emergencia si el ADC reporta más de 1,5 voltios, escribe su código de interrupción para disparar la E-STOP a las 12 cuentas. Luego, aún así podría pasar los recuentos de ADC al bucle principal para traducir en unidades fáciles de usar para fines de la interfaz de usuario, etc.

El principio general es que para garantizarle puede cumplir con sus plazos, estructure su solicitud y cualquier configuración para que sea lo más fácil posible para cumplir con esos plazos. Si algo no tiene una fecha límite difícil, colóquela en el bucle principal (nuevamente, en general).

Una cosa en la que pensar es la consistencia de los datos.Si está recibiendo varios valores relacionados de la ADC (posición, voltaje, corriente, etc.), es posible que desee hacer algo para asegurarse de que está trabajando con un conjunto consistente.Esto puede significar que una actualización de fondo es mejor que una actualización en la ISR.Incluso la consistencia de una sola lectura para una pasada dada del algoritmo puede ser importante.Considere este código de fondo.

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top