Regresando de las interrupciones a una ubicación diferente de donde ocurre la interrupción. (PIC16F877A)

1

¿Hay alguna manera de regresar de las interrupciones en una ubicación diferente a la que ocurrió en Microchip PIC16F877A?

Tengo un problema donde necesito que mi código se reinicie en un punto específico, siempre se produce una interrupción externa y el ISR acaba de finalizar.

Estoy pensando en usar las instrucciones de ensamblaje en línea en mi código C para obtener la dirección que deseo devolver y para cambiar la parte superior de la pila a esa dirección, pero supongo que el PIC16F877A no lo admite.

    
pregunta

2 respuestas

3

Tienes razón, los PIC antes de PIC18 no permitían cambiar la parte superior de la pila.

Usted está haciendo una de las preguntas clásicas que me han hecho evitar los PIC, y especialmente todo lo anterior a PIC18, como la plaga proverbial. pila de PIC de wikipedia

Es una cosa perfectamente normal que hacer, siempre que entiendas lo que estás haciendo y no sea ilógico. Es un mecanismo central para los sistemas operativos multitarea o de proceso múltiple.

La razón normal para hacer algo así es hacer un cambio de contexto del sistema operativo (OS). Esto permitiría al software crear la ilusión de muchos procesos concurrentes. Cuando se ha reparado una interrupción, es posible que el sistema operativo no quiera volver al proceso interrumpido, sino que deba ejecutar un fragmento de código diferente. Parte del mecanismo es cambiar el puntero de pila a la pila de un proceso diferente, y luego ejecutar el retorno desde la interrupción.

Consulte AN818 que manipula la pila del microcontrolador PIC18 para saber cómo cambiar la dirección de devolución. Tenga en cuenta que es un documento PIC18.

Lamentablemente, AFAICT dice que PIC no es capaz de hacer eso.

Una técnica alternativa inferior es hacer que el bucle de control principal verifique una variable para detectar cuándo necesita salir y ejecutar ese otro código.

¿Hay alguna forma de forzar un RESET?

    
respondido por el gbulmer
1

No, lo que estás pidiendo es imposible e ilógico.

Sería como cambiar de carril en una autopista y luego volver al primer carril pero querer estar a 25 millas de distancia viajando en la otra dirección. Simplemente no va a suceder a menos que cambie las leyes de la física o cree un agujero de gusano, y confíe en mí, no quiere hacer eso.

Una interrupción es exactamente como suena: interrumpe el flujo normal del programa para realizar algunas operaciones, luego se reanuda el flujo normal del programa. La interrupción no tiene control directo sobre el flujo del programa; todo lo que puede hacer es modificar las variables que su programa principal podría examinar para ver si es necesario reiniciar.

Otra analogía sería que estás trabajando en tu escritorio escribiendo una carta. El teléfono suena y te interrumpe. Tu lo respondes Cuando cuelgas el teléfono, todavía estás en tu escritorio con la carta frente a ti. Bajar el teléfono no puede teletransportarlo al baño.

Para obtener más información, una rápida lectura de la hoja de datos proporciona todas las pruebas que necesita para saber que es imposible:

  

La familia PIC16F87XA tiene una profundidad de 8 niveles x 13 bits   Amplia pila de hardware. El espacio de pila no es parte de   programa o espacio de datos y el puntero de pila no es   legible o escribible. La PC está PUSHed en la pila   cuando se ejecuta una instrucción CALL, o una interrupción   causa una rama La pila es POP'ed en el caso de una   RETURN, RETLW o una ejecución de instrucciones RETFIE.   PCLATH no se ve afectado por una operación PUSH o POP.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas