[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Сначала выполняется странное действо через стек по сбросу бита 6 регистра статуса, который всегда имеет значение 0 . Затем на стек сбрасываются охрениард виртуальных регистров и ни один в обработчике не используется.[/uquote]
Видимо у Вас в коде ISR все эти регистры используются. Или где-то в ISR есть вызов функции, который невозможно заинлайнить. А значит - компилятор, согласно соглашениям вызова, должен сохранить все регистры, которые не сохраняются
вызываемой функцией (scratch registers). Что он и делает.
И любой компилятор, следующий аналогичным соглашениям вызова, должен так делать. Хоть IAR, хоть GCC - он тут не виноват.
Чтобы избавиться от этого (если это из-за функции) дайте возможность заинлайнить функцию компилятору. Или вообще от неё избавьтесь.
Если в IAR-е есть возможность компиляции всего проекта как единого файла, то так тоже можно сделать: так компилятор должен заинлайнить даже функцию, находящуюся в другом си-файле (не помню только - есть такой ключ в IAR for STM8 или нет?).
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Я знаю что для GNU AVR есть макрос который создает обработчик без сохранения регистров, есть ли в IAR такая возможность?[/uquote]
А при чём тут AVR? Тема вроде про STM8...
Можно сделать ISR без сохранения регистров (на асме), только это приведёт к потенциальным багам из-за порчи регистров в прерывании.
Добавлено after 3 minutes 54 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Я кроме вот этого ничего не нашел, может опять в книге вижу фигу?[/uquote]
Всё есть в мануале. Раздел называется "Calling convention".