4 votos

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

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

Ahora, si tienes un trabajo que hacer dentro de la interrupción que lleva algún tiempo, no es absolutamente crítico en cuanto al tiempo, y puede ser interrumpido por otras interrupciones, el enfoque habitual es dejar caer los datos que la interrupción recogió en un búfer, establecer una bandera de que hay el manejo de un trabajo pendiente, y luego dejar que el bucle principal llegue a una comprobación de la bandera, y realizar ese trabajo.

Sin embargo, hay 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 consigue esto?

3voto

Leeor Puntos 269

Este es el truco:

  • Configuras tu "interrupción de prioridad extra-baja" como una interrupción normal de baja prioridad: configuras el vector, activas la interrupción, todo lo estándar.
  • Escriba el procedimiento del manipulador en una dirección arbitraria como de costumbre. Se aplican las restricciones estándar de las interrupciones: guardar/restaurar registros, disciplina de la pila, etc. Termina con RET, no con RETI.
  • En la dirección del vector de interrupción realiza tres operaciones:
    • empujar el byte inferior de la dirección de su manejador
    • empujar el byte más alto de la dirección de su manejador
    • RETI

De esta manera, se borra la bandera de interrupción y se reanuda la ejecución normal, pero no desde la dirección donde se produjo la interrupción, sino desde su vector manejador. Puedes realizar el resto de la actividad de la interrupción y luego simplemente reanudar el bucle principal desde donde se interrumpió realizando un RET estándar - la dirección almacenada por la interrupción en la pila sigue ahí.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X