¿Cómo depurar el restablecimiento causado por la violación de la clave de seguridad WDTCTL en MSP430F1611?

4

Estoy trabajando en un proyecto de sensores que utiliza TelosB basado en MSP430F1611 ejecutando TinyOS . Mi programa se reinicia algún tiempo después del arranque. Después del reinicio de la PUC, se encuentra IFG1 con el conjunto de bits WDTIFG, lo que indica que el temporizador de vigilancia inicia el reinicio. Esto puede suceder en dos casos:

1) Caducidad del temporizador de vigilancia solo en el modo de vigilancia. Pero el temporizador de vigilancia nunca se inicia, por lo que esto no puede suceder.

2) Violación de la clave de seguridad del temporizador de vigilancia. No hay un lugar en el que mi programa escriba WDTCTL explícitamente (es decir, 0x0120h). Por lo tanto, debe haber algún error de acceso a la memoria en mi código, que escribe WDTCTL ilegalmente y provoca una violación de la clave de seguridad.

¿Hay alguna herramienta de depuración para ayudar a localizar dónde ocurre esto? ¿O alguna sugerencia sobre cómo debo proceder para localizar el error? Mi programa es de miles de líneas, por lo que la verificación manual no es trivial.

    
pregunta sinoTrinity

2 respuestas

6

Si el problema es repetible, será de gran ayuda. El proceso de depuración se puede abordar si tiene un par de herramientas de desarrollo integradas clave disponibles. Estas herramientas incluirían un osciloscopio digital y dos pines GPIO de repuesto en su procesador. A falta de dos pines de repuesto, a menudo es posible volver a implementar temporalmente dos pines en uso para el ejercicio de depuración.

El método de depuración es uno de dividir y conquistar para descubrir qué secciones de su código están en uso cuando ocurre el reinicio errante. El primer paso consiste en agregar código en su rutina de inicio que establece uno de los pines de repuesto como salida y a un nivel lógico que luego volverá a su configuración predeterminada cuando la MCU vuelva a restablecerse. Este GPIO se utilizará como un activador para su alcance digital, de modo que se usará el "modo de finalización de disparo". Es posible que ya tenga una E / S en su sistema que pueda servir como este evento desencadenante. En algunos casos, el reinicio de WDT también puede aparecer directamente visible en el pin de reinicio de MCU. Si cualquiera de estos últimos casos se aplica, puede usar eso en lugar de tener que agregar el uso de este primer pin GPIO.

El siguiente paso es configurar el otro pin de GPIO de repuesto como una salida y luego establecerlo en su nivel no predeterminado seguido de volver a establecerlo en el otro estado dentro de una rama específica de su código de programa. El método común para la mayoría de las MCU es que los pines GPIO están predeterminados en las entradas después del restablecimiento, por lo que se instala un pullup externo para mantener el pin alto mientras aún es una entrada. Su código de prueba luego establecerá el pin como una salida a bajo y luego, un tiempo después, en la rama del código, establecerá la salida en un nivel alto.

Vuelva a compilar, vincular y cargar la versión de prueba del código. Ahora pones el alcance para "finalizar el activador" en la aparición del primer GPIO mencionado, lo que indicará que se ha producido el reinicio erróneo de WDT. Tenga el otro GPIO en un segundo canal del osciloscopio. Luego, inicie su sistema y espere hasta que ocurra el reinicio errante Si observa que este segundo GPIO se establece en nivel bajo y alto antes del evento desencadenante, sabrá que el evento WDT no ocurrió dentro de la rama de código en la que agregó la señal de protocolo de enlace. Por otro lado, si este segundo GPIO vuelve a su estado predeterminado junto con el restablecimiento de WDT, entonces sabrá que el código de culpabilidad está en algún lugar entre los dos lugares en el código donde estableció y borró la señal del protocolo de enlace. (Tenga en cuenta que si no ve el segundo saludo de GPIO en el alcance, entonces sabe que nunca se ingresó una rama de código en particular y, por lo tanto, probablemente no sea la región culpable del código) .

Al evaluar las trazas de alcance, tenga en cuenta que el restablecimiento de WDT se producirá algún tiempo antes de que se active el activador de alcance debido a que usted configuró el GPIO de activación de alcance en la ejecución del código justo después de que el código haya reiniciado. Deberá evaluar la cantidad de demora que hay aquí en su MCU y en su sistema para poder juzgar con precisión si el segundo GPIO de señalización se despeja al reiniciarse WDT o antes. Las carreras de práctica pueden ayudar a afinar la técnica.

El proceso de investigación ahora implica mover la configuración y borrar el segundo protocolo de enlace GPIO en varias partes de su ruta de ejecución de código para tratar de aislar las partes específicas del código que están involucradas con el problema. Si encuentra una rama que es sospechosa, puede entonces reducir el área de enfoque ... es decir. "divide y vencerás".

Una cosa muy buena sobre esta técnica es que la configuración y la eliminación de la señalización GPIO toma muy poco tiempo de ejecución en el procesador y, por lo tanto, no tiene un impacto serio en el rendimiento en tiempo real del código de tiempo crítico. Hay otras técnicas de depuración disponibles, pero en general todas implican una sobrecarga de ejecución mucho mayor que la técnica descrita.

    
respondido por el Michael Karas
2

De hecho, este es uno de los desafíos de la programación integrada. Veo varias opciones para tratar de reducir el problema:

1) Use JTAG conectado al TelosB y ponga un punto de interrupción en un acceso al temporizador Watchdog. Esperamos que en algún momento se manifieste, se rompa y usted pueda verlo.

2) use el FLASH (ya sea información u otro flash) para registrar el estado de las operaciones para lo que está haciendo con una marca de tiempo y otra información útil. Luego puede conectarse utilizando JTAG (tenga cuidado de no borrar el Flash), extraiga los datos y mírelos. Tal vez incluso almacenar información de rastreo rudimentaria que pueda ser útil.

    
respondido por el Gustavo Litovsky

Lea otras preguntas en las etiquetas