реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как выйти из оработки прерывания по RET, без востановления бита I в SREG
kamedi_clab
сообщение Apr 17 2007, 19:52
Сообщение #1


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



Подскажите как кошерно выйти из функции оработки прерывания по RET
а не по RETI т.е. без востановления бита I в SREG ?
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 17 2007, 20:30
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



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

на C или на асме ?

если на асме то так и написать ret

а если на С то код в студию
и версию компилятора
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 17 2007, 20:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(singlskv @ Apr 17 2007, 20:30) *
на C или на асме ?

если на асме то так и написать ret

а если на С то код в студию
и версию компилятора


В Си можно сделать ассемблерную вставку.
Для Imagecraft так:
Код
if (ExitWitInterruptDisable()) asm("ret")
Go to the top of the page
 
+Quote Post
kamedi_clab
сообщение Apr 17 2007, 23:32
Сообщение #4


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



А из стека инфу востанавливать кто будет ?

Сообщение отредактировал kamedi_clab - Apr 17 2007, 23:36
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 17 2007, 23:42
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 17 2007, 23:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kamedi_clab @ Apr 17 2007, 19:52) *
Подскажите как кошерно выйти из функции оработки прерывания по RET

Вызывать ASM обработчик из которого вызывать (если надо )обычную "C" функцию а при выходе POP и RET. Любые другие фокусы сильно компиляторозависимы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 17 2007, 23:47
Сообщение #7


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(kamedi_clab @ Apr 18 2007, 00:32) *
А из стека инфу востанавливать кто будет ?

дык это,
код и версию компилятора напишите
тогда можно будет что-то придумать
иначе это гадание на кофейной гуще
Go to the top of the page
 
+Quote Post
kv_addr
сообщение Apr 18 2007, 04:56
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



С ассемблером все понятно, RET вместо RETI можно использовать без каких либо оговорок. А вот с Си получается значительно сложнее и, самое главное - некрасиво.

Как я понимаю, появилась необходимость по выходу из прерывания не разрешать определенное(ые) прерывание(ия) до какого-то события. На мой взгляд, в Си вполне легально это решается работой с битами разрешения/запрещения конкретных прерываний. Т.е. в подпрограмме обработки прерывания запещается(ются) конкретное(ые) прерывание(ия) и по выходу из нее оно(и) уже не работает(ют) до особого на то разрешения. А будучи вновь разрешенным(и) снова вызывает(ют) прерывание(я).

Конечно, это не так лаконично, как в ассемблере, зато вполне кошерно.
Go to the top of the page
 
+Quote Post
kamedi_clab
сообщение Apr 18 2007, 13:54
Сообщение #9


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



Не кошерно я делаю так. Компилю - смпотрю в листинге что она там перед RETI накалякал и тоже делаю как АСМ вставку в месте досрочного выхода но с RET.

Дык ведь теперь ассемблровать исправленый АСМ нужно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016