Métodos de prueba de interrupciones

-1

Estoy manteniendo y desarrollando software en C para microcontroladores S12X. El ISR para cada interrupción (como I2C, temporizador, etc.) es muy largo, como de 20 a 30 líneas con varios cálculos dentro del ISR para varias interrupciones.

Por lo que he leído, el ISR debe ser lo más corto posible. Estoy en lo correcto en esto? En este momento me enfrento a varios problemas relacionados, como el reinicio del controlador en momentos aleatorios. Todavía estoy descubriendo la razón.

Ahora mi pregunta principal es ¿qué procedimiento básico debo seguir para probar interrupciones? Quiero hacer una prueba controlada, como cuando envío una interrupción, luego, cuando se está ejecutando, quiero enviar otra interrupción y ver si se está ejecutando correctamente, y otros factores importantes. El código también está en una etapa avanzada; ¿Debo arriesgarme a modificar completamente las interrupciones?

Una sugerencia que quiero específicamente es en caso de que no vaya a realizar una modificación completa de los ISR, ya sea seguro deshabilitar las interrupciones tan pronto como ingrese un ISR, y habilitar las interrupciones al salir de todas las interrupciones.

    
pregunta rajesh

2 respuestas

3

En general, mantener las interrupciones cortas es una buena idea. Qué tan rígidamente necesita seguir este consejo, obviamente, depende de lo que está tratando de hacer, y no lo sabemos. Una buena ingeniería implica saber cuándo es seguro dejar tus pautas.

¿Depurando? En este nivel, lo que sea que te ayude a ver lo que está pasando. Desde su descripción muy concisa, encender un GPIO cuando ingresa una interrupción y volverlo a desactivar cuando salga, usando un bit diferente para cada interrupción, al menos le dará algo que puede ver en un ámbito que podría darle una idea de lo siguiente. Su tiempo e interrupciones de ocurrencias. Si tiene un tiempo máximo que debe tomar la interrupción, un alcance con herramientas avanzadas de disparo digital puede ayudarlo a disparar en los pulsos anchos.

El cambio de bits es una herramienta muy común para la depuración en este nivel. ¿Es suficiente? Muy difícil de decir. El uso de depuradores de hardware y comandos paso a paso también puede ayudar, pero su tiempo obviamente será todo mejorado.

¿Debes jugar con el código de interrupción? Bueno, qué valor tiene su código actual que no funciona. Si no es lo suficientemente bueno, y necesitas jugar con cosas para solucionarlo, realmente no tienes otra opción. Esto no debería intimidarlo si utiliza un buen sistema de control de versiones para restaurar si lo necesita.

    
respondido por el Scott Seidman
0

Agregar al punto anterior una buena manera de lidiar con las interrupciones dentro del ISR es que solo establece una variable dentro de la interrupción y borra los indicadores de registro de estado de interrupción. Y, en general, simplemente verificas continuamente si esta variable está configurada o no. Si está configurado, reinícielo primero y haga lo que esté a punto de hacer en la subrutina de interrupción aquí dentro de main. Recuerde que esta variable debe ser global para que tanto el ISR como la función principal o cualquier otra función puedan acceder a ella. Por lo tanto, tenga valores diferenciales para diferentes interrupciones y puede manejar las cosas en la función principal en lugar de en el ISR. Intente imprimir datos pequeños como un solo carácter para su referencia y evite hacer largos printf's.

    
respondido por el Bhuvanesh Narayanan

Lea otras preguntas en las etiquetas