Кто нибудь делал отдельный стек для прерываний? есть ли смысл? код думаю писать как то так,
Код
handler:
sts stack-0, r16
sts stack-1, r17
in r16, __SP_L_
in r17, __SP_H_
sts stack-2, r16
sts stack-3, r17
ldi r16, lo8(stack-4)
ldi r17, hi8(stack-4)
out __SP_L__, r16
out __SP_H__, r17
//здесь код обработчика прерывания
// востановление писать лень ) тут все понятно
reti_
Не слишком ли будет тяжеловесно? хотя это не главный вопрос, основная сложность с компилятором (GCC) как его заставить генерировать обработчтки в таком виде? можно __attribute__ ((__naked__)) но тогда надо как то следить за тем какие регистры были использованы, не сохранять же все. Похоже надо начинать смотреть исходники GCC.
Правка: push/pop и st/ld длятся все по 2 такта, можно просто заменить все push на sts с фиксированными адресами ... потерь в скорости не будет.
Сообщение отредактировал amaora - Jul 26 2009, 21:17