kamedi_clab
Apr 17 2007, 19:52
Подскажите как кошерно выйти из функции оработки прерывания по RET
а не по RETI т.е. без востановления бита I в SREG ?
singlskv
Apr 17 2007, 20:30
Цитата(kamedi_clab @ Apr 17 2007, 20:52)

Подскажите как кошерно выйти из функции оработки прерывания по RET
а не по RETI т.е. без востановления бита I в SREG ?
на C или на асме ?
если на асме то так и написать ret
а если на С то код в студию
и версию компилятора
_Артём_
Apr 17 2007, 20:38
Цитата(singlskv @ Apr 17 2007, 20:30)

на C или на асме ?
если на асме то так и написать ret
а если на С то код в студию
и версию компилятора
В Си можно сделать ассемблерную вставку.
Для Imagecraft так:
Код
if (ExitWitInterruptDisable()) asm("ret")
kamedi_clab
Apr 17 2007, 23:32
А из стека инфу востанавливать кто будет ?
Сергей Борщ
Apr 17 2007, 23:42
Цитата(_Артём_ @ Apr 17 2007, 19:38)

В Си можно сделать ассемблерную вставку.
И компилятор расположит восстановление всех сохраненных при входе в обработчик регистров после этой вставки. Падение программы после первого же прерывания обеспечено. На С самым "прямым" способом будет, наверное, написать "обертну" на асм из которой вызвать обработчик как обычную функцию.
zltigo
Apr 17 2007, 23:43
Цитата(kamedi_clab @ Apr 17 2007, 19:52)

Подскажите как кошерно выйти из функции оработки прерывания по RET
Вызывать ASM обработчик из которого вызывать (если надо )обычную "C" функцию а при выходе POP и RET. Любые другие фокусы сильно компиляторозависимы.
singlskv
Apr 17 2007, 23:47
Цитата(kamedi_clab @ Apr 18 2007, 00:32)

А из стека инфу востанавливать кто будет ?
дык это,
код и версию компилятора напишите
тогда можно будет что-то придумать
иначе это гадание на кофейной гуще
kv_addr
Apr 18 2007, 04:56
С ассемблером все понятно, RET вместо RETI можно использовать без каких либо оговорок. А вот с Си получается значительно сложнее и, самое главное - некрасиво.
Как я понимаю, появилась необходимость по выходу из прерывания не разрешать определенное(ые) прерывание(ия) до какого-то события. На мой взгляд, в Си вполне легально это решается работой с битами разрешения/запрещения конкретных прерываний. Т.е. в подпрограмме обработки прерывания запещается(ются) конкретное(ые) прерывание(ия) и по выходу из нее оно(и) уже не работает(ют) до особого на то разрешения. А будучи вновь разрешенным(и) снова вызывает(ют) прерывание(я).
Конечно, это не так лаконично, как в ассемблере, зато вполне кошерно.
kamedi_clab
Apr 18 2007, 13:54
Не кошерно я делаю так. Компилю - смпотрю в листинге что она там перед RETI накалякал и тоже делаю как АСМ вставку в месте досрочного выхода но с RET.
Дык ведь теперь ассемблровать исправленый АСМ нужно.