Краем глаза видел разговоры про проблемы работы со стеком в gcc для avr. Но там возможно другая проблема - указатель стека лежит в паре байтовых регистров (SPH и SPL) и вычесть из указателя стека размер фрейма безопасно нельзя, надо запрещать прерывания. В IAR поступили иначе - реализовали 2 отдельных стека, аппаратный для вызовов и программный для переменных.