¿Cómo verificar el desbordamiento de pila en una aplicación incrustada?

7

Me he encontrado con un problema en el que creo que mi pila se está desbordando. La razón por la que me inclino a pensar de esta manera se debe a lo siguiente:

1) Compile el código, descargue en el dispositivo: - no hay actividad desde el dispositivo (estoy esperando un mensaje 'Estoy vivo')
2) En esta situación, aumenté el tamaño de la pila en 10 bytes, lo volví a compilar y volcó en el dispositivo y el problema desapareció.
3) Intenté los dos pasos anteriores 10 veces, adelante y atrás, y puedo reproducir el problema de manera confiable, y solucionarlo de manera confiable.

Quiero ver caer la pila, ¿cómo hago esto?

Actualmente estoy usando un microcontrolador M16, con 2K de RAM (quedan 30 bytes), 256 bytes de tamaño de pila. El IAR Workbench que estoy usando no tiene la utilidad de gráfico de llamadas.

¿Hay otras formas de hacer esto: verifique la pila que se está cayendo y cuánto en el código?

Cualquier ayuda será realmente apreciada.

¡Gracias!

    
pregunta IntelliChick

3 respuestas

7

Una forma común de verificar el uso de la memoria es rellenar previamente la memoria con un valor constante antes de que se ejecute el programa. por ejemplo, su código de inicio podría escribir una secuencia de 0xde 0xad en su área de pila. Durante la operación del programa, la pila crecerá y escribirá sobre estas secuencias. Si luego tiene la capacidad de examinar la memoria, entonces puede ver fácilmente los 0xde 0xad bytes intactos en la memoria y así determinar la cantidad de pila utilizada.

Por lo general, es difícil detectar un desbordamiento cuando se produce, ya que las direcciones de retorno de llamada de función se almacenan en la pila y cualquier retorno de función enviará el programa a la maleza. En este caso, si su watchdog está habilitado y puede establecer un punto de interrupción en el vector de reinicio, es posible que aún pueda examinar la memoria y buscar sus bytes de llenado previo para determinar si esto es lo que causó un reinicio.

    
respondido por el Austin Phillips
3

Crea una variable que se encuentra en la parte superior (o inferior) de tu pila. Inicializa la variable al principio de main. Puede verificar el valor de la variable en el bucle principal para ver después de que la pila se haya desbordado. O si su depurador lo permite, establezca un punto de interrupción cuando se escribe esa variable. Se debe escribir solo cuando se inicializa.

    
respondido por el Robert
0

Hay algunos programas que pueden hacer un análisis estático. Puede obtener cierta información usando Splint , ya que verifica si hay problemas al usar su código fuente. Creo que no comprueba los problemas de la pila, pero puede proporcionarle algunos puntos de vista sobre el problema.

    
respondido por el RMAAlmeida

Lea otras preguntas en las etiquetas