Цитата(shreck @ Jan 23 2007, 17:32)

Кстати, насчет пролога:
Цитата(dxp @ Jan 23 2007, 18:11)

На MSP430, кстати, очень маленький пролог - всего 4 регистра, т.ч. получается все достаточно неплохо...
как правило я это и наблюдаю, но были случаи когда сохранялись 7 регистров.
Под прологом имелся в виду набор scratch регистров, т.е. тех, которые не сохраняются при вызове функций. Если внутри ISR имеет место вызов невстраиваемой функции, то компилятор просто обязан сохранить эти регистры (сохраняемые регистры - local - буду сохранены внутри вызываемой функции). Вот этот набор у MSP430&IAR и составляет 4 регистра.
Разумеется, если код самого ISR требует многих регистров, то все необходимые будут сохранены. Хоть все 12.
Цитата(shreck @ Jan 23 2007, 17:32)

Да и еще вопросик. Если прерывание содержит оператор return где-нибудь в середине тела обработчика прерывания, например в инструкции if, то компилятор генерит предупреждение "Warning[Ta020]: Register SP updated while data is placed on the stack, code will probably not execute as expected
". Как бы, то есть, где бы правильно его подавить?
Если тело обработчика линейно- есть один опрератор return в конце- то предупреждения нет. По-видимому, предупреждение подавляется в коде ос (где-то я это видел).
Хм, подавить-то не вопрос: #pragma diag_suppress=Ta20. Но тут надо внимательно разобраться, что является причиной - неспроста ж он ругается. Само по себе выражение return никак не может быть причиной - там же используется враппер, значит при любом выходе будет вызван деструктор, который восстановит стек прерванного процесса и вызовет планировщик. И этот самый return реально будет внутри сгенеренного кода переадресован к общему выходу. В общем, тут советую проявить осторожность. Если это просто компилятор "не въехал в тему", то тогда да, безопасно просто подавить "глупое" предупреждение

. Лучше посмотреть по сгенеренному коду, что там реально меняется при добавлении этого выражения в середину ISR. На всякий случай.