¿Cómo puedo alcanzar un tercer nivel de prioridad de interrupción en 8052?

4

La mayoría de las plataformas 8052 estándar permiten que el usuario configure las interrupciones según dos posibles prioridades: mayor, durante la cual cualquier interrupción pendiente debe esperar, y menor, que puede ser interrumpida por las interrupciones de nivel superior, pero las interrupciones de nivel inferior pueden esperar.

Ahora, si tiene que realizar un trabajo dentro de la interrupción que lleva algún tiempo, no es absolutamente crítico en el tiempo y puede ser interrumpido por otras interrupciones, el método habitual es eliminar los datos que la interrupción recopiló en una búfer, establezca una marca que indique la gestión de un trabajo pendiente, y luego deje que el bucle principal llegue a una comprobación de la bandera y realice esa tarea.

Sin embargo, hay un truco que permite ahorrar algo de tiempo y ejecutar el trabajo directamente desde el vector de interrupción, pero a la prioridad del bucle principal, interrumpible por ambos niveles de interrupción, creando esencialmente un tercer nivel de interrupción, debajo de los dos existentes. niveles.

¿Cómo se logra esto?

    
pregunta SF.

1 respuesta

3

Aquí está el truco:

  • Configura su "interrupción de prioridad extra baja" como una interrupción de pri baja baja normal: configure el vector, active la interrupción, todas las cosas estándar.
  • Escriba el procedimiento del controlador en una dirección arbitraria como de costumbre. Se aplican restricciones de interrupción estándar: guardar / restaurar registros, disciplina de pila, etc. Termínelo con RET, no con RETI.
  • En la dirección del vector de interrupción realice tres operaciones:
    • presione el byte más bajo de la dirección de su controlador
    • empuje el byte más alto de la dirección de su controlador
    • RETI

De esta manera, se borra el indicador de interrupción y se reanuda la ejecución normal, pero no desde la dirección donde ocurrió la interrupción, sino desde el vector del controlador. Puede realizar el resto de la actividad de interrupción y luego simplemente reanudar el bucle principal desde donde se interrumpió al realizar un RET estándar: la dirección almacenada por la interrupción en la pila sigue ahí.

    
respondido por el SF.

Lea otras preguntas en las etiquetas