Цитата(777777 @ Aug 12 2010, 11:54)

Да, есть такое. Этот ISR в самом начале вставляет sei. Это лучше, чем вставлять его после сохранения регистров...
Это не только лучше, но и хуже т.к. в компиляторе похоже бага по части ISR_NOBLOCK:(.
Он поступает ровно так как Вы и сказали - тупо ставит sei в самом начале обработчика.
А если у вас в обработчике есть стековые переменные - всё может пойти в тар-тарары..
Т.к. он модифицирует указатель стека не в критической секции (забыв что прерывания уже разрешены)
Код
280 0116 DEBF out __SP_H__,r29
282 011a CDBF out __SP_L__,r28
а должен бы так:
Код
278 0112 0FB6 in __tmp_reg__,__SREG__
279 0114 F894 cli
280 0116 DEBF out __SP_H__,r29
281 0118 0FBE out __SREG__,__tmp_reg__
282 011a CDBF out __SP_L__,r28
Для решения сей баги есть стандартный ход:
Код
ISR(MY_ISR)
{
sei();
code....
cli();
}
Цитата(Блин. Побрился клоками :( @ Aug 12 2010, 23:29)

Вообщем так, молодёжь!
Объясняю на пальцах.
При возникновении разрешённого прерывания сбрасывается влаг глобального разрешения прерываний в SREG и осуществляется переход на процедуру
обработки прерывания по соответствующему вектору.
Если в обработчике прерываний "вручную" установить флаг глобального разрешения прерываний в SREG, то возможно получить вложенные прерывания.
Согласен.
Цитата
Причём более "низко" приоритетное может прервать более "высоко" приоритетное прерывание.
Не согласен.
Все остальные разрешённые прерывания могут прервать выполнение текущей ISR с вручную установленным флагом I внутри этой ISR.