MSP430 cómo hacer ISR configurables en un módulo (Code composer studio C)

2

Tengo una pregunta a la que creo que la respuesta es bastante simple. Pero no he podido encontrar una respuesta directa a.

Si tengo esta rutina de servicio en algún módulo foo.c

#pragma vector = SOME_VECTOR
interrupt void fooISR(){
    dosomething;
    IFG = 0;
}

si tengo en mi principal.

#include "foo.h"

Entonces, parece que fooISR() sí se carga en el SOME_VECTOR y el ISR se activará cada vez que se establezca el IFG correspondiente.

Quería preguntar si esta es la forma correcta de escribir módulos que utilicen interrupciones. Porque con este enfoque, el fooISR() estará en el SOME_VECTOR siempre que incluya foo.h, esto no permite mucha configuración para la persona que trabaja en main.

Por ejemplo, si en main.c quisiera acceder a alguna funcionalidad de foo.c pero quisiera escribir un ISR separado para SOME_VECTOR, no tendría suerte con este método, ¿no?

    
pregunta user2601592

2 respuestas

2

La preocupación que expresas en el último párrafo es correcta. No parece ser una buena idea agrupar un ISR con otra funcionalidad que quizás desee reutilizar por separado del ISR.

Normalmente hago una de las 3 cosas:

  • Coloque los ISR y main en el mismo archivo que main() . Los ISR son cortos, por lo que no saturan el main.c demasiado.
  • Coloque todos los ISR juntos en un módulo separado. Ninguna otra funcionalidad en ese módulo. No hay intención de hacer que este módulo ISR sea reutilizable.
  • Coloque cada ISR en su propio módulo. Ninguna otra funcionalidad en esos módulos.

Podría poner el ISR dentro de un bloque #ifdef , si tiene sentido en su situación particular.

    
respondido por el Nick Alexeev
3

En primer lugar, no tiene sentido discutir estas cosas a menos que tenga algún tipo de diseño de programa. Si tiene un programa simplista de menos de 1k LOC o algo así, entonces es posible que no necesite ningún diseño, podría ser suficiente simplemente para piratear sin rumbo.

Para programas más grandes y profesionales, necesitará el diseño del programa:

Debe colocar los ISR en el mismo archivo que el resto del controlador que controla esa pieza de hardware en particular, porque un ISR es parte del controlador de hardware . No deben estar en main (), no deben estar en algún archivo no relacionado.

No deberían estar en algún archivo "aquí están todos mis ISR" a menos que se vea obligado a agruparlos debido a restricciones de hardware o herramientas. Es posible que tenga que mantener la tabla de vectores en un archivo propio, a menos que su ubicación sea manejada por el enlazador.

main () no debe jugar con los ISR. Tendrá una capa de abstracción encima de los controladores y main llamará la capa de abstracción. Esto significa que no tendrá un acoplamiento estrecho entre el algoritmo y el hardware, y también que puede reemplazar fácilmente el controlador sin tener que volver a escribir todo el programa desde cero.

    
respondido por el Lundin

Lea otras preguntas en las etiquetas