[an error occurred while processing this directive]
|
Такое дело...
Есть регистр, в котором маскируются прерывания. Самый старший бит у него (15-й), если сброшен, маскирует ВСЕ прерывания. Т.е. если Вы работаете с таймером, то комбинация 0x8040 означает, что прерываться можно только от таймера: 15-й бит говорит, что нет общего маскирования, а бит шесть говорит, что разрешено прерываться от таймера.
Есть и бит 14. В нем при прерывании сохраняется бит 15. Т.е. при прерывании, бит 15 очищается (запрет на прерывания), но его копия попадает в 14 бит. Типа простейший стек. При команде reti 14 бит копируется в 15.
И вот я обнаруживаю (мама!), что прямо в прерывании, прямо в самом начале вектора, в регистре находится число 0х0004 !!!
Т.е. в 14-й регистр скопировалося 0!!!!!
Т.е. при этом прерывании, ВСЕ прерывания были ЗАПРЕЩЕНЫ!!!!!
Начал копать... Оказалось, что в критической секции я использую запрет на прерывания типа
bitc %imask, 15
И когда прерывание накладывается на эту команду (редко, но бывает такое) у меня выполняется и комада, и с этого же места процессор уходит на вектор с ОЩИЩЕННЫМ 15-м битом...
Типа я в растеренности... Может все-таки это симулятор глючит или теоретически такое возможно?
E-mail: info@telesys.ru