1. Задать генерацию листинга в опциях компилятора http://mb9x.ginps.com/fujitsu/calc_stk/index.html
2. В листинге смотреть раздел "Maximum stack usage in bytes":
Например:
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
OS::SystemTimer_ISR() 11 2
CSTACK - это стек для локальных переменных функции,
RSTACK - это стек для хранения адресов возврата.
Если функция не вызывает другие, то для нее, конечно, RSTACK равен 2. При вызове функции любым способом (RCALL, ICALL..) к начальным 2 байтам нужно прибавить еще 2.
3. Вручную составить ветку вызовов функций, на которой находится printf. "Накапливая" стеки на каждом вызове (см. потребление стеков для каждой функции на пути вызовов), определить максимальное потребление стека. При расчетах не забывать о неявных вызовах функций (ICALL).
К полученным значениям потребных размеров стеков следует прибавить расходы стеков на ISR (как без них). Если у вас есть вложенные прерывания, то нужно учитывать и это.
Положение могла бы облегчить утилита командной строки, которая выдирала бы информацию о стеках и вызовах функций из lst-файлов проекта и сама искала бы путь с максимальным потреблением стеков.
Прецедент есть - Сергей Пинигин написал такую для фуджиков calc_stk.exe. Что должна уметь любая подобная программа - по ссылке.
Насколько мне известно, для AVR не существует подобной программы. Рад ошибиться :)