Tengo una pregunta 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 main.
#include "foo.h"
Entonces parece que fooISR()
sí se carga en 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 utilizan interrupciones. Debido a que con este enfoque, fooISR()
estará en SOME_VECTOR cada vez que incluya foo.h, esto realmente no permite mucha configuración para la persona que trabaja en main.
Por ejemplo, si main.c
quisiera acceder a alguna funcionalidad de foo.c pero quisiera escribir un ISR separado para ALGUNOS_VECTORES, no tendría suerte con este método, ¿verdad?
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.
Yo suelo hacer una de las 3 cosas:
main()
. Los ISR son cortos, por lo que no abarrotan main.c
demasiado.Podría poner el ISR dentro de un #ifdef
bloque, si tiene sentido en su situación particular.
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 más o menos, entonces es posible que no necesite ningún diseño, podría ser suficiente para piratear sin rumbo fijo.
Para programas profesionales más grandes, 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 deberían estar en main(), no deberían 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. Sin embargo, es posible que deba mantener la tabla de vectores en un archivo propio, a menos que el enlazador controle su ubicación.
main() no debería jugar con los ISR. Tendrá una capa de abstracción encima de los controladores y main llamará a 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.
Andrejs Gasilovs
Lundin
usuario2601592