Цитата(zombi @ Sep 19 2011, 00:48)

...
Т.е. для выхода из обработчика прерывания не достаточно одной команды RETI ? надо еще и SEI перед ним лепить?
Шо то слабо верится в такой баг

Добрый день.
В обычном обработчике прерываний ничего, кроме RETI лепить не нужно.
Вы, видимо, невнимательно читали мой пост. В моём случае такая комбинация необходима для XMeg-и потому, что обработчк прерываний - менеджер задач, он переключает задачи и соответсвенно их контексты, а это значит, что он все системно-критичные объекты сохраняет-восстанавливает для каждой задачи: стек, регистр флагов, набор регистров общего назначения. Таким образом при восстановлении регистра флагов бит I оказывался сброшенным. В обычной меге при входе в прерывание I-бит сбрасывается а при выходе из прерывания достаточно было RETI - там она железно подымала I. Прикол в том, что в XMeg-е при входе в прерывание I-бит не сбрасывается, а блокируется только ЭТОТ уровень прерываний, а прерывания более высокого уровня приоритета могут прервать текущий (согласно даташиту).
Такая схема сделана для работы многоуровневой системы прерываний, потому что если будет сброшен I-бит, то ВООБЩЕ НИКАКИЕ прерывания не сработают.
Команда RETI завязана на PMIC, она просто сообщает контроллеру, что данный уровень приоритетов освободился. Интересно, что в обычном режиме - не из прерывания - RETI всё таки подымает I-бит

.
Информация для тех - кто играет на мегах и иск-мегах на асме виртуозно, с применением фигур высшего пилотажа. На си там вабще всё компилер разруливает.
И ещё - для того что бы читать/писать указатель стека НЕ НУЖНО атомарная операция (в терминах её трактовки для AVR), но прерывания должны быть запрещены, - иначе - "УПС..."
[quote name='V_G' date='Sep 20 2011, 11:17' post='974064']
Написали же, xmegа в прерываниях не сбрасывает флаг I, и рецепт "добавил команду SEI перед RETI" не есть правильный. Случайно заработало, в следующий раз при аналогичной проблеме не заработает. Ни в mege, ни в xmege не стоит лишний раз дергать флаг I, тем более в прерываниях.
У xmegи вообще трехуровневая система прерываний, и надо очень грамотно расставлять их изначальные приоритеты, не дергая I.
Случайностей в процессоре не бывает.
Приоритеты все грамотно расставлены, поверьте.
А откуда такая боязнь дёргать I-бит? даже в прерываниях?
Прерывание - обычная процедура, просто она вызывается асинхронно по отношению к основной нити программы, реагируя на событие в нужный момент. В обычных мегах, где не было приоритетов, для эмуляции многоуровневой системы прерываний в обработчике я ставил sei, давая возможность более приоритеным событиям прервать текущий уровень.
Я использую архитектуру построения программы клиент-сервер, с системой событий. Прерывания у меня выставляют флаги - далее основной цикл по мере возможностей разгребает события (аналогичноый подход у V_G). Но иногда бывают события, никак не позволяющие отлагательств - например обработка КЗ в IGBT-транзисторе. Здесь и спасает "дёргание I-бита".