|
В AVR на аппартном уровне отсутствует поддержка вложенных прерываний. Делать ее программно очень рискованно, поскольку теряется сам смысл приоритетных прерываний. Вы получили запрос на прерывание от источника имеющего более высокий приоритет и тут же разрешаете прерывание от источников с меньшим уровнем. Какой смысл в этом? Более того, когда порядок нарушается поведение программы становиться гораздо менее предсказуемым. Про проблемы со стеком я уже и не говорю. Поэтому в случае AVR лучше всего не пользоваться вложенными прерываниями. Я сейчас осваиваю dsPIC, там имеется аппаратная поддержка вложенных прерываний. Но там система прерываний многоуровневая. А вообще, обычно рекомендуют делать программы обработки прерываний как можно короче.
Возвращаясь к пункту 1, в порядке уточнения. IAR для сохранения регистров использует специальный стек данных CSTACK. В качестве указателя стека используется Y-регистр (R29-R28). При входе в процедуру обработки прерывания сохраняются прежди всего SREG и все используемые в процедуре регистры. Это делается с помощью инструкций st -Y, Ri. Если внутри процедуры имеется обращение к другой функции, то сохраняются абсолютно ВСЕ регистры. Отсюда и повышенные требования к размеру стека данных. При выходе из прерывания идет восстановление содержимого регистра из стека с помощью инструкций ld Ri, Y+.
E-mail: info@telesys.ru