Decidiendo el tiempo de interrupción del temporizador

1

He utilizado la interrupción del temporizador en mi aplicación, principalmente por razones de temporización como la detección del tiempo de espera para los procesos, la generación de impulsos, etc., cada 1 ms. Ahora tengo una duda.

Supongamos que en main (), si estoy realizando otra operación como, tal vez al escribir en un Flash SPI una gran parte de los datos, y se produzca la interrupción del temporizador, el proceso de escritura de los datos se detenga debido a la interrupción del ISR del temporizador o los datos se corrompan Debido a la interrupción por temporizador ISR? Me pregunto si el tiempo de interrupción del temporizador se decide considerando las operaciones que conforman el código completo de la aplicación.

Si es así, si una escritura de SPI flash tarda unos 5 ms y la interrupción del temporizador se produce cada 1 ms, ¿cómo puedo realizar un seguimiento de los tiempos de espera, las generaciones de pulsos, etc., sin comprometer los escenarios de corrupción de datos, porque ahora tendré que cambiar la interrupción del temporizador a mayor? de 5 ms, y luego no puedo mantener una referencia de tiempos de espera para procesos donde se pueden necesitar tiempos de espera pequeños como 1 ms.

  

Actualizar

Estoy usando un temporizador de hardware, y cuando ocurra la interrupción, estaré usando un contador de temporizador de software (variable) en el ISR, para mantener un registro del tiempo.

    

3 respuestas

1

Si escribe el código de la línea principal donde se realizan las Escrituras de SPI Flash de la manera adecuada, la aparición de la interrupción del temporizador no debe corromper la operación en curso. Si la operación de la transmisión principal tiene ciertas dependencias de tiempo que deben mantenerse, entonces es necesario deshabilitar las interrupciones durante cortos períodos de tiempo cuando se producen las ventanas de tiempo críticas.

Otra cosa es mantener el código en la interrupción del temporizador muy simple y conciso. No ponga ningún código de decisión real en la rutina del temporizador. En su lugar, hazte una colección de variables de temporizador administradas por software. La interrupción del temporizador simplemente verifica cada una de estas variables y, si no fuera cero, simplemente disminuiría el valor en uno. El código general establecería una o más de estas variables en valores adecuados que no sean cero cuando se necesite un período de tiempo. Luego, en el curso normal de sus operaciones de línea principal, se puede verificar la variable del temporizador para ver si se ha puesto a cero. Por lo tanto, esto puede indicar un tiempo de espera o se ha producido un retraso.

    
respondido por el Michael Karas
1
  

escribir en un SPI Flash una gran cantidad de datos, y la interrupción del temporizador   ¿Se detendrá el proceso de escritura de datos debido a la interrupción por temporizador?   ¿Se dañaron los ISR o los datos debido a la interrupción del temporizador ISR?

De ninguna manera (pero compruebe la hoja de datos de su flash para estar seguro). SPI flash no tiene tiempos de espera, solo límites inferiores en los tiempos. Tienes todo el tiempo del mundo para terminar una escritura o cualquier otra operación. No debe producirse ninguna corrupción de datos siempre que no toque los registros SPI desde su ISR (para los principiantes, más adelante haría un bloqueo).

  

si el tiempo de interrupción del temporizador se decide considerando tales   ¿Operaciones que conforman el código completo de la aplicación?

Por supuesto, siempre debe tomar en cuenta el tiempo que pueda pasar en algún controlador de interrupciones. Si tiene que hacer alguna tarea realmente crítica en el tiempo, puede desactivar las interrupciones por un corto tiempo, simplemente haga lo siguiente

La suma del tiempo máximo empleado en los manejadores de interrupciones, y en cualquier sección crítica (donde las interrupciones están desactivadas) no debe exceder el tiempo entre interrupciones consecutivas del mismo tipo.

De esa forma, seguirá teniendo un control de tiempo preciso y no perderá ninguna interrupción. La mayoría (si no todos) los controladores de interrupción son lo suficientemente inteligentes como para retener una solicitud de interrupción hasta que la CPU pueda procesarla, pero no realizarán un seguimiento de cuántas solicitudes del mismo tipo se han producido sin servicio.

    
respondido por el berendi
0

Además de lo que dijo @berendi, puedes hacer dos cosas.

1) Desactive las interrupciones, justo antes de realizar la transferencia de datos críticos. Y usa el sondeo en su lugar. Suponiendo que está transfiriendo datos desde un búfer, envíe unos 10 marcos de datos (use cualquier número arbitrario aquí) y seleccione el pin de interrupción. Incluso si la interrupción está deshabilitada, se establecerá la bandera, para que pueda aproximarse * al evento sin tener que pausar la transferencia de datos.

2) Mantener la interrupción habilitada. Tenga muy pocas instrucciones dentro del ISR. Un controlador de alta velocidad podrá acomodar procesos muy pequeños entre la transferencia de datos **. Dado que el periférico SPI tomará la carga una vez que vuelvas los datos en el búfer, el procesador tendrá poco tiempo en el medio. Puede acomodar eventos bien calculados. Considere la entrada de interrupción y la latencia de salida, y el tiempo de procesamiento de las instrucciones.

Alternativamente, SI el controlador es compatible con DMA, su problema se puede resolver fácilmente.

* asumiendo que lo haces con la frecuencia suficiente para detectar dos eventos.

** durante las transferencias de datos críticos, se recomienda deshabilitar y habilitar las interrupciones.

    
respondido por el seetharaman

Lea otras preguntas en las etiquetas