Como determinar o uso máximo da pilha no sistema incorporado com o gc

Estou escrevendo o código de inicialização para um sistema incorporado - o código que carrega o ponteiro inicial da pilha antes de passar para a função main () - e preciso informar quantos bytes de pilha meu aplicativo usará (ou alguns estimativa conservadora maior

Disseram-me que o compilador gcc agora possui as opções -fstack-use e -fcallgraph-info que de alguma forma podem ser usadas para calcular estaticamente o "Uso Máximo da Pilha" exato para mim. "Análise de requisitos de pilha em tempo de compilação com o GCC" de Botcazou, Comar e Hainque

Nigel Jones diz que a recursão é uma péssima idéia em sistemas embarcados ("Computando o tamanho da pilha" 2009), por isso tomei cuidado para não fazer nenhuma função recursiva mutuamente neste código.

Além disso, garanto que nenhum dos meus manipuladores de interrupção reative as interrupções até a instrução final de retorno-a-interrupção, para que não precise me preocupar com os manipuladores de interrupção reentrant

Sem manipuladores de interrupção de recursão ou reentrada, deve ser possível determinar estaticamente o uso máximo da pilha. (E, portanto, a maioria das respostas paraComo determinar o uso máximo da pilha? não se aplica). Meu entendimento é que eu (ou, de preferência, um pouco de código no meu PC que é executado automaticamente toda vez que reconstruo o executável), primeiro encontro a profundidade máxima da pilha para cada manipulador de interrupções quando não é interrompida por uma interrupção de prioridade mais alta e a máxima profundidade da pilha da função main () quando não é interrompida. Depois, adiciono todos eles para encontrar a profundidade máxima total da pilha (no pior caso). Isso ocorre (no meu sistema incorporado) quando a tarefa em segundo plano principal () está em sua profundidade máxima quando é interrompida pela interrupção de menor prioridade e essa interrupção está em sua profundidade máxima quando é interrompida pela próxima prioridade de menor prioridade interromper e assim por diante.

Estou usando o YAGARTO com o gcc 4.6.0 para compilar o código do LM3S1968 ARM Cortex-M

Então, como uso as opções -fstack-use e -fcallgraph-info com o gcc para calcular a profundidade máxima da pilha? Ou existe uma abordagem melhor para determinar o uso máximo da pilha?

(VejoComo determinar o uso máximo da pilha no sistema incorporad para quase a mesma pergunta direcionada ao compilador Keil.)

questionAnswers(5)

yourAnswerToTheQuestion