Cómo escribir la función ISR para la interrupción de hardware y software

0

Hasta ahora usé el ISR del Proveedor (Controlador) para manejar la Interrupción. Pero quiero saber cómo escribir el ISR. Sé de la tabla de vectores. Tomaremos un ejemplo simple para GPIO Interrupt para el puerto 0. que es tener la tabla de vectores P0INT_VECTOR (según la hoja de datos).

  
  1. Ahora cualquiera puede decirme cómo escribir una función ISR para esto.
  2.   
I have seen the vendor example, 




 #pragma vector = P0INT_VECTOR
    __interrupt void p0_ISR(void) 
      {
           /*Some statement*/
       }

por qué es #pragma, y cómo la función definida como p0_ISR, podemos cambiar el nombre de la función. ¿Cuál será el impacto de cambiar el nombre

No uso mucho la Interrupción de Software, pero sé algo básico, se usará mediante comandos INT.

  
  1. Cómo escribir software ISR.
  2.   
    
pregunta user2732944

2 respuestas

3

Los pragmas son una forma estandarizada de proporcionar información 'extra' a su compilador, sin embargo, el significado no se define fuera del contexto de ese compilador en particular. Por lo tanto, debe consultar el manual del compilador para saber exactamente qué está sucediendo. En este caso, le indica al compilador que rellene la entrada 13 de la tabla de vectores de interrupción (P0INT_VECTOR es una constante definida en un archivo de encabezado) para que apunte a la siguiente rutina.

__interrupt es una extensión de palabra clave que hace que el compilador emita código para hacer el contexto apropiado para guardar y restaurar una interrupción. De nuevo, vea el manual del compilador.

p0_ISR es un nombre arbitrario sin un significado específico para el compilador.

Escribiría un ISR para una interrupción de software igual que cualquier otra interrupción, si SWI fuera compatible con el hardware '51 (no creo que lo sea) - busque el nombre de la constante para la tabla de vectores.

Todo esto depende mucho del compilador y del procesador, por lo que las generalizaciones no son tan útiles. Si entiende la programación de ensamblajes para un procesador en particular, sabe qué información debe deslizar al compilador para que pueda emitir el código correcto.

Si el procesador es compatible con SWI, en realidad, invocar un SWI puede implicar una extensión de palabra clave o es posible que deba sumergirse en un ensamblaje en línea, etc.

    
respondido por el Spehro Pefhany
1

como ya se ha respondido, pragmas y __interrupt, etc. son todos muy específicos del compilador y, básicamente, no necesariamente portan. Por lo tanto, si desea abandonar la zona de pruebas, es posible que deba asumir el control por completo, lo que implica el ensamblaje (que a su vez no necesariamente se transfiere de un ensamblador a otro, pero tiene más control).

En general, debe consultar la documentación del procesador; en su caso, es probable que se trate de una dirección conocida donde el hardware busca la dirección del controlador. Los documentos del chip deben tener el conjunto de instrucciones y cómo regresar de una interrupción, posiblemente una instrucción específica. Una forma sencilla de administrarlo es hacer lo que los pragmas tendrían que hacer, pero con una envoltura, la dirección del manejador podría ser su código de ensamblaje, su código de ensamblaje guarda el estado suficiente para que pueda llamar a una función C de forma segura. una función C normal desde una perspectiva de lenguaje / pragma (es decir, no agregar ninguna), pero no hagas cosas en esa función que no puedes hacer en un controlador de interrupciones. Luego, al regresar de la función C, limpiar el estado y usar la instrucción de retorno de interrupción adecuada.

Más allá de eso, en algún momento, obviamente necesita configurar el periférico para causar una interrupción. En el manejador de interrupciones en general, pero algunos chips pueden atajar esto, debe averiguar quién causó la interrupción, que es la arquitectura o el chip o ambos específicos. Maneje esa interrupción y luego, a veces, tendrá que hacer un bucle en el manejador de interrupciones para asegurarse de que no haya más interrupciones pendientes que se produjeron durante la administración de la interrupción inicial. Y en algún momento debe despejar el estado, a menudo esto ocurre en más de un lugar, pero es específico de chip / archtecture. A menudo, desea comenzar lo más lejos posible en el periférico y abrirse camino hacia el procesador evitando generar una segunda / múltiples interrupciones falsas.

si tiene una interfaz de depuración, lo ideal es que usted pueda imprimir cosas para ver cosas, y si su hardware / lógica admite el sondeo además de causar interrupciones, la mejor manera de comenzar es provocar una interrupción en el extremo periférico del chip pero no habilita la interrupción en el extremo del procesador del chip (un extremo habilita la creación, el otro extremo inhabilita la escucha del remitente contra el receptor) luego sondea el extremo del procesador / receptor de esa interrupción para verlo afirmar, para luego investigar los otros registros de estado para ver si puede determinar mediante programación que era ese periférico, ver qué sucede en el extremo del procesador cuando se le pide al periférico que borre la interrupción, ¿se aclara completamente o hay más? capas (o fue un pulso de borde activado para empezar). Me saco mucho menos pelo de esta manera para obtener una interrupción / chip / sistema resuelto.

y cuando digo que el periférico y el procesador que podrían estar en el mismo chip o que el periférico podría estar en un chip diferente, no importa desde una perspectiva general. Dependiendo de la arquitectura, los chips, etc., puede haber varias o varias capas de interrupción que permiten que parte del árbol de interrupciones pase del periférico al procesador, por lo tanto, el sondeo para la configuración de la interrupción y el borrado. ENTONCES entras en tener un gestor de interrupciones, guardando correctamente el estado (no olvides las banderas) restaurando el estado y devolviendo las instrucciones.

    
respondido por el old_timer

Lea otras preguntas en las etiquetas