Пишу проект на IAR for AVR.
Возникло желание посмотреть, какой код формирует компилятор для прерываний. Оказалось, что в начале процедуры прерывания сохраняется в data-stack, а конце - восстанавливается 15 регистров общего назначения, хотя вызываемые из прерывания функции не требуют такого количества регистров. Я сначала подумал, что всё дело в том, что вызываемая из прерывания функция находится в другом модуле проекта, перенёс её в тот же модуль, где находится процедура прерывания, но отличий не увидел. Такое же ненужное сохранение множества регистров.
Разумное сохранение регистров я увидел только тогда, когда компилятор включил текст вызываемой функции в процедуру прерывания (inline). Если по какой-то причине inline функции не получается, снова бессмысленное сохранение регистров.
Чтобы не быть голословным, привожу код:
Код
#include <ioavr.h>
#pragma optimize=no_inline
void DoNothing()
{
}
#pragma vector = TIMER1_COMPA_vect
__interrupt void ext_int0_isr_routine(void)
{
DoNothing();
}
int main( void )
{
return 0;
}
#pragma optimize=no_inline
void DoNothing()
{
}
#pragma vector = TIMER1_COMPA_vect
__interrupt void ext_int0_isr_routine(void)
{
DoNothing();
}
int main( void )
{
return 0;
}
Оптимизация стоит максимальная по скорости.
Подскажите, как этого можно избежать? Очень хотелось бы из прерывания вызывать функции, в т.ч. из других модулей, и иметь при этом оптимальный код.