Цитата(juvf @ Dec 10 2010, 23:41)

Толи гдето в какойто другой обработчик ныряем, толи гдето в майне застреваем. Не могу понять где.
Как где? В этом же обработчике, например. У вас там вложенность прерываний допускается. Команда _EINT(); посередь функции имеется.
Цитата(juvf @ Dec 10 2010, 23:41)

Програvма большая, если что-то менять, то её всю с нуля нада переписывать.
Если вся программа написана так, как этот фрагмент, то лучше переписать ее по-новой, более тщательно продумав алгоритмы. Нельзя задерживаться в прерываниях для столь длительной обработки/расчета. Тем более, когда источников прерываний несколько. Максимальное время обработки любого прерывания не должно превышать периода вызова самого "быстрого" прерывания.
Цитата(juvf @ Dec 10 2010, 23:41)

По поводу второго вопроса: Если happy объявлен глобально так
volatile MyClass happy;
То при использовании её в потоке маин и в обработчике не нужно беспокоится о колизии при совместном доступе к happy? Там же оператор "=" вызывает копирующий конструктор, а это может быть тоже не лёгкая функция? Или компилятор сам запретит прерывания при вызове "="?
Про С++ не могу ничего прокомментировать, не владею им.

Квалификатор volatile ничего не гарантирует в части "параллельности" и не запрещает никаких прерываний. Он лишь указывает компилятору на то, что доступ к данной переменной не подлежит оптимизации, т.к. переменная может изменяться асинхронно по отношению к данной единице компиляции (функции или модулю). Если же вас интересует
атомарность доступа к переменной б
Ольшей разрядности, чем разрядность архитектуры МК или к группе переменных, то она (атомарность) обеспечивается другими ("ручными") способами. В т.ч. "ручным" запретом вызова того прерывания, в обработчике которого данная переменная (или группа переменных) может модифицироваться.