ARM cancela la ejecución de las interrupciones anticipadas

1

Parece que no puedo encontrar una respuesta a esto en google o en la guía definitiva ...

¿Es posible desde una interrupción, cancelar el retorno a cualquier interrupción anticipada? Por ejemplo, tengo un ISR que se llama cuando un proceso impulsado por interrupciones necesita ser abortado. Presumiblemente, habré estado en un ISR cuando se active esta interrupción, así que me gustaría restablecer el estado de mi máquina de estados y cancelar la finalización del procesamiento del estado anterior ya que hubo un error. Sé que podría establecer una bandera volátil pero luego necesitaría verificarla constantemente en el código de proceso normal. Preferiría una forma mucho más directa y determinista de cancelar la interrupción anticipada.

Información adicional de los comentarios

Tengo un sistema de 2 procesadores con un bus de comando / control SPI. El esclavo espera un comando del maestro, luego lo ejecuta y envía una respuesta de vuelta. Esto se maneja con algunas señales de handshaking ya que la serie STM32F4 tiene un diseño inútil de hardware CS. El problema que estoy experimentando con mi otra pregunta es que después de algún tiempo, los datos devueltos al maestro desde un comando son un completo disparate (específicamente el último valor recibido por el esclavo x la longitud de transferencia). El maestro es capaz de detectar este error y envía una señal de cancelación. Cuando se reciba, quiero que el esclavo cancele su transferencia DMA / SPI y que su máquina de estado vuelva a esperar un comando. Puedo restablecer la máquina de estado sin problemas, solo quiero asegurarme de que cuando finalice el aborto ISR, no vuelva a continuar con un DMA o USB ISR que ya no es válido.

    
pregunta Jared

2 respuestas

5

Me preocupa que la pregunta implique que hay algo complicado dentro del sistema. ¡Esa complicación puede hacer esto aún más difícil de lo que parece!

Recomiendo probar la la respuesta de Mishyoshi . Se centra en una solución más limpia, menos compleja, más fácil de construir y probar.

Sin embargo, trataré de ofrecer una descripción general de la forma en que se puede realizar el 'aborto' y la rutina de interrupción del servicio, para que la gente pueda juzgar por sí misma.

Desde una perspectiva puramente técnica, es posible 'abortar' una rutina de servicio de interrupción (ISR) 'externa' que a su vez se interrumpió para alcanzar 'esta' rutina de servicio de interrupción '' interna 'en específico Casos, para embebidos (procesadores Cortex-M). Sin embargo, es un poco complicado, tal vez muy difícil de depurar y hacer robusto, y necesitará algunos buenos conocimientos de ensamblador y depuración de hardware.

Una técnica 'simple' se basa en el ISR 'externo' nunca, bajo ninguna circunstancia, llama a ninguna función. Si eso no es una garantía factible, entonces se mucho más difícil. Dicho de otra manera, esto funcionará si y solo si el ISR 'interno' se llama siempre y solo mientras se ejecuta el código dentro del cuerpo del ISR 'externo', y nunca en una función llamada por el 'externo; ISR

También se volverá más complejo si hay dos pilas de procesadores. Todavía es factible, pero más complicado.

Fondo:
Un ARM no no almacena la dirección de retorno de la función en ejecución current o ISR en la pila.

Esa dirección de retorno se almacena en el registro de enlace llamado 'lr' o R14. La única forma de actualizar el registro LR es con el ensamblador. Es posible que IIRC no sea tan fácil como parece, ya que algunos compiladores recargarán LR después de que su ensamblador en línea haya hecho su trabajo, o quizás se queje.

La dirección de retorno de la función externa o ISR está en algún lugar de la pila. Encontrar eso y cargarlo en el LR hará parte del trabajo para abortar el ISR 'externo' cuando el ISR interno regrese.

El otro problema es ordenar la pila y restablecer el puntero de la pila. Si eso no se hace correctamente, el retorno del ISR 'externo' no se puede simular. El efecto puede ser sutil con los cálculos que van mal, los punteros están dañados, los bucles están mal, etc. Esto necesitará habilidades de ensamblador y buenas habilidades de 'depuración de hardware' para asegurarse de que esté probado y funcionando.

Si esto no es exactamente correcto, la memoria de la pila podría "filtrarse".

¿Quieres que continúe, es decir, esto te suena factible para que la gente escriba y elimine errores? Todavía está bastante involucrado, y tengo un ancho de banda limitado.

Recomendaría obtener una copia de La guía definitiva para los procesadores ARM Cortex-M3 y Cortex-M4 de Joseph Yiu lo antes posible, si aún no lo tiene. Explica algunas de estas cosas.

    
respondido por el gbulmer
3

De los comentarios:

te ves como si estuvieras atascado en un ISR USB esperando a que otro isr compele y al abortar quieres dejar ese ISR USB también. Para hacer eso, ponga una especie de "bloqueo de giro" en su ISR USB que también sea una marca para notificar eventos especiales como la cancelación. Con ese indicador, simplemente puede emitir una devolución o ir al final de su ISR para ignorar el siguiente paso (enviar los datos de vuelta a usb). La bandera es algo bueno, porque si es lo suficientemente global, su máquina de estado de "código ordinario" también estará al tanto del "resultado" de su ISR USB, es decir, una transferencia exitosa o una cancelación / falla.

    
respondido por el Mishyoshi

Lea otras preguntas en las etiquetas