Цитата(Kibi @ May 20 2008, 13:29)

нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает, но на iar вернуться нельзя, в том то и проблема, если кто знает директивы компилятору, чтоб push/pop заменить на st/ld то они мне впринципе и нужны, памяти используется 96%, но опятьже из-за небольшой рекурсии есть залезание в стек локальными переменными, к сожаленю логику программы переделывать мне месяц не дадут, сократить объем памяти тоже нет возможности

Плохо проверяли.
1. Локальные переменные всегда располагаются в стеке если не помещаются в регистрах.
2. В IAR два стека, стек данных CSTACK, и стек возвратов RSTACK. И в IAR можно вручную задать их объем, т.о. память под стек заданного объема будет жестко резервирована и будет учитываться при подсчете занимаемой памяти.
3. В WinAVR есть один общий стек ничинающийся с RAMEND ничем не ограниченный снизу (память не резервируется и соответственно стек не учитывается при подсчете занятой памяти).
Вы должны сами заботиться о том чтобы стека хватало. Если у вас используется 96% памяти, то значит под стек у вас осталось всего 4%. Умножте количество памяти вашего МК на 0.04 и будет вам число в байтах отведенное под стек в вашей программе. Учтите что для входа в прерывание нужно хотя бы 35 байт RAM + память на вызовы функций + память под локальные переменные. Меньше 256 байт стека, я считаю кощунством.