There is no trivial way to do that, since each function may or may not save some registers and create local temporary variables [1] on the stack, besides the actual parameters and local variables. You would also have to figure out what functions call which functions (which there is code that does), and then figure out which of all the various trees that you could come up with uses the most stack.
[1] The compiler can create temporary variables to hold the result of some calculation if there isn't a sufficient number of registers available at the time, or if it needs to convert a variable into a different type (e.g. float -> integer, integer -> float).
You would possibly have more luck with examining the first few bytes of the instruction code to determine how much the stack is reduced by in the start of the function. This combined with an understanding of the call-graph of the application would enable you too determine the stack usage.
Note also that in an embedded system, you may have interrupt handlers that run asynchronously to the rest of the code, and thus use up stack "anywhere", so you would need to reserve space for the interrupt handlers on top of whatever your application uses.
--
Mats