Цитата(Dmitro25 @ Mar 31 2010, 13:47)

Вот это мне и непонятно. Зачем?
Как раз понятное и объяснимое поведение. По-другому просто и быть не может. У IAR есть соглашения о вызовах функций в части распределения регистров. Все регистры в этом контексте делятся на две группы: local и scratch. Регистры группы scratch могут использоваться внутри любой функции без сохранения, регистры из группы local, если компилятор "хочет" использовать этот регистр, он должен его значение сначала сохранить, перед выходом восстановить. Этим достигается целостность данных при вызове подпрограмм (функций).
При обычной работе программы комплятор перед вызовом функции не хранит в scratch регистрах ничего ценного - вызываемая функция их будет использовать без сохранения, компилятор об этом "знает" и все ценное хранит в local регистрах и в стеке. Теперь представьте, что вызвался обработчик прерываний (ISR). Как вы знаете, внутри ISR абсолютно все регистры, которые компилятор использует, он обязан сохранить/восстановить - это происходит в силу того, что ISR вызывается асинхронно по отношению к выполнению основной программы, что означает, что при входе в ISR компилятор ничего не знает о состоянии контекста прерванной программы (состоянии регистров в частности - может там все было прервано в момент сохранения значений local регистров и или данных из scratch регистров в стек). И компилятор, видя код, решает сколько ему надо регистров, их он и сохраняет/восстанавливает.
Теперь представьте, что внутри ISR вызывается функция. Если компилятор видит ее код (функция встраиваемая), то ситуация сводится к вышеописанной. А если функция невстраиваемая, то компилятор просто не знает, какие из scratch регистров могут внутри нее использоваться, поэтому он просто обязан сохранить их все во избежание нарушения целостности данных и неправильной работы программы.
Поэтому либо не вызывайте функции из ISR, либо делайте их гарантировано встраиваемыми. Для этого есть хорошая прагма #pragma inline=forced.
У AVR, насколько помню, к scratch регистрам относятся r16-r25, r30-r31 и r0-r4. Вот они и должны сохраняться всегда.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков