¿Cómo determinar el uso máximo de la pila en un sistema integrado con gcc?

Estoy escribiendo el código de inicio para un sistema incrustado, el código que carga el puntero de la pila inicial antes de saltar a la función main (), y necesito decirle cuántos bytes de pila usará mi aplicación (o algunos estimación conservadora más grande).

Me han dicho que el compilador gcc ahora tiene una opción -fstack-use y -fcallgraph-info que de alguna manera se puede usar para calcular estáticamente el "Uso máximo de pila" exacto para mí. "Análisis de requisitos de pila en tiempo de compilación con GCC" por Botcazou, Comar y Hainque).

Nigel Jones dice que la recursión es una muy mala idea en los sistemas embebidos ("Calculando el tamaño de su pila" 2009), por lo que he tenido cuidado de no realizar ninguna función recursiva en este código.

Además, me aseguro de que ninguno de mis controladores de interrupciones vuelva a habilitar las interrupciones hasta su última instrucción de retorno de interrupción, por lo que no tengo que preocuparme por los controladores de interrupciones reentrantes.

Sin manejadores de interrupciones recurrentes o reentrantes, debería ser posible determinar estáticamente el uso máximo de la pila. (Y así, la mayoría de las respuestas a ¿Cómo determinar el uso máximo de la pila? no apliques). Entiendo que yo (o preferiblemente, un poco de código en mi PC que se ejecuta automáticamente cada vez que reconstruyo el ejecutable) primero encuentro la profundidad máxima de la pila para cada controlador de interrupciones cuando no es interrumpido por una interrupción de mayor prioridad, y el máximo profundidad de la pila de la función main () cuando no se interrumpe. Luego los sumo a todos para encontrar la profundidad máxima de la pila total (el peor de los casos). Eso ocurre (en mi sistema embebido) cuando la tarea de fondo main () está en su profundidad máxima cuando es interrumpida por la interrupción de prioridad más baja, y esa interrupción está en su profundidad máxima cuando es interrumpida por la siguiente prioridad más baja interrumpir, y así sucesivamente.

Estoy usando YAGARTO con gcc 4.6.0 para compilar código para el LM3S1968 ARM Cortex-M3.

Entonces, ¿cómo uso la opción -fstack-use y la opción -fcallgraph-info con gcc para calcular la profundidad máxima de la pila? ¿O hay algún enfoque mejor para determinar el uso máximo de la pila?

(Ver ¿Cómo determinar el uso máximo de la pila en el sistema integrado? para casi la misma pregunta dirigida al compilador Keil.)

Respuestas a la pregunta(5)

Su respuesta a la pregunta