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

La mayoría de las plataformas 8052 estándar permiten al usuario configurar las interrupciones para que tengan dos posibles prioridades: superior, durante la cual debe esperar cualquier interrupción pendiente, e inferior, que puede ser interrumpida por las interrupciones de nivel superior, pero las interrupciones de nivel inferior pueden esperar.

Ahora, si tiene un trabajo que hacer dentro de la interrupción que lleva algo de tiempo, no es absolutamente crítico en cuanto al tiempo y puede ser interrumpido por otras interrupciones, el enfoque habitual es colocar los datos recopilados por la interrupción en un búfer, establecer un indicador de que está pendiente el manejo de un trabajo, y luego deje que el ciclo principal llegue a un control para el indicador y realice ese trabajo.

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

¿Cómo se logra esto?

Respuestas (1)

Aquí está el truco:

  • Usted configura su "interrupción de prioridad extra baja" como una interrupción normal de baja prioridad: configura el vector, activa la interrupción, todo lo 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. Termine con RET, no RETI.
  • En la dirección del vector de interrupción, realice tres operaciones:
    • empuje el byte inferior de su dirección de controlador
    • empuje el byte más alto de su dirección de controlador
    • RETI

De esa manera, el indicador de interrupción se borra y se reanuda la ejecución normal, pero no desde la dirección donde ocurrió la interrupción, sino desde su vector de controlador. Puede realizar el resto de la actividad de interrupción y luego simplemente reanudar el ciclo principal desde donde se interrumpió realizando un RET estándar: la dirección almacenada por la interrupción en la pila todavía está allí.